Share via

Pipeline in Powershell

Pragun Sharma 1 Reputation point
2021-07-04T09:57:12.63+00:00

Hi guys,, this is bothering me..

I was reading about how pipeline works in powershell at
and got to know that pipeline delivers one object at a time.

So, this

Get-Service | Format-Table -Property Name, DependentServices  

is different from this

Format-Table -InputObject (Get-Service) -Property Name, DependentServices  

So here, going by the explanation, in the first case, the Format-Table works on one object at at time and in the second example, Format-Table works on an array of objects. Please correct me if I am wrong.

If this is the case, then I wonder how does Sort-Object and other cmdlets that need to work on collection of data work with pipe character.
When I do :
Get-Service | Sort-Object

How is Sort-Object able to sort if it just gets to work with one object at a time. So, assume there are 100 service objects that are to be passed to Sort-Object. Will Sort-Object be called 100 times (each for one object) and how will that yield in Sorted results that I see on the screen.

Windows for business | Windows Server | User experience | PowerShell
0 comments No comments

1 answer

Sort by: Most helpful
  1. Evgenij Smirnov 541 Reputation points
    2021-07-04T14:53:39.85+00:00

    Hi,

    it all depends on whether the function has to process the collection as a whole (like Sort-Object or Measure-Object) or every member separately (like Foreach-Object or Where-Object).

    In the first scenario, the actual processing happens in the End{} scope, while the Process{} scope simply accumulates data coming in from the pipe into an array which then gets processed in the End{} block.

    In the second scenario, the actual processing is done in the Process{} scope, and the parameter accepting pipeline input is treated as an array in that scope. So either the objects come from the pipe, then Proces{} gets executed multiple times but each time the array only has one member, or the objects get passed as an array so Process{} is only executed once but over an array containing multiple members.

    Make sense?

    Was this answer helpful?

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.