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

Chr*_*son 7 powershell

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

这里有两个例子:

使用 % 别名:

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

这将失败并在表达式或语句中出现错误 Unexpected token 'in'。

使用 ForEach 别名:

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

这毫无问题地成功。

如果它们都是 ForEach-Object 的别名,为什么会有区别?

jsc*_*ott 14

这是两件不同的事情:

%是小命令的别名ForEach-Objectforeach小命令的别名ForEach-Object......并且 foreach是循环语句这与流水线工作。

如所写,您的第一个命令扩展为:

ForEach-Object ($i in $ints) {
  Write-Host $i 
}
Run Code Online (Sandbox Code Playgroud)

...这不是有效的语法 ForEach-Objectcmdlet 的。

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

您可以使用get-help about_Foreach和比较差异get-help ForEach-Object。这篇博文Essential PowerShell:Understanding foreach也做了很好的解释。