Compare-Object

Compare two sets of objects e.g. compare the content within two files, one object is the reference set, one is the difference set. The result indicates where a property value appears:
only in the Reference set (<=), only in the Difference set (=>), or in both (==) when -IncludeEqual is specified.

Syntax
      Compare-Object [-referenceObject] PSObject[] [-differenceObject] PSObject[] 
        [-syncWindow int] [-property Object[]] [-caseSensitive]
            [-culture string] [-excludeDifferent] [-includeEqual]
               [-passThru] [CommonParameters]

Key
   -referenceObject PSObject[]
       Object(s) used as a reference for comparison.
        
   -differenceObject PSObject[]
       Object(s) to compare to the reference object(s).
        
   -syncWindow int
       The search region where an attempt is made to re-sync the order if there is no match.
       The Default=[Int32]::MaxValue
       (In PowerShell 1.0 this default was just 5 which is often too low)

   -property Object[]
       Properties of the objects to compare.
        
   -caseSensitive
       Make comparisons case-sensitive.
        
   -culture string
       The culture to use for comparisons.
        
   -excludeDifferent
       Display only the characteristics of compared objects that are equal.
        
   -includeEqual 
       Displays characteristics of compared objects that are equal.
       By default only differences are displayed.
        
   -passThru
       Pass the object created by this cmdlet through the pipeline.

Standard Aliases for Compare-Object: diff

Compare-Object compares two sets of objects, one the 'reference' set and the 'difference' set.

The results indicate a property value appears only in the Reference set (indicated by <= ), only in the Difference set (indicated by => ) or in both objects (indicated by == when -IncludeEqual parameter is specified.)

Examples

Compare the content of two text files:

PS C:\> "Hello World" > C:\temp\apples.txt
PS C:\> "Hello World" > C:\temp\oranges.txt
PS C:\> "More Information" >> C:\temp\oranges.txt
PS C:\> $apples = Get-Content C:\temp\apples.txt
PS C:\> $oranges = Get-Content C:\temp\oranges.txt
PS C:\> Compare-Object $apples $oranges

InputObject            SideIndicator
----------------       ------------------
More Information       =>

The SideIndicator is also available in the pipeline as $_.sideindicator

Compare the processes running before and after starting a copy of notepad.exe, using Get-Process to retrieve the processes running and store them in a variable:

PS C:\> $proc_before = get-process
PS C:\> notepad
PS C:\> $proc_after = get-process
PS C:\> compare-object -referenceobject $proc_before -differenceobject $proc_after -SyncWindow 1000

Compare the services running on 2 machines from the powershell.com blog (link now 404):

PS C:\> $machine1 = Get-Service -ComputerName Server64
PS C:\> $machine2 = Get-Service -ComputerName Server65
PS C:\> Compare-Object -ReferenceObject $machine1 -DifferenceObject $machine2 -Property Name,Status `
-passThru | Sort-Object Name | Select-Object Name, Status, MachineName

Find all the users who are members of both 'group64' and 'group65', this enumerates the Member property:

$first = Get-ADGroup "group64" -Properties Member | Select-Object -ExpandProperty Member | Get-ADUser
$second = Get-ADGroup "group65" -Properties Member | Select-Object -ExpandProperty Member | Get-ADUser
compare-object ($first) ($second) -Property 'SamAccountName' -IncludeEqual -ExcludeDifferent >c:\batch\both.txt

“With the greater part of rich people, the chief enjoyment of riches consists in the parade of riches” ~ Adam Smith

Related PowerShell Cmdlets

ForEach-Object - Loop for each object in the pipeline.
Group-Object - Group the objects that contain the same value for a common property.
Measure-Object - Measure aspects of object properties and create objects from those values.
New-Object - Create a new .Net object.
Select-Object - Select objects based on parameters set in the Cmdlet command string.
Sort-Object - Sort the input objects by property value.
Tee-Object - Send input objects to two places.
Where-Object - Filter input from the pipeline allowing operation on only certain objects.
Equivalent bash commands: diff3 - Show differences among three files.


 
Copyright © 1999-2024 SS64.com
Some rights reserved