为什么ForEach的行为与%不同,即使它们都是Powershell中ForEach-Object的别名?

出于某种原因,在ForEach别名工作正常时,使用($ Thing in $ Things)语法时ForEach-Object的%别名会引发exception。

这里有两个例子:

使用%别名:

$ints = @(1, 2, 3, 4, 5) % ($i in $ints) {Write-Host $i} 

这在expression式或语句中出现意外令牌'in'时失败。

使用ForEach别名:

 $ints = @(1, 2, 3, 4, 5) foreach ($i in $ints) {Write-Host $i} 

这成功没有问题。

为什么它们都是ForEach-Object的别名?

这是两件不同的事情:

%是cmdlet的别名ForEach-Objectforeach 也是 cmdlet的别名ForEach-Object foreach是一个循环语句, 它不适用于stream水线。

正如所写,你的第一个命令扩展到:

 ForEach-Object ($i in $ints) { Write-Host $i } 

…这是ForEach-Object cmdlet的无效语法。

当出现foreach ,与第二个命令一样,它被解释为foreach 语句 ,而不是cmdlet别名。 在这种情况下,语法有效的,并按预期循环。

您可以将这些差异与get-help about_Foreachget-help ForEach-Object 。 这篇博客文章Essential PowerShell:了解foreach也很好的解释。