ForEach 真的是 ForEach-Object 的别名吗(Powershell)

Is ForEach really an alias of ForEach-Object (Powershell)

ForEach 被记录为 ForEach-Object 的别名。当我使用 Get-Alias ForEach 时,它告诉我它是 ForEach-Object.

的别名

但是,

我的问题是:

请分享您的想法。

谢谢!

两个不同的基础结构

  • ForEach-Objectcmdlet

    • 此 cmdlet 有一个内置的 别名 名称:foreach,恰好与不同 foreach [=58] 的名称相匹配=]声明(见下一点)。
  • foreach循环语句(类似于较少使用的for语句)。

foreach 指的是什么取决于 解析上下文 - 请参阅 about_Parsing:

  • 参数模式中(在命令的上下文中),foreachForEach-Object的别名.

  • 表达式模式(更严格地说:在这种情况下是语句模式),foreachforeach 循环语句.


作为 cmdletForEach-Object 管道输入 .

  • 使用它以 流式处理 方式处理来自其他命令的输出,一个对象一个对象,因为正在接收这些对象,通过自动$_变量.

作为语言语句foreach循环对变量和表达式[=103进行操作=](可能包括从命令收集的输出)。

  • 使用它来有效地处理已经收集到内存中的结果,通过自选迭代器变量(例如,foreach ($num in 1..3) { ... } 中的 $num); 这样做比 ForEach-Object.

  • 处理明显更快
  • 请注意,您不能将 foreach 语句的输出直接发送到管道,因为 PowerShell 的语法不允许这样做;要将输出流式传输到管道,请将 foreach 语句包装在 & { ... } 中。 (相比之下,简单的表达式(例如,1..3可以直接发送到管道。

有关更多信息,性能比较权衡(内存使用与性能)的讨论,包括.ForEach()数组法,见.