Compare-Object

Vergelijkt twee sets objecten.

Syntax

Compare-Object
       [-ReferenceObject] <PSObject[]>
       [-DifferenceObject] <PSObject[]>
       [-SyncWindow <Int32>]
       [-Property <Object[]>]
       [-ExcludeDifferent]
       [-IncludeEqual]
       [-PassThru]
       [-Culture <String>]
       [-CaseSensitive]
       [<CommonParameters>]

Description

De Compare-Object cmdlet vergelijkt twee sets objecten. De ene set objecten is de verwijzing en de andere set objecten is het verschil.

Compare-Object controleert op beschikbare methoden voor het vergelijken van een heel object. Als er geen geschikte methode kan worden gevonden, worden de ToString() -methoden van de invoerobjecten aangeroepen en worden de tekenreeksresultaten vergeleken. U kunt een of meer eigenschappen opgeven die moeten worden gebruikt voor vergelijking. Wanneer er eigenschappen worden opgegeven, vergelijkt de cmdlet alleen de waarden van deze eigenschappen.

Het resultaat van de vergelijking geeft aan of een eigenschapswaarde alleen in het referentieobject (<=) of alleen in het verschilobject (=>) wordt weergegeven. Als de parameter IncludeEqual wordt gebruikt, geeft (==) aan dat de waarde zich in beide objecten bevindt.

Als de verwijzing of de verschilobjecten null zijn ($null), Compare-Object genereert u een afsluitfout.

In sommige voorbeelden wordt splatting gebruikt om de regellengte van de codevoorbeelden te verminderen. Zie about_Splatting voor meer informatie.

Voorbeelden

Voorbeeld 1: de inhoud van twee tekstbestanden vergelijken

In dit voorbeeld wordt de inhoud van twee tekstbestanden vergeleken. In het voorbeeld worden de volgende twee tekstbestanden gebruikt, waarbij elke waarde op een afzonderlijke regel wordt weergegeven.

  • Testfile1.txt bevat de waarden: hond, eekhoorn en vogel.
  • Testfile2.txt bevat de waarden: kat, vogel en opgegeven.

In de uitvoer worden alleen de regels weergegeven die verschillen tussen de bestanden. Testfile1.txt is het referentieobject (<=) en Testfile2.txtis het verschilobject (=>). Regels met inhoud die in beide bestanden worden weergegeven, worden niet weergegeven.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)

InputObject SideIndicator
----------- -------------
cat         =>
racoon      =>
dog         <=
squirrel    <=

Voorbeeld 2: elke regel met inhoud vergelijken en de verschillen uitsluiten

In dit voorbeeld wordt de parameter ExcludeGedifferentieerd gebruikt om elke regel met inhoud in twee tekstbestanden te vergelijken.

Vanaf PowerShell 7.1 wordt IncludeEqual afgeleid wanneer u de parameter ExcludeGedifferentieerd gebruikt en bevat de uitvoer alleen regels in beide bestanden, zoals weergegeven in de SideIndicator (==).

$objects = @{
  ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt)
  DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)
}
Compare-Object @objects -ExcludeDifferent

InputObject SideIndicator
----------- -------------
bird        ==

Voorbeeld 3: het verschil weergeven bij het gebruik van de parameter PassThru

Retourneert normaal gesproken Compare-Object een TYPE PSCustomObject met de volgende eigenschappen:

  • Het InputObject dat wordt vergeleken
  • De eigenschap SideIndicator die laat zien tot welk invoerobject de uitvoer behoort

Wanneer u de parameter PassThru gebruikt, wordt het type van het object niet gewijzigd, maar het exemplaar van het geretourneerde object heeft een toegevoegde NoteProperty met de naam SideIndicator. SideIndicator laat zien tot welk invoerobject de uitvoer behoort.

In de volgende voorbeelden ziet u de verschillende uitvoertypen.

$a = $True
Compare-Object -IncludeEqual $a $a
(Compare-Object -IncludeEqual $a $a) | Get-Member

InputObject SideIndicator
----------- -------------
       True ==

   TypeName: System.Management.Automation.PSCustomObject
Name          MemberType   Definition
----          ----------   ----------
Equals        Method       bool Equals(System.Object obj)
GetHashCode   Method       int GetHashCode()
GetType       Method       type GetType()
ToString      Method       string ToString()
InputObject   NoteProperty System.Boolean InputObject=True
SideIndicator NoteProperty string SideIndicator===

