Share via


Compare-Object

Vergleicht zwei Sätze von Objekten.

Syntax

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

Beschreibung

Das Compare-Object Cmdlet vergleicht zwei Sätze von Objekten. Ein Satz von -Objekten ist der Verweis, und der andere Satz von -Objekten ist der Unterschied.

Compare-Object sucht nach verfügbaren Methoden zum Vergleichen eines ganzen Objekts. Wenn keine geeignete Methode gefunden werden kann, ruft sie die ToString() -Methoden der Eingabeobjekte auf und vergleicht die Zeichenfolgenergebnisse. Sie können eine oder mehrere Eigenschaften angeben, die für den Vergleich verwendet werden sollen. Wenn Eigenschaften bereitgestellt werden, vergleicht das Cmdlet nur die Werte dieser Eigenschaften.

Das Ergebnis des Vergleichs gibt an, ob ein Eigenschaftswert nur im Verweisobjekt (<=) oder nur im Differenzobjekt (=>) angezeigt wurde. Wenn der IncludeEqual-Parameter verwendet wird, gibt (==) an, dass sich der Wert in beiden Objekten befindet.

Wenn der Verweis oder die Differenzobjekte NULL ($null) sind, Compare-Object wird ein Abbruchfehler generiert.

Einige Beispiele verwenden splatting, um die Zeilenlänge der Codebeispiele zu verringern. Weitere Informationen finden Sie unter about_Splatting.

Beispiele

Beispiel 1: Vergleichen des Inhalts von zwei Textdateien

In diesem Beispiel wird der Inhalt von zwei Textdateien verglichen. Im Beispiel werden die folgenden beiden Textdateien verwendet, wobei sich jeder Wert in einer separaten Zeile befindet.

  • Testfile1.txt enthält die Werte: Hund, Eichhörnchen und Vogel.
  • Testfile2.txt enthält die Werte: Katze, Vogel und Waschbär.

Die Ausgabe zeigt nur die Zeilen an, die sich zwischen den Dateien unterscheiden. Testfile1.txt ist das Verweisobjekt (<=) und Testfile2.txtdas Differenzobjekt (=>). Zeilen mit Inhalt, die in beiden Dateien angezeigt werden, werden nicht angezeigt.

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

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

Beispiel 2: Vergleichen der einzelnen Inhaltszeilen und Ausschließen der Unterschiede

In diesem Beispiel wird der ExcludeDifferent-Parameter verwendet, um jede Inhaltszeile in zwei Textdateien zu vergleichen.

Ab PowerShell 7.1 wird bei Verwendung des ExcludeDifferent-ParametersIncludeEqual abgeleitet, und die Ausgabe enthält nur Zeilen, die in beiden Dateien enthalten sind, wie vom SideIndicator (==) dargestellt.

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

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

Beispiel 3: Anzeigen des Unterschieds bei Verwendung des PassThru-Parameters

Compare-Object Normalerweise gibt einen PSCustomObject-Typ mit den folgenden Eigenschaften zurück:

  • Das verglichene InputObject
  • Die SideIndicator-Eigenschaft , die zeigt, zu welchem Eingabeobjekt die Ausgabe gehört

Wenn Sie den PassThru-Parameter verwenden, wird der Typ des Objekts nicht geändert, aber die instance des zurückgegebenen Objekts verfügt über eine hinzugefügte NoteProperty mit dem Namen SideIndicator. SideIndicator zeigt an, zu welchem Eingabeobjekt die Ausgabe gehört.

Die folgenden Beispiele zeigen die verschiedenen Ausgabetypen.

$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===

Bei Verwendung von PassThru wird der ursprüngliche Objekttyp (System.Boolean) zurückgegeben. Beachten Sie, dass in der Ausgabe, die im Standardformat für System.Boolean-Objekte angezeigt wird, die SideIndicator-Eigenschaft nicht angezeigt wurde. Das zurückgegebene System.Boolean-Objekt weist jedoch die hinzugefügte NoteProperty auf.

Beispiel 4: Vergleichen von zwei einfachen Objekten mithilfe von Eigenschaften

In diesem Beispiel vergleichen wir zwei verschiedene Zeichenfolgen, die die gleiche Länge haben.

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

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

Beispiel 5: Vergleichen komplexer Objekte mithilfe von Eigenschaften

In diesem Beispiel wird das Verhalten beim Vergleichen komplexer Objekte veranschaulicht. In diesem Beispiel werden zwei verschiedene Prozessobjekte für verschiedene Instanzen von PowerShell gespeichert. Beide Variablen enthalten Prozessobjekte mit demselben Namen. Wenn die Objekte verglichen werden, ohne den Property-Parameter anzugeben, betrachtet das Cmdlet die Objekte als gleich. Beachten Sie, dass der Wert von InputObject mit dem Ergebnis der ToString() -Methode identisch ist. Da die System.Diagnostics.Process-Klasse nicht über die IComparable-Schnittstelle verfügt, konvertiert das Cmdlet die Objekte in Zeichenfolgen und vergleicht dann die Ergebnisse.

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 <=

