Freigeben über


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 Gruppen von Objekten. Eine Gruppe 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 sie keine geeignete Methode finden kann, ruft sie die ToString()- Methoden der Eingabeobjekte auf und vergleicht die Zeichenfolgenergebnisse. Sie können eine oder mehrere Eigenschaften bereitstellen, die zum 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 Referenzobjekt (<=) 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 Beendigungsfehler 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 mit jedem Wert in einer separaten Zeile verwendet.

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

Die Ausgabe zeigt nur die Zeilen an, die zwischen den Dateien unterschiedlich sind. Testfile1.txt ist das Referenzobjekt (<=) und Testfile2.txtist das Differenzobjekt (=>). Zeilen mit Inhalten, 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 sie jede Inhaltszeile, und schließen Sie die Unterschiede aus.

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

Ab PowerShell 7.1 wird IncludeEqual bei Verwendung des ExcludeDifferent-Parameters abgeleitet, und die Ausgabe enthält nur Zeilen, die in beiden Dateien enthalten sind, wie vom 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        ==

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

Compare-Object Gibt normalerweise einen PSCustomObject-Typ mit den folgenden Eigenschaften zurück:

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

Wenn Sie den PassThru-Parameter verwenden, wird der Typ des Objekts nicht geändert, aber die Instanz des zurückgegebenen Objekts hat ein hinzugefügtes 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 die Ausgabe, die im Standardformat für System.Boolean-Objekte angezeigt wird, die SideIndicator-Eigenschaft nicht angezeigt hat. Das zurückgegebene System.Boolean-Objekt hat jedoch den hinzugefügten NoteProperty hinzugefügt.

Beispiel 4 : Vergleichen von zwei einfachen Objekten mithilfe von Eigenschaften

In diesem Beispiel vergleichen wir zwei unterschiedliche Zeichenfolgen mit der gleichen Länge.

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 speichern wir zwei unterschiedliche Prozessobjekte für verschiedene Instanzen von PowerShell. Beide Variablen enthalten Prozessobjekte mit demselben Namen. Wenn die Objekte ohne Angabe des Property-Parameters verglichen werden, berücksichtigt das Cmdlet, dass die Objekte gleich sind. Beachten Sie, dass der Wert des 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 zu vergleichende Eigenschaften angeben, zeigt das Cmdlet die Unterschiede an.

Beispiel 6: Vergleich komplexer Objekte, die IComparable implementieren

Wenn das Objekt IComparable implementiert, sucht das Cmdlet nach Möglichkeiten zum Vergleichen der Objekte. Wenn es sich bei den Objekten um unterschiedliche Typen handelt, wird das Difference-Objekt in den Typ des ReferenceObject-Objekts konvertiert und dann verglichen.

In diesem Beispiel wird eine Zeichenfolge mit einem TimeSpan-Objekt verglichen. 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 der TimeSpan in eine Zeichenfolge konvertiert, sodass sich das Objekt unterscheidet.

Parameter

-CaseSensitive

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

Typ:SwitchParameter
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-Culture

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

Typ:String
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-DifferenceObject

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

Typ:PSObject[]
Position:1
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren: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 dem Verweis und den Differenzobjekten übereinstimmen.

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

Typ:SwitchParameter
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-IncludeEqual

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

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

Typ:SwitchParameter
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-PassThru

Wenn Sie den PassThru-Parameter verwenden, Compare-Object wird der PSCustomObject-Wrapper um die verglichenen Objekte herum weggelassen und die unterschiedlichen Objekte unverändert zurückgegeben.

Typ:SwitchParameter
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-Property

Gibt ein Array von Eigenschaften des zu vergleichenden Bezugs - und Differenzobjekts an.

Der Wert des Property-Parameters kann eine neue berechnete Eigenschaft sein. Die berechnete Eigenschaft kann ein Skriptblock oder eine Hashtabelle sein. Gültige Schlüsselwertpaare sind:

  • Ausdruck - <string> oder <script block>

Weitere Informationen finden Sie unter about_Calculated_Properties.

Typ:Object[]
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-ReferenceObject

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

Typ:PSObject[]
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-SyncWindow

Gibt die Anzahl angrenzender Objekte an, die überprüft werden, Compare-Object während sie in einer Auflistung von Objekten nach einer Übereinstimmung suchen. Compare-Object untersucht angrenzende Objekte, wenn es das Objekt nicht an derselben Position in einer Auflistung findet. Der Standardwert lautet [Int32]::MaxValue, was bedeutet, dass Compare-Object die gesamte Objektauflistung untersucht wird.

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

Typ:Int32
Position:Named
Standardwert:[Int32]::MaxValue
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

Eingaben

PSObject

Sie können ein Objekt an den Parameter DifferenceObject senden.

Ausgaben

None

Standardmäßig gibt dieses Cmdlet keine Ausgabe zurück, wenn das ReferenceObject und das 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 ein PSCustomObject eingeschlossen sind, wobei die SideIndicator-Eigenschaft auf .==

Wenn Sie den PassThru-Parameter verwenden, wird der Typ des Objekts nicht geändert, aber die Instanz des zurückgegebenen Objekts hat ein hinzugefügtes 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 Compare-Object enthält nicht die SideIndicator-Eigenschaft . Weitere Informationen finden Sie in Beispiel 3 in diesem Artikel.