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.txt
das 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
Gibt ein Array von Eigenschaften der zu vergleichenden Verweis- und Differenzobjekte 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üssel-Wert-Paare sind:
- Ausdruck –
<string>
oder<script block>
Weitere Informationen finden Sie unter about_Calculated_Properties.
Type: | Object[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-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
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.
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.