出于某种原因,在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-Object
和foreach
也是 cmdlet的别名ForEach-Object
… 和 foreach
是一个循环语句, 它不适用于stream水线。
正如所写,你的第一个命令扩展到:
ForEach-Object ($i in $ints) { Write-Host $i }
…这是ForEach-Object
cmdlet的无效语法。
当出现foreach
,与第二个命令一样,它被解释为foreach
语句 ,而不是cmdlet别名。 在这种情况下,语法是有效的,并按预期循环。
您可以将这些差异与get-help about_Foreach
和get-help ForEach-Object
。 这篇博客文章Essential PowerShell:了解foreach也很好的解释。