Назад | Перейти на главную страницу

Почему ForEach ведет себя иначе, чем%, хотя они оба являются псевдонимами ForEach-Object в Powershell?

По какой-то причине псевдоним% для 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 также хорошо объясняет.