Compare-Object
Vergleicht zwei Gruppen von Objekten.
Syntax
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Beschreibung
Das Cmdlet Compare-Object
vergleicht zwei Objektgruppen. 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 Verweis Objekt (<=
) oder nur im Unterschied Objekt (=>
) angezeigt wurde. Wenn der IncludeEqual Parameter verwendet wird, (==
) gibt an, dass sich der Wert in beiden Objekten befindet.
Wenn der Verweis oder die Differenz Objekte null ($null
) sind), generiert Compare-Object
einen Beendigungsfehler.
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 der Verweis Objekt (<=
) und Testfile2.txt
ist der Unterschied Objekt (=>
). 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 werden die parameter IncludeEqual und ExcludeDifferent Parameter verwendet, um jede Inhaltszeile in zwei Textdateien zu vergleichen.
Da der Befehl den parameter ExcludeDifferent verwendet, enthält die Ausgabe 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 -IncludeEqual -ExcludeDifferent
InputObject 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 InputObject verglichen wird
- Die SideIndicator--Eigenschaft, die anzeigt, zu welchem Eingabeobjekt die Ausgabe gehört
Wenn Sie den PassThru Parameter verwenden, wird der Type des Objekts nicht geändert, aber die zurückgegebene Instanz des zurückgegebenen Objekts hat eine NoteProperty- mit dem Namen SideIndicatorhinzugefügt. 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 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 die NotePropertyhinzugefü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 verglichen werden, ohne den Parameter Property anzugeben, berücksichtigt das Cmdlet, dass die Objekte gleich sind. Beachten Sie, dass der Wert des InputObject- mit dem Ergebnis der ToString()-Methode übereinstimmt. 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 IComparableimplementiert, 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- 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, dass bei Vergleichen zwischen Groß- und Kleinschreibung unterschieden 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 werden soll.
Typ: | String |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-DifferenceObject
Gibt die Objekte an, die mit dem Verweis-Objekte 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 Unterschied Objekten übereinstimmen.
Wenn ExcludeDifferent- ohne IncludeEqualangegeben 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 dem Verweis und Unterschied Objekten an.
Standardmäßig enthält die Ausgabe auch die Unterschiede zwischen dem Verweis und Unterschied Objekten.
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 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 Bezugs und Unterschied zu vergleichenden Objekte 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 Compare-Object
überprüft, während sie in einer Auflistung von Objekten nach einer Übereinstimmung suchen.
Compare-Object
untersucht benachbarte Objekte, wenn es das Objekt nicht an derselben Position in einer Auflistung findet. Der Standardwert ist [Int32]::MaxValue
, was bedeutet, dass Compare-Object
die gesamte Objektauflistung untersucht.
Wenn Sie mit großen Sammlungen arbeiten, ist der Standardwert möglicherweise nicht effizient, sondern genau. Die Angabe eines kleineren Werts für SyncWindow- kann die Leistung erhöhen, aber eine geringere Genauigkeit haben.
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 die DifferenceObject- identisch sind.
Wenn die Objekte unterschiedlich sind, umschließt dieses Cmdlet die unterschiedlichen Objekte in einem PSCustomObject- Wrapper mit einem SideIndicator--Eigenschaft, um auf die Unterschiede zu verweisen.
Wenn Sie den PassThru Parameter verwenden, wird der Type des Objekts nicht geändert, aber die zurückgegebene Instanz des zurückgegebenen Objekts hat eine NoteProperty- mit dem Namen SideIndicatorhinzugefügt. SideIndicator zeigt an, zu welchem Eingabeobjekt die Ausgabe gehört.
Hinweise
Windows PowerShell enthält die folgenden Aliase für Compare-Object
:
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 durch Compare-Object
enthält nicht die SideIndicator-Eigenschaft. Weitere Informationen finden Sie unter Beispiel 3 in diesem Artikel.