Freigeben über


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.txtist 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

PSObject

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.

PSCustomObject

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.