How to Filter Array of Objects in PowerShell?

    Recently, I got a requirement to filter an array of objects in PowerShell. I checked a few methods, and in this PowerShell tutorial, I will explain how to filter an array of objects in PowerShell using various methods.

    To filter an array of objects in PowerShell, you can use the Where-Object cmdlet, which allows you to specify conditions for filtering. For example, $array | Where-Object { $_.PropertyName -eq “Value” } filters objects where the property “PropertyName” equals “Value”. Alternatively, the .Where() method can be used on the array directly, such as $array.Where({ $_.PropertyName -eq “Value” }), which offers a more efficient, pipeline-free way to achieve the same result.

    Arrays of Objects in PowerShell

    Let’s understand what an array of objects is. In PowerShell, an array is a data structure that can hold multiple items. These items can be of any data type, including objects. An object in PowerShell is an instance of a class that can contain properties and methods. When we talk about an array of objects, we mean a collection of instances we can manipulate as a group.

    Filter Array of Objects in PowerShell Using the Where-Object Cmdlet

    The most common way to filter an array of objects in PowerShell is by using the Where-Object cmdlet. This cmdlet allows you to specify criteria to filter objects. The objects that meet the conditions of the filter are then passed down the pipeline or stored in a variable.

    Basic Syntax of Where-Object

    $array | Where-Object { $_.PropertyName -Operator Value }
    • $array is the array of objects you want to filter.
    • $_ represents the current object being processed in the pipeline.
    • PropertyName is the name of the property you want to filter on.
    • Operator is the comparison operator (e.g., -eq for equals, -gt for greater than).
    • Value is the value you want to compare the property to.

    Example: Filtering an Array of Custom Objects in PowerShell

    Let’s create an array of custom objects and then filter it in PowerShell.

    # Create an array of custom objects
    $people = @(
        @{Name='Alice'; Age=30},
        @{Name='Bob'; Age=25},
        @{Name='Charlie'; Age=35}
    ) | ForEach-Object { New-Object PSObject -Property $_ }
    
    # Filter the array to find people older than 30
    $olderThan30 = $people | Where-Object { $_.Age -gt 30 }
    
    # Display the filtered objects
    $olderThan30

    In this example, we first create an array of custom objects $people with properties Name and Age. We then use Where-Object to filter out the people who are older than 30 and store the results in $olderThan30.

    Once you run the PowerShell script, you can see the output in the screenshot below:

    how to filter array of objects in powershell

    Filter Array of Objects in PowerShell Using the .Where() Method

    PowerShell also provides a .Where() method that you can use to filter objects in an array. This method is often faster than Where-Object because it does not involve the pipeline.

    Syntax of .Where() Method

    $array.Where({ $_.PropertyName -Operator Value })

    Example: Using .Where() to Filter Objects

    Let’s use the same array of people and filter an array of objects in PowerShell using the .Where() method.

    # Create an array of custom objects
    $people = @(
        @{Name='Alice'; Age=30},
        @{Name='Bob'; Age=25},
        @{Name='Charlie'; Age=35}
    ) | ForEach-Object { New-Object PSObject -Property $_ }
    
    # Filter the array to find people younger than 30
    $youngerThan30 = $people.Where({ $_.Age -lt 30 })
    
    # Display the filtered objects
    $youngerThan30

    Here, we filter the $people array to find people younger than 30 using the .Where() method and store the result in $youngerThan30.

    Filter Array of Objects in PowerShell with Multiple Conditions

    Both Where-Object and .Where() can be used to filter an array of objects in PowerShell with multiple conditions.

    # Create an array of custom objects
    $people = @(
        @{Name='Alice'; Age=30},
        @{Name='Bob'; Age=25},
        @{Name='Charlie'; Age=35}
    ) | ForEach-Object { New-Object PSObject -Property $_ }
    
    # Filter the array for people named 'Alice' or older than 32
    $aliceOrOlderThan32 = $people | Where-Object { $_.Name -eq 'Alice' -or $_.Age -gt 32 }
    
    # Display the filtered objects
    $aliceOrOlderThan32

    In this example, we use a script block with -or to filter for people named ‘Alice’ or older than 32.

    Conclusion

    Filtering an array of objects in PowerShell can be possible using the Where-Object cmdlet or the .Where() methods.

    In this PowerShell tutorial, I have explained how to filter an array of objects in PowerShell.

    You may also like:

    >