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 () sind,$null
Compare-Object
wird ein Abbruchfehler generiert.
Einige Beispiele verwenden Splatting, um die Zeilenlänge der Codebeispiele zu reduzieren. 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 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 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 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 includeEqual bei Verwendung des Parameters ExcludeDifferent abgeleitet, und die Ausgabe enthält nur Zeilen, die in beiden Dateien enthalten sind, wie vom SideIndicator (==
) gezeigt.
$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 , 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 hat 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 die Im Standardformat für System.Boolean-Objekte angezeigte Ausgabe die SideIndicator-Eigenschaft nicht anzeigte. Das zurückgegebene System.Boolean-Objekt verfügt jedoch über das hinzugefügte NoteProperty.
Beispiel 4: Vergleichen von zwei einfachen Objekten mithilfe von Eigenschaften
In diesem Beispiel vergleichen wir zwei unterschiedliche Zeichenfolgen, die die gleiche Länge haben.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual
Length SideIndicator
------ -------------
3 ==
Beispiel 5: Vergleich komplexer Objekte mithilfe von Eigenschaften
In diesem Beispiel wird das Verhalten beim Vergleich 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 Parameter Property anzugeben, betrachtet das Cmdlet die Objekte als gleich. 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 die zu vergleichenden 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 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 der 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 Eigenschaften 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 dem Differenzobjekt ü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 dem Verweis - und dem Differenzobjekt 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 herum weg 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, die als Referenz für den Vergleich verwendet werden.
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
, was bedeutet, dass Compare-Object
die gesamte Objektauflistung untersucht wird.
Bei der Arbeit mit großen Sammlungen ist der Standardwert möglicherweise nicht effizient, aber richtig. Die Angabe eines kleineren Werts für SyncWindow kann die Leistung erhöhen, kann jedoch 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 Parameter DifferenceObject senden.
Ausgaben
None
Wenn das Verweisobjekt und das Differenzobjekt identisch sind, gibt es keine Ausgabe, es sei denn, Sie verwenden den IncludeEqual-Parameter .
Wenn die Objekte unterschiedlich sind, Compare-Object
umschließt die unterschiedlichen Objekte in einem 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 instance des zurückgegebenen Objekts hat eine hinzugefügte NoteProperty mit dem Namen SideIndicator. SideIndicator zeigt an, zu welchem Eingabeobjekt die Ausgabe gehört.
Hinweise
Wenn Sie den PassThru-Parameter verwenden, enthält die in der Konsole angezeigte Ausgabe möglicherweise nicht die SideIndicator-Eigenschaft . Die Standardformatansicht für den Objekttyp, der von ausgegeben wird Compare-Object
, enthält nicht die SideIndicator-Eigenschaft . Weitere Informationen finden Sie unter Beispiel 3 in diesem Artikel.