3

在名称包含“[”的目录中使用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个值。

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

4

1 回答 1

2

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

ForEach-Object -Parallel通过将脚本块的执行卸载到多个后台运行空间来工作TaskPool

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

不幸的是,用于设置当前位置的内部 API 默认为扩展通配符,相当于默认为:

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

代替

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

现在已经修补(适用于ForEach-Object -ParallelStart-PSThreadJob),预计两者都将在今年晚些时候随版本 7.1 一起发布

于 2020-05-18T15:57:51.113 回答