Wenn Sie die zu vergleichenden Eigenschaften angeben, zeigt das Cmdlet die Unterschiede an.

Beispiel 6: Vergleichen komplexer Objekte, die IComparable implementieren

Wenn das Objekt IComparable implementiert, sucht das Cmdlet nach Möglichkeiten, die Objekte zu vergleichen. Wenn die Objekte unterschiedliche Typen sind, wird das Difference-Objekt in den Typ des ReferenceObject konvertiert und dann verglichen.

In diesem Beispiel vergleichen wir eine Zeichenfolge mit einem TimeSpan-Objekt . Im ersten Fall wird die Zeichenfolge in einen TimeSpan konvertiert, sodass die Objekte gleich sind.

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       <=

Im zweiten Fall wird timeSpan in eine Zeichenfolge konvertiert, sodass sich das Objekt unterscheidet.

Parameter

-CaseSensitive

Gibt an, ob bei Vergleichen die Groß-/Kleinschreibung beachtet werden soll.

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

-Culture

Gibt die Kultur an, die für Vergleiche verwendet wird.

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

-DifferenceObject

Gibt die Objekte an, die mit den Verweisobjekten verglichen werden.

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

-ExcludeDifferent

Gibt an, dass dieses Cmdlet nur die Merkmale von verglichenen Objekten anzeigt, die gleich sind. Die Unterschiede zwischen den -Objekten werden verworfen.

Verwenden Sie ExcludeDifferent mit IncludeEqual , um nur die Zeilen anzuzeigen, die zwischen den Verweis - und differenzobjekten übereinstimmen.

Wenn ExcludeDifferent ohne IncludeEqual angegeben wird, gibt es keine Ausgabe.

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

-IncludeEqual

IncludeEqual zeigt die Übereinstimmungen zwischen den Verweis- und Differenzobjekten an.

Standardmäßig enthält die Ausgabe auch die Unterschiede zwischen den Verweis - und Differenzobjekten .

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

-PassThru

Wenn Sie den PassThru-Parameter verwenden, Compare-Object lässt den PSCustomObject-Wrapper um die verglichenen Objekte aus und gibt die unterschiedlichen Objekte unverändert zurück.

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

-Property

-ReferenceObject

Gibt ein Array von -Objekten an, das als Verweis für den Vergleich verwendet wird.

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

-SyncWindow

Gibt die Anzahl benachbarter Objekte an, die Compare-Object bei der Suche nach einer Übereinstimmung in einer Auflistung von Objekten überprüft werden. Compare-Object untersucht benachbarte Objekte, wenn das Objekt nicht an derselben Position in einer Auflistung gefunden wird. Der Standardwert ist [Int32]::MaxValue. Dies bedeutet, dass Compare-Object die gesamte Objektauflistung untersucht wird.

Wenn Sie mit großen Sammlungen arbeiten, ist der Standardwert möglicherweise nicht effizient, aber genau. Die Angabe eines kleineren Werts für SyncWindow kann die Leistung erhöhen, aber eine geringere Genauigkeit aufweisen.

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

Eingaben

PSObject

Sie können ein Objekt in der Pipeline an den DifferenceObject-Parameter senden.

Ausgaben

None

Standardmäßig gibt dieses Cmdlet keine Ausgabe zurück, wenn ReferenceObject und DifferenceObject identisch sind.

PSCustomObject

Wenn die Objekte unterschiedlich sind, umschließt dieses Cmdlet die unterschiedlichen Objekte in einem PSCustomObject-Wrapper mit einer SideIndicator-Eigenschaft , um auf die Unterschiede zu verweisen.

Wenn Sie den IncludeEqual-Parameter verwenden und die Objekte identisch sind, gibt das Cmdlet die Objekte zurück, die in einem PSCustomObject umschlossen sind, wobei die SideIndicator-Eigenschaft auf ==festgelegt ist.

Wenn Sie den PassThru-Parameter verwenden, wird der Typ des Objekts nicht geändert, aber die instance des zurückgegebenen Objekts verfügt über eine hinzugefügte NoteProperty mit dem Namen SideIndicator. SideIndicator zeigt an, zu welchem Eingabeobjekt die Ausgabe gehört.

Hinweise

PowerShell enthält die folgenden Aliase für Compare-Object:

  • Windows:
    • compare
    • diff

Bei Verwendung des PassThru-Parameters enthält die in der Konsole angezeigte Ausgabe möglicherweise nicht die SideIndicator-Eigenschaft . Die Standardformatansicht für die Objekttypausgabe von Compare-Object enthält nicht die SideIndicator-Eigenschaft . Weitere Informationen finden Sie unter Beispiel 3 in diesem Artikel.