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.txt
ist 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
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.
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.