По какой-то причине псевдоним% для ForEach-Object выдает исключение при использовании синтаксиса ($ Thing in $ Things), в то время как псевдоним ForEach работает нормально.
Вот два примера:
Используя псевдоним%:
$ints = @(1, 2, 3, 4, 5)
% ($i in $ints)
{Write-Host $i}
Это не срабатывает с ошибкой Неожиданный токен 'in' в выражении или статте.
Использование псевдонима ForEach:
$ints = @(1, 2, 3, 4, 5)
foreach ($i in $ints)
{Write-Host $i}
Это проходит без проблем.
Почему есть разница, если они оба являются псевдонимами ForEach-Object?
Это две разные вещи:
%
это псевдоним для командлета ForEach-Object
и foreach
является также псевдоним для командлета ForEach-Object
... и foreach
это оператор цикла, который не работа с конвейером.
Как написано, ваша первая команда расширяется до:
ForEach-Object ($i in $ints) {
Write-Host $i
}
... что недопустимый синтаксис для ForEach-Object
командлет.
когда foreach
появляется, как и ваша вторая команда, она интерпретируется как foreach
заявление, а не псевдоним командлета. В этом случае синтаксис является действительный и зацикливается, как ожидалось.
Вы можете сравнить различия с get-help about_Foreach
и get-help ForEach-Object
. Это сообщение в блоге Essential PowerShell: понимание foreach также хорошо объясняет.