Skip to main content

How the PowerShell Pipeline Really Works

This is the first in a seven part series on how to use the PowerShell pipeline. I’ve been teaching PowerShell since 2009.  The biggest hurdle that I have found for IT Professionals is understanding how the pipeline works.  So this past week after class, I wrote up a 24 page document to augment my class delivery.  Hope you enjoy it.

The PowerShell pipeline is a key feature of our favorite scripting language.  It has the potential to greatly reduce your coding efforts.  Here are two examples that produce the same answer.  The difference is that the first example uses the PowerShell pipeline, and the second does not:

Ex 1 : Using the PowerShell Pipeline
Get-Process |
    Where-Object CPU -gt 10 |
    Measure-Object -Property CPU -sum |
    Select-Object -ExpandProperty Sum

Ex 2 : Not using the PowerShell Pipeline
$Procs = Get-Process
$Sum = $Null
ForEach ($Proc in $Procs)
{
    If ($Proc.CPU -gt 10)
    {
        $Sum += $Proc.cpu
    }
}
Write-Output $Sum

Here are the same two examples executed using the cmdlet Measure-Object.  Notice the difference in the amount of time that it takes to complete these two tasks.

Ex 3 : Processing time comparison between Ex 1 and Ex 2.
Measure-Command -Expression {
    Get-Process |
        Where-Object CPU -gt 10 |
        Measure-Object -Property CPU -sum |
        Select-Object -ExpandProperty Sum
} | Select-Object -ExpandProperty TotalMilliseconds


Measure-Command -Expression {
    $Procs = Get-Process
    $Sum = $Null
    ForEach ($Proc in $Procs)
    {
        If ($Proc.CPU -gt 10)
        {
            $Sum += $Proc.cpu
        }
    }
    Write-Output $Sum
} | Select-Object -ExpandProperty TotalMilliseconds

3.9183
5.4664

In many cases, the pipeline will run faster than using traditional structural programming.

Even with these advantages, the PowerShell pipeline is a technology that is very hard to grasp for most IT professionals.  Not only are we treading into the world of the developer, but just the concept of the pipeline is a mystery to many. 

Comments

Popular posts from this blog

Adding a Comment to a GPO with PowerShell

As I'm writing this article, I'm also writing a customization for a PowerShell course I'm teaching next week in Phoenix.  This customization deals with Group Policy and PowerShell.  For those of you who attend my classes may already know this, but I sit their and try to ask the questions to myself that others may ask as I present the material.  I finished up my customization a few hours ago and then I realized that I did not add in how to put a comment on a GPO.  This is a feature that many Group Policy Administrators may not be aware of. This past summer I attended a presentation at TechEd on Group Policy.  One organization in the crowd had over 5,000 Group Policies.  In an environment like that, the comment section can be priceless.  I always like to write in the comment section why I created the policy so I know its purpose next week after I've completed 50 other tasks and can't remember what I did 5 minutes ago. In the Group Policy module for PowerShell V3, th

Return duplicate values from a collection with PowerShell

If you have a collection of objects and you want to remove any duplicate items, it is fairly simple. # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   # Remove the duplicate values. $Set1 | Select-Object -Unique 1 2 3 4 5 6 7 What if you want only the duplicate values and nothing else? # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   #Create a second collection with duplicate values removed. $Set2 = $Set1 | Select-Object -Unique   # Return only the duplicate values. ( Compare-Object -ReferenceObject $Set2 -DifferenceObject $Set1 ) . InputObject | Select-Object – Unique 1 2 This works with objects as well as numbers.  The first command creates a collection with 2 duplicates of both 1 and 2.   The second command creates another collection with the duplicates filtered out.  The Compare-Object cmdlet will first find items that are diffe

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.