【问题标题】:Unable to use the "ForEach-Object -Parallel" in a directory with a name containing "["无法在名称包含“[”的目录中使用“ForEach-Object -Parallel”
【发布时间】:2020-04-22 16:12:42
【问题描述】:

在名称包含“[”的目录中使用 ForEach-Object -Parallel cmdlet 将返回 WildcardPatternException。去掉-Parallel,运行成功。

我创建了几个目录并运行了以下命令。
1..5 | ForEach-Object -Parallel {Write-Host $_}
每个运行目录的返回差异如下。

PS D:\[example> 1..5 | ForEach-Object -Parallel {Write-Host $_}

WildcardPatternException 将被返回。

PS D:\[]example> 1..5 | ForEach-Object -Parallel {Write-Host $_}
PS D:\[ex]ample> 1..5 | ForEach-Object -Parallel {Write-Host $_}

ItemNotFoundException 将被返回。

PS D:\[e]xample> 1..5 | ForEach-Object -Parallel {Write-Host $_}
PS D:\]example> 1..5 | ForEach-Object -Parallel {Write-Host $_}

运行成功,返回5个值。

有没有办法在不重命名目录的情况下解决这个问题?

【问题讨论】:

  • 很好的发现,这肯定是一个错误(有人忘记在某处传递 true 值以从字面上解释当前路径)
  • Start-threadjob 有时会出错,有时会运行但没有输出。
  • 找到the issue
  • 如果您要使用大量的 powershell,我建议您重命名这些文件夹。
  • 谢谢,我等v7.1。

标签: powershell powershell-core powershell-7.0


【解决方案1】:

正如 cmets 中提到的,这是一个错误。

ForEach-Object -Parallel 通过称为TaskPool 的东西将脚本块的执行卸载到多个后台运行空间。

为了模拟调用者环境,PowerShell 将后台运行空间配置为类似于默认运行空间,包括将当前提供程序的lotation 设置为调用者是什么。

很遗憾,设置当前位置的内部API默认为扩展通配符,相当于默认为:

Set-Location -Path 'D:\[]example'

而不是

Set-Location -LiteralPath 'D:\[]example'

现在已经修复(ForEach-Object -ParallelStart-PSThreadJob),预计今年晚些时候都将发布 7.1 版

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 2015-06-03
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多