【问题标题】:Is ForEach really an alias of ForEach-Object (Powershell)ForEach 真的是 ForEach-Object (Powershell) 的别名吗
【发布时间】:2020-05-19 10:34:53
【问题描述】:

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

但是,

  • ForEach-Object 接受 Begin Process 和 End 等参数,而 ForEach 不接受这些参数。

    • 当我们在没有任何东西的情况下调用 ForEach-Object 时,它会提示输入参数 Process,而在调用 ForEach 时,它会留下一个带有 >> 的嵌套提示。

    • % 和 ForEach 行为相同,但 ForEach-Object 不同。

我的问题是:

  • ForEach真的是ForEach-Object的别名吗?

  • ForEach 或 ForEach-Object 哪个更好?

请分享您的想法。

谢谢!

【问题讨论】:

    标签: powershell foreach alias


    【解决方案1】:

    有两种不同的底层结构:

    • ForEach-Object cmdlet

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

    foreach 所指的内容取决于解析上下文 - 请参阅about_Parsing:

    • 在参数模式(在命令的上下文中),foreach 是ForEach-Object 的别名。

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


    作为 cmdlet,ForEach-Object 在管道输入上运行。

    • 使用它以流式方式处理来自其他命令的输出,逐个对象,当这些对象被接收时,通过自动@ 987654337@ 变量。

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

    • 使用它来有效地处理已经在内存中收集的结果,通过 自选迭代器变量(例如,@987654340 中的 $num @); 这样做明显比通过ForEach-Object 处理快。

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

    如需了解更多信息,请查看性能比较和权衡(内存使用与性能)讨论,包括.ForEach()数组方法强>,见this answer。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 2016-01-13
      • 2012-06-20
      相关资源
      最近更新 更多