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

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

由于某种原因,当使用($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也很好地解释了。

相关内容