Vergleicht zwei Sätze von Objekten.
- Syntax
- Beschreibung
- Beispiele
- Beispiel 1 – Vergleich des Inhalts von zwei Textdateien
- Beispiel 2 – Jede Zeile des Inhalts vergleichen und die Unterschiede ausschließen
- Beispiel 3 – Anzeigen des Unterschieds bei Verwendung des PassThru-Parameters
- Beispiel 4 – Vergleich zweier einfacher Objekte mithilfe von Eigenschaften
- Beispiel 5 – Vergleich komplexer Objekte mithilfe von Eigenschaften
- Beispiel 6 – Vergleichen komplexer Objekte, die IComparable implementieren
- Parameter
- Inputs
- Ausgaben
- Notes
Syntax
Compare-Object <PSObject> <PSObject> >]
Beschreibung
Das Cmdlet Compare-Object
vergleicht zwei Sätze von Objekten. Eine Gruppe von Objekten ist die Referenz und die andere Gruppe von Objekten ist die Differenz.
Compare-Object
prüft auf verfügbare Methoden zum Vergleichen eines ganzen Objekts. Wenn es keine geeignete Methode findet, ruft es die ToString()-Methoden der Eingabeobjekte auf und vergleicht die String-Ergebnisse. 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 zeigt an, ob ein Eigenschaftswert nur im Referenzobjekt (<=
) oder nur im Differenzobjekt (=>
) vorhanden ist. Wenn der IncludeEqual-Parameter verwendet wird, zeigt (==
) an, dass der Wert in beiden Objekten vorhanden ist.
Wenn das Referenz- oder das Differenzobjekt null ist ($null
), erzeugt Compare-Object
einen Abbruchfehler.
Einige Beispiele verwenden Splatting, um die Zeilenlänge der Codebeispiele zu reduzieren. Weitere Informationen finden Sie unter_Splatting.
Beispiele
Beispiel 1 – Vergleich des Inhalts von zwei Textdateien
In diesem Beispiel wird der Inhalt von zwei Textdateien verglichen. Das Beispiel verwendet die folgenden zwei Textdateien, wobei jeder Wert in einer eigenen Zeile steht.
-
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 Referenzobjekt (<=
) und Testfile2.txt
ist das Differenzobjekt (=>
). Zeilen mit Inhalt, die in beiden Dateien vorkommen, 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 – Jede Zeile des Inhalts vergleichen und die Unterschiede ausschließen
In diesem Beispiel wird der Parameter ExcludeDifferent verwendet, um jede Zeile des Inhalts in zwei Textdateien zu vergleichen.
Ab PowerShell 7.1 wird bei Verwendung des ExcludeDifferent-Parameters IncludeEqual abgeleitet und die Ausgabe enthält nur Zeilen, die in beiden Dateien enthalten sind, wie durch den SideIndicator(==
) angezeigt.
$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject SideIndicator----------- -------------bird ==
Beispiel 3 – Anzeigen des Unterschieds bei Verwendung des PassThru-Parameters
Normalerweise gibt Compare-Object
einen PSCustomObject-Typ mit den folgenden Eigenschaften zurück:
- Das zu vergleichende Eingabeobjekt
- Die Eigenschaft SideIndicator, die anzeigt, 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 eine zusätzliche NoteProperty namens SideIndicator. SideIndicator zeigt an, zu welchem Eingabeobjekt die Ausgabe gehört.
Die folgenden Beispiele zeigen die verschiedenen Ausgabetypen.
$a = $TrueCompare-Object -IncludeEqual $a $a(Compare-Object -IncludeEqual $a $a) | Get-MemberInputObject SideIndicator----------- ------------- True == TypeName: System.Management.Automation.PSCustomObjectName 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=TrueSideIndicator NoteProperty string SideIndicator===Compare-Object -IncludeEqual $a $a -PassThru(Compare-Object -IncludeEqual $a $a -PassThru) | Get-MemberTrue TypeName: System.BooleanName MemberType Definition---- ---------- ----------CompareTo Method int CompareTo(System.Object obj), int CompareTo(bool value), int IComparable.CompareTo(SystEquals Method bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable.Equals(bool otGetHashCode 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.ToToType 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 destination, int charsWritten)SideIndicator NoteProperty string SideIndicator===
Wenn Sie PassThru verwenden, wird der ursprüngliche Objekttyp (System.Boolean) zurückgegeben. Beachten Sie, dass die Ausgabe, die durch das Standardformat für System.Boolean-Objekte angezeigt wird, die EigenschaftSideIndicator nicht anzeigt. Das zurückgegebene System.Boolean-Objekt verfügt jedoch über die hinzugefügte EigenschaftNoteProperty.
Beispiel 4 – Vergleich zweier einfacher Objekte mithilfe von Eigenschaften
In diesem Beispiel werden zwei verschiedene Zeichenketten verglichen, die die gleiche Länge haben.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqualLength SideIndicator------ ------------- 3 ==
Beispiel 5 – Vergleich komplexer Objekte mithilfe von Eigenschaften
Dieses Beispiel zeigt das Verhalten beim Vergleich komplexer Objekte. In diesem Beispiel werden zwei verschiedene Prozessobjekte für verschiedene Instanzen von PowerShell gespeichert. Beide Variablen enthalten Prozessobjekte mit demselben Namen. Wenn die Objekte ohne Angabe des Property-Parameters verglichen werden, betrachtet das Cmdlet die Objekte als gleich. Beachten Sie, dass der Wert desInputObjects mit dem Ergebnis der Methode ToString() identisch ist. Da die Klasse „System.Diagnostics.Process“ nicht über die Schnittstelle „IComparable“ 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 pwshPS> $a = Get-Process -Id 11168PS> $b = Get-Process -Id 17600PS> $a.ToString()System.Diagnostics.Process (pwsh)PS> $b.ToString()System.Diagnostics.Process (pwsh)PS> Compare-Object $a $b -IncludeEqualInputObject SideIndicator----------- -------------System.Diagnostics.Process (pwsh) ==PS> Compare-Object $a $b -Property ProcessName, Id, CPUProcessName 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 – Vergleichen komplexer Objekte, die IComparable implementieren
Wenn das Objekt IComparable implementiert, sucht das Cmdlet nach Möglichkeiten, die Objekte zu vergleichen.
Wenn es sich bei den Objekten um unterschiedliche Typen handelt, wird das Difference-Objekt in den Typ desReferenceObject konvertiert und dann verglichen.
In diesem Beispiel wird eine Zeichenfolge mit einem TimeSpan-Objekt verglichen. Im ersten Fall wird die Zeichenkette in ein TimeSpan-Objekt umgewandelt, so dass die Objekte gleich sind.
Compare-Object ("0:0:1") "0:0:1" -IncludeEqualInputObject SideIndicator----------- -------------00:00:01 ==Compare-Object "0:0:1" ("0:0:1")InputObject SideIndicator----------- -------------00:00:01 =>0:0:1 <=
Im zweiten Fall wird das TimeSpan-Objekt in eine Zeichenkette umgewandelt, so dass die Objekte unterschiedlich sind.
Parameter
Gibt an, dass bei Vergleichen die Groß- und Kleinschreibung beachtet werden soll.
Typ: | SwitchParameter |
Position: | Benannt |
Standardwert: | Falsch |
Akzeptiere Pipelineeingabe: | False |
Accept wildcard characters: | False |
Bestimmt die Kultur, die für Vergleiche verwendet werden soll.
Typ: | String |
Position: | Benannt |
Standardwert: | Keine |
Akzeptiere Pipelineeingabe: | False |
Accept wildcard characters: | False |
Spezifiziert die Objekte, die mit den Referenzobjekten verglichen werden.
Typ: | PSObject |
Position: | 1 |
Standardwert: | Keine |
Akzeptiere Pipeline-Eingabe: | True |
Accept wildcard characters: | False |
Gibt an, dass dieses Cmdlet nur die Merkmale der verglichenen Objekte anzeigt, die gleich sind. Die Unterschiede zwischen den Objekten werden verworfen.
Wenn Sie ExcludeDifferent mit IncludeEqual verwenden, werden nur die Zeilen angezeigt, die zwischen dem Vergleichsobjekt und dem Differenzobjekt übereinstimmen.
Wenn ExcludeDifferent ohne IncludeEqual angegeben wird, erfolgt keine Ausgabe.
Typ: | SwitchParameter |
Position: | Benannt |
Standardwert: | Falsch |
Pipeline-Eingabe akzeptieren: | False |
Accept wildcard characters: | False |
IncludeEqual zeigt die Übereinstimmungen zwischen dem Referenz- und Differenzobjekt an.
Standardmäßig enthält die Ausgabe auch die Unterschiede zwischen den Referenz- und Differenzobjekten.
Typ: | SwitchParameter |
Position: | Benannt |
Standardwert: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Wenn Sie den PassThru-Parameter verwenden, lässt Compare-Object
den PSCustomObject-Wrapper um die verglichenen Objekte weg und gibt die unterschiedlichen Objekte unverändert zurück.
Typ: | SwitchParameter |
Position: | Benannt |
Standardwert: | Falsch |
Akzeptiere Pipeline-Eingabe: | False |
Accept wildcard characters: | False |
Spezifiziert ein Array von Eigenschaften der zu vergleichenden Referenz- und Differenzobjekte.
Der Wert des Parameters Eigenschaft kann eine neue berechnete Eigenschaft sein. Die berechnete Eigenschaft kann ein Skriptblock oder eine Hashtabelle sein. Gültige Schlüssel-Wert-Paare sind:
- Ausdruck –
<string>
oder<script block>
Weitere Informationen finden Sie unter_Calculated_Properties.
Typ: | Objekt |
Position: | Benannt |
Standardwert: | Keine |
Akzeptiere Pipelineeingabe: | False |
Accept wildcard characters: | False |
Spezifiziert ein Array von Objekten, die als Referenz für den Vergleich verwendet werden.
Typ: | PSObject |
Position: | 0 |
Standardwert: | Keine |
Akzeptiere Pipelineeingabe: | False |
Accept wildcard characters: | False |
Spezifiziert die Anzahl der benachbarten Objekte, die Compare-Object
bei der Suche nach einer Übereinstimmung in einer Sammlung von Objekten untersucht. Compare-Object
untersucht benachbarte Objekte, wenn es das Objekt nicht an der gleichen Position in einer Sammlung findet. Der Standardwert ist ::MaxValue
, was bedeutet, dassCompare-Object
die gesamte Objektsammlung untersucht.
Typ: | Int32 |
Position: | Benannt |
Standardwert: | ::MaxValue |
Akzeptiere Pipelineeingabe: | False |
Accept wildcard characters: | False |
Inputs
PSObject
Sie können ein Objekt über die Pipeline an den Parameter DifferenceObject senden.
Ausgaben
Keine
Wenn das Referenzobjekt und das Differenzobjekt gleich sind, gibt es keine Ausgabe, es sei denn, Sie verwenden den Parameter IncludeEqual.
PSCustomObject
Wenn die Objekte unterschiedlich sind, Compare-Object
verpackt die unterschiedlichen Objekte in einen PSCustomObject
Wrapper mit einer SideIndicator-Eigenschaft, um auf die Unterschiede zu verweisen.
Wenn Sie den PassThru-Parameter verwenden, wird der Typ des Objekts nicht geändert, aber die Instanz des zurückgegebenen Objekts hat eine zusätzliche NoteProperty namens SideIndicator. SideIndicator zeigt an, zu welchem Eingabeobjekt die Ausgabe gehört.
Notes
Wenn Sie den PassThru-Parameter verwenden, enthält die in der Konsole angezeigte Ausgabe möglicherweise nicht die EigenschaftSideIndicator. Die Standardformatansicht für den Objekttyp, der vonCompare-Object
ausgegeben wird, enthält die Eigenschaft SideIndicator nicht. Weitere Informationen finden Sie unterBeispiel 3 in diesem Artikel.
- über_berechnete_Eigenschaften
- Fürjedes-Objekt
- Gruppen-Objekt
- Maßnahme-Objekt
- Neues-Objekt
- Auswahl-Objekt
- Sortier-Objekt
- Beim-Objekt
- Wo-Objekt
- Get-Process