The Pipeline (|)

Description

The pipeline operator | is one of the most powerful features in PowerShell. Its purpose is to take the output of one command and send it to be used as the input for the next command in the sequence. This allows you to chain multiple simple commands together to perform complex tasks.

While the concept of a pipeline also exists in Linux, how it works in PowerShell is fundamentally different and more powerful.

The Key Difference: Objects vs. Text

In Linux

In a Linux shell like Bash, the pipeline | transports streams of unstructured text. When you run ps aux | grep "chrome", the ps command produces a large block of text, and the grep command performs a simple text search on that block.

In PowerShell

In PowerShell, the pipeline | transports live .NET objects. When you run a command like Get-Process | Stop-Process, the Get-Process cmdlet doesn’t send text; it sends a collection of Process objects. The Stop-Process cmdlet is designed to receive these objects and knows exactly how to act on them. This eliminates the need for text parsing and makes commands more reliable and predictable.

A Practical Workflow Example

The true power of the pipeline is in chaining multiple commands. Let’s find the 5 largest files in the current directory and all its subdirectories, showing only their names and sizes.

Step 1: Get all files

First, we use Get-ChildItem to recursively get all file objects.

Get-ChildItem -Recurse -File

Step 2: Sort the files by size

Next, we pipe those file objects to Sort-Object to arrange them by their Length property, from largest to smallest.

Get-ChildItem -Recurse -File | Sort-Object -Property Length -Descending

Step 3: Select the top 5

Now we pipe the sorted list to Select-Object to take only the first 5 objects from the pipeline.

Get-ChildItem -Recurse -File | Sort-Object -Property Length -Descending | Select-Object -First 5

Step 4: Format the final output

Finally, we can pipe those 5 objects to another Select-Object command to display only the properties we care about: Name and Length.

Get-ChildItem -Recurse -File | Sort-Object -Property Length -Descending | Select-Object -First 5 | Select-Object Name, Length

This one-liner demonstrates the core philosophy of PowerShell: get a collection of objects, then filter, sort, and process them step-by-step through the pipeline until you have your desired result.

Last updated on