由于某种原因,当使用($Things in $Things)语法时,ForEach-Object 的 % 别名会引发异常,而 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 的别名,为什么会有区别?
答案1
这是两件不同的事情:
%
是cmdlet 的别名ForEach-Object
,并且foreach
还该 cmdlet 的别名ForEach-Object
...和 foreach
是一个循环语句才不是使用流水线工作。
如上所述,您的第一个命令扩展为:
ForEach-Object ($i in $ints) {
Write-Host $i
}
...这对于 cmdlet 来说不是有效的语法ForEach-Object
。
当foreach
出现时,就像你的第二个命令一样,它被解释为foreach
陈述,而不是 cmdlet 别名。在这种情况下,语法是有效并按预期循环。
get-help about_Foreach
你可以比较一下和的差异get-help ForEach-Object
。这篇博文PowerShell 基础知识:理解 foreach也很好地解释了。