Compare-Object -IncludeEqual $a $a -PassThru
(Compare-Object -IncludeEqual $a $a -PassThru) | Get-Member

True

   TypeName: System.Boolean
Name          MemberType   Definition
----          ----------   ----------
CompareTo     Method       int CompareTo(System.Object obj), int CompareTo(bool value), int IComparable.CompareTo(Syst
Equals        Method       bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable[bool].Equals(bool ot
GetHashCode   Method       int GetHashCode()
GetType       Method       type GetType()
GetTypeCode   Method       System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
ToBoolean     Method       bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte        Method       byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar        Method       char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime    Method       datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal     Method       decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble      Method       double IConvertible.ToDouble(System.IFormatProvider provider)
ToInt16       Method       short IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32       Method       int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64       Method       long IConvertible.ToInt64(System.IFormatProvider provider)
ToSByte       Method       sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToSingle      Method       float IConvertible.ToSingle(System.IFormatProvider provider)
ToString      Method       string ToString(), string ToString(System.IFormatProvider provider), string IConvertible.To
ToType        Method       System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider)
ToUInt16      Method       ushort IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32      Method       uint IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64      Method       ulong IConvertible.ToUInt64(System.IFormatProvider provider)
TryFormat     Method       bool TryFormat(System.Span[char] destination, [ref] int charsWritten)
SideIndicator NoteProperty string SideIndicator===

Wanneer u PassThru gebruikt, wordt het oorspronkelijke objecttype (System.Boolean) geretourneerd. Houd er rekening mee dat de uitvoer die wordt weergegeven met de standaardindeling voor System.Boolean-objecten de eigenschap SideIndicator niet heeft weergegeven. Het geretourneerde System.Boolean-object heeft echter de toegevoegde NoteProperty.

Voorbeeld 4: twee eenvoudige objecten vergelijken met behulp van eigenschappen

In dit voorbeeld vergelijken we twee verschillende tekenreeksen met dezelfde lengte.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual

Length SideIndicator
------ -------------
     3 ==

Voorbeeld 5: complexe objecten vergelijken met behulp van eigenschappen

In dit voorbeeld ziet u het gedrag bij het vergelijken van complexe objecten. In dit voorbeeld slaan we twee verschillende procesobjecten op voor verschillende exemplaren van PowerShell. Beide variabelen bevatten procesobjecten met dezelfde naam. Wanneer de objecten worden vergeleken zonder de parameter Eigenschap op te geven, beschouwt de cmdlet de objecten als gelijk. U ziet dat de waarde van het InputObject hetzelfde is als het resultaat van de methode ToString(). Omdat de klasse System.Diagnostics.Process niet beschikt over de IComparable-interface , converteert de cmdlet de objecten naar tekenreeksen en vergelijkt de resultaten.

PS> Get-Process pwsh

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
    101   123.32     139.10      35.81   11168   1 pwsh
     89   107.55      66.97      11.44   17600   1 pwsh

PS> $a = Get-Process -Id 11168
PS> $b = Get-Process -Id 17600
PS> $a.ToString()
System.Diagnostics.Process (pwsh)
PS> $b.ToString()
System.Diagnostics.Process (pwsh)
PS> Compare-Object $a $b -IncludeEqual

InputObject                       SideIndicator
-----------                       -------------
System.Diagnostics.Process (pwsh) ==

PS> Compare-Object $a $b -Property ProcessName, Id, CPU

ProcessName    Id       CPU SideIndicator
-----------    --       --- -------------
pwsh        17600   11.4375 =>
pwsh        11168 36.203125 <=

Wanneer u eigenschappen opgeeft die moeten worden vergeleken, worden de verschillen in de cmdlet weergegeven.

Voorbeeld 6: Complexe objecten vergelijken die IComparable implementeren

Als het object IComparable implementeert, zoekt de cmdlet naar manieren om de objecten te vergelijken. Als de objecten verschillende typen zijn, wordt het object Difference geconverteerd naar het type ReferenceObject, vergeleken.

In dit voorbeeld vergelijken we een tekenreeks met een TimeSpan-object . In het eerste geval wordt de tekenreeks geconverteerd naar een Tijdspanne , zodat de objecten gelijk zijn.

Compare-Object ([TimeSpan]"0:0:1") "0:0:1" -IncludeEqual

InputObject SideIndicator
----------- -------------
00:00:01    ==

Compare-Object "0:0:1" ([TimeSpan]"0:0:1")

InputObject SideIndicator
----------- -------------
00:00:01    =>
0:0:1       <=

In het tweede geval wordt de Tijdspan geconverteerd naar een tekenreeks, zodat het object anders is.

Parameters

-CaseSensitive

Geeft aan dat vergelijkingen hoofdlettergevoelig moeten zijn.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

Hiermee geeft u de cultuur die moet worden gebruikt voor vergelijkingen.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DifferenceObject

Hiermee geeft u de objecten op die worden vergeleken met de referentieobjecten .

Type:PSObject[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-ExcludeDifferent

Geeft aan dat deze cmdlet alleen de kenmerken weergeeft van vergeleken objecten die gelijk zijn. De verschillen tussen de objecten worden verwijderd.

Gebruik ExcludeGedifferentieerd met IncludeEqual om alleen de lijnen weer te geven die overeenkomen met de verwijzings - en verschilobjecten .

Als ExcludeDifferent is opgegeven zonder IncludeEqual, is er geen uitvoer.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IncludeEqual

IncludeEqual geeft de overeenkomsten weer tussen de verwijzings- en verschilobjecten .

Standaard bevat de uitvoer ook de verschillen tussen de verwijzings - en verschilobjecten .

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

Wanneer u de parameter PassThru gebruikt, Compare-Object laat u de PSCustomObject-wrapper rond de vergeleken objecten weg en retourneert u de verschillende objecten, ongewijzigd.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Hiermee geeft u een matrix van eigenschappen van de verwijzing en verschilobjecten te vergelijken.

De waarde van de parameter Eigenschap kan een nieuwe berekende eigenschap zijn. De berekende eigenschap kan een scriptblok of een hash-tabel zijn. Geldige sleutel-waardeparen zijn:

  • Expressie - <string> of <script block>

Zie about_Calculated_Properties voor meer informatie.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ReferenceObject

Hiermee geeft u een matrix van objecten die worden gebruikt als referentie voor vergelijking.

Type:PSObject[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-SyncWindow

Hiermee geeft u het aantal aangrenzende objecten op dat Compare-Object wordt gecontroleerd tijdens het zoeken naar een overeenkomst in een verzameling objecten. Compare-Object onderzoekt aangrenzende objecten wanneer het object niet op dezelfde positie in een verzameling wordt gevonden. De standaardwaarde is [Int32]::MaxValue, wat betekent dat Compare-Object de hele objectverzameling wordt onderzocht.

Wanneer u met grote verzamelingen werkt, is de standaardwaarde mogelijk niet efficiƫnt maar juist. Het opgeven van een kleinere waarde voor SyncWindow kan de prestaties verbeteren, maar kan een lagere nauwkeurigheid hebben.

Type:Int32
Position:Named
Default value:[Int32]::MaxValue
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Invoerwaarden

PSObject

U kunt een object in de pijplijn naar de parameter DifferenceObject verzenden.

Uitvoerwaarden

None

Deze cmdlet retourneert standaard geen uitvoer wanneer het ReferenceObject en het DifferenceObject hetzelfde zijn.

PSCustomObject

Wanneer de objecten verschillen, verpakt deze cmdlet de verschillende objecten in een PSCustomObject-wrapper met een SideIndicator-eigenschap om te verwijzen naar de verschillen.

Wanneer u de parameter IncludeEqual gebruikt en de objecten hetzelfde zijn, retourneert de cmdlet de objecten die zijn verpakt in een PSCustomObject , waarbij de eigenschap SideIndicator is ingesteld op ==.

Wanneer u de parameter PassThru gebruikt, wordt het type van het object niet gewijzigd, maar het exemplaar van het geretourneerde object heeft een toegevoegde NoteProperty met de naam SideIndicator. SideIndicator laat zien tot welk invoerobject de uitvoer behoort.

Notities

PowerShell bevat de volgende aliassen voor Compare-Object:

  • Windows:
    • compare
    • diff

Wanneer u de parameter PassThru gebruikt, bevat de uitvoer die wordt weergegeven in de console mogelijk niet de eigenschap SideIndicator . De standaardindelingsweergave voor de uitvoer van het objecttype door Compare-Object bevat niet de eigenschap SideIndicator . Zie voorbeeld 3 in dit artikel voor meer informatie.