Невозможно использовать ForEach-Object -Parallel в каталоге с именем, содержащим [

Использование командлета ForEach-Object -Parallel в каталоге с именем, содержащим "[", вернет исключение 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 значений.

Есть ли способ решить эту проблему без переименования каталогов?


person user13380063    schedule 22.04.2020    source источник
comment
Хорошая находка, это, безусловно, ошибка (кто-то забыл передать где-то значение true, чтобы буквально интерпретировать текущий путь)   -  person Mathias R. Jessen    schedule 22.04.2020
comment
Start-threadjob иногда выдает ошибки, иногда запускается, но не выводит данные.   -  person js2010    schedule 22.04.2020
comment
Обнаружена проблема   -  person Mathias R. Jessen    schedule 22.04.2020
comment
Я бы порекомендовал переименовать эти папки в любом случае, если вы собираетесь использовать много Powershell.   -  person js2010    schedule 25.04.2020
comment
Спасибо, дождусь v7.1.   -  person user13380063    schedule 27.04.2020


Ответы (1)


Как упоминалось в комментариях, это ошибка.

ForEach-Object -Parallel работает, передавая выполнение блока сценария нескольким фоновым областям выполнения через нечто, называемое TaskPool.

Чтобы имитировать среду вызывающих абонентов, PowerShell настраивает фоновые пространства выполнения так, чтобы они напоминали пространство выполнения по умолчанию, включая настройку текущей партии поставщиков для всех вызывающих.

К сожалению, внутренний API для настройки текущего местоположения по умолчанию расширяет подстановочные знаки, что эквивалентно настройке по умолчанию:

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

вместо того

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

Теперь это исправлено (как для ForEach-Object -Parallel, так и для _ 6_), ожидайте, что оба будут поставляться с версией 7.1 позже в этом году.

person Mathias R. Jessen    schedule 18.05.2020