简体   繁体   中英

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

ForEach is documented as an alias of ForEach-Object . When I use Get-Alias ForEach it tells that it is in alias of ForEach-Object .

But,

  • ForEach-Object Accepts parameters such as Begin Process and End, where ForEach doesn't accept them.

    • When we call ForEach-Object without any thing it prompts for parameter Process, and on calling ForEach it leaves a nested prompt with >> .

    • % and ForEach behave same, but ForEach-Object don't.

Here my questions are:

  • Is ForEach really an alias of ForEach-Object ?

  • Which is better, ForEach or ForEach-Object ?

Please share your thoughts.

Thank you!

There are two distinct underlying constructs :

  • The ForEach-Object cmdlet

    • This cmdlet has a built-in alias name: foreach , which just so happens to match the name of the distinct foreach statement (see next point).
  • The foreach loop statement (akin to the lesser used for statement).

What foreach refers to depends on the parsing context - see about_Parsing :

  • In argument mode (in the context of a command ), foreach is ForEach-Object 's alias.

  • In expression mode (more strictly: statement mode in this case), foreach is the foreach loop statement .


As a cmdlet , ForEach-Object operates on pipeline input .

  • Use it process output from other commands in a streaming manner, object by object , as these objects are being received, via the automatic $_ variable .

As a language statement , the foreach loop operates on variables and expressions (which may include output collected from commands).

  • Use it to process already-collected-in-memory results efficiently, via a self-chosen iterator variable (eg, $num in foreach ($num in 1..3) { ... } ); doing so is noticeably faster than processing via ForEach-Object .

  • Note that you cannot send outputs from a foreach statement directly to the pipeline, because PowerShell's grammar doesn't permit it; for streaming output to the pipeline, wrap a foreach statement in & { ... } . (By contrast, simple expressions (eg, 1..3 ) can be sent directly to the pipeline).

For more information, a performance comparison and a discussion of the tradeoffs (memory use vs. performance), including the .ForEach() array method , see this answer .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM