Compare-Object

Modul: Microsoft.PowerShell.Utility

Vergleicht zwei Sätze von Objekten.

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

-CaseSensitive

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

Bestimmt die Kultur, die für Vergleiche verwendet werden soll.

Typ: String
Position: Benannt
Standardwert: Keine
Akzeptiere Pipelineeingabe: False
Accept wildcard characters: False
-DifferenceObject

Spezifiziert die Objekte, die mit den Referenzobjekten verglichen werden.

Typ: PSObject
Position: 1
Standardwert: Keine
Akzeptiere Pipeline-Eingabe: True
Accept wildcard characters: False
-ExcludeDifferent

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

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

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

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

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

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.