Udostępnij za pośrednictwem


Compare-Object

Porównuje dwa zestawy obiektów.

Składnia

Compare-Object
       [-ReferenceObject] <PSObject[]>
       [-DifferenceObject] <PSObject[]>
       [-SyncWindow <Int32>]
       [-Property <Object[]>]
       [-ExcludeDifferent]
       [-IncludeEqual]
       [-PassThru]
       [-Culture <String>]
       [-CaseSensitive]
       [<CommonParameters>]

Opis

Polecenie cmdlet Compare-Object porównuje dwa zestawy obiektów. Jednym zestawem obiektów jest odwołanie , a drugi zestaw obiektów jest różnicą .

Compare-Object sprawdza dostępne metody porównywania całego obiektu. Jeśli nie może znaleźć odpowiedniej metody, wywołuje metodę ToString() metod obiektów wejściowych i porównuje wyniki ciągu. Do porównania można podać co najmniej jedną właściwości do użycia. Po podaniu właściwości polecenie cmdlet porównuje tylko wartości tych właściwości.

Wynik porównania wskazuje, czy wartość właściwości pojawiła się tylko w odwołania do obiektu (<=) lub tylko w różnicy obiektu (=>). Jeśli jest używany parametr IncludeEqual, (==) wskazuje, że wartość znajduje się w obu obiektach.

Jeśli odwołania lub różnicy obiekty mają wartość null ($null), Compare-Object generuje błąd zakończenia.

W niektórych przykładach użyto fragmentowania, aby zmniejszyć długość wiersza przykładów kodu. Aby uzyskać więcej informacji, zobacz about_Splatting.

Przykłady

Przykład 1 — porównanie zawartości dwóch plików tekstowych

W tym przykładzie porównana jest zawartość dwóch plików tekstowych. W przykładzie użyto następujących dwóch plików tekstowych z każdą wartością w osobnym wierszu.

  • Testfile1.txt zawiera wartości: pies, wiewiórka i ptak.
  • Testfile2.txt zawiera wartości: kot, ptak i racoon.

Dane wyjściowe zawierają tylko wiersze, które różnią się między plikami. Testfile1.txt jest obiektem (<=), a Testfile2.txtjest różnicą obiektu (=>). Wiersze z zawartością wyświetlaną w obu plikach nie są wyświetlane.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)

InputObject SideIndicator
----------- -------------
cat         =>
racoon      =>
dog         <=
squirrel    <=

Przykład 2 — porównywanie poszczególnych wierszy zawartości i wykluczanie różnic

W tym przykładzie użyto parametru ExcludeDifferent, aby porównać każdy wiersz zawartości w dwóch plikach tekstowych.

Od programu PowerShell 7.1 podczas korzystania z parametru ExcludeDifferentIncludeEqual jest wnioskowany, a dane wyjściowe zawierają tylko wiersze zawarte w obu plikach, jak pokazano w 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        ==

Przykład 3 — wyświetlanie różnicy w przypadku używania parametru PassThru

Zwykle zwraca typ PSCustomObject o następujących właściwościach:

  • Porównywana InputObject
  • Właściwość SideIndicator przedstawiająca obiekt wejściowy, do którego należy dane wyjściowe

Jeśli używasz parametru PassThru, Type obiektu nie zostanie zmieniony, ale zwrócone wystąpienie obiektu ma dodany NoteProperty o nazwie SideIndicator. SideIndicator pokazuje, do którego obiektu wejściowego należy dane wyjściowe.

W poniższych przykładach przedstawiono różne typy danych wyjściowych.

$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===

W przypadku używania PassThru zwracany jest oryginalny typ obiektu (System.Boolean). Zwróć uwagę, że dane wyjściowe wyświetlane domyślnie w formacie System.Boolean nie wyświetlały właściwości SideIndicator. Jednak zwrócony obiekt System.Boolean ma dodany obiekt NoteProperty.

Przykład 4 — porównanie dwóch prostych obiektów przy użyciu właściwości

W tym przykładzie porównamy dwa różne ciągi o tej samej długości.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual

Length SideIndicator
------ -------------
     3 ==

Przykład 5 — porównywanie złożonych obiektów przy użyciu właściwości

W tym przykładzie pokazano zachowanie podczas porównywania złożonych obiektów. W tym przykładzie przechowujemy dwa różne obiekty procesów dla różnych wystąpień programu PowerShell. Obie zmienne zawierają obiekty procesu o tej samej nazwie. Gdy obiekty są porównywane bez określenia parametru Property, polecenie cmdlet uważa, że obiekty są równe. Zwróć uwagę, że wartość InputObject jest taka sama jak w wyniku metody ToString(). Ponieważ klasa System.Diagnostics.Process nie ma interfejsu IComparable, polecenie cmdlet konwertuje obiekty na ciągi, a następnie porównuje wyniki.

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 <=

Podczas określania właściwości do porównania polecenie cmdlet pokazuje różnice.

Przykład 6 — porównywanie złożonych obiektów implementujących IComparable

Jeśli obiekt implementuje IComparable, polecenie cmdlet wyszukuje sposoby porównywania obiektów. Jeśli obiekty są różnymi typami, obiekt Difference jest konwertowany na typ ReferenceObject następnie porównywany.

W tym przykładzie porównujemy ciąg z obiektem TimeSpan. W pierwszym przypadku ciąg jest konwertowany na TimeSpan, więc obiekty są równe.

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       <=

W drugim przypadku TimeSpan jest konwertowany na ciąg, aby obiekt był inny.

Parametry

-CaseSensitive

Wskazuje, że w porównaniach powinna być uwzględniana wielkość liter.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-Culture

Określa kulturę do użycia na potrzeby porównań.

Typ:String
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-DifferenceObject

Określa obiekty, które są porównywane z odwołania obiektów.

Typ:PSObject[]
Position:1
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych:False

-ExcludeDifferent

Wskazuje, że to polecenie cmdlet wyświetla tylko cechy porównywanych obiektów, które są równe. Różnice między obiektami są odrzucane.

Użyj ExcludeDifferent z IncludeEqual, aby wyświetlić tylko wiersze zgodne między odwołania i różnicy obiektów.

Jeśli ExcludeDifferent jest określona bez IncludeEqual, nie ma żadnych danych wyjściowych.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-IncludeEqual

includeEqual wyświetla dopasowania między a różnicą obiektów.

Domyślnie dane wyjściowe zawierają również różnice między odwołaniami a różnicami obiektów.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-PassThru

Jeśli używasz parametru PassThru, Compare-Object pomija psCustomObject otoki wokół porównywanych obiektów i zwraca różne obiekty bez zmian.

Typ:SwitchParameter
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-Property

-ReferenceObject

Określa tablicę obiektów używanych jako odwołanie do porównania.

Typ:PSObject[]
Position:0
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-SyncWindow

Określa liczbę sąsiednich obiektów, które Compare-Object sprawdza podczas wyszukiwania dopasowania w kolekcji obiektów. Compare-Object sprawdza sąsiadujące obiekty, gdy nie znajduje obiektu w tej samej pozycji w kolekcji. Wartość domyślna to [Int32]::MaxValue, co oznacza, że Compare-Object sprawdza całą kolekcję obiektów.

Podczas pracy z dużymi kolekcjami wartość domyślna może nie być wydajna, ale jest dokładna. Określenie mniejszej wartości dla SyncWindow może zwiększyć wydajność, ale może mieć niższą dokładność.

Typ:Int32
Position:Named
Domyślna wartość:[Int32]::MaxValue
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

Dane wejściowe

PSObject

Obiekt można wysłać w dół potoku do parametru DifferenceObject.

Dane wyjściowe

None

Jeśli odwołać się do obiektu i różnicy są takie same, nie ma danych wyjściowych, chyba że zostanie użyty parametr IncludeEqual .

PSCustomObject

Jeśli obiekty są inne, Compare-Object opakowuje różne obiekty w otoce PSCustomObject z właściwością SideIndicator, aby odwołać się do różnic.

Jeśli używasz parametru PassThru, Type obiektu nie zostanie zmieniony, ale zwrócone wystąpienie obiektu ma dodany NoteProperty o nazwie SideIndicator. SideIndicator pokazuje, do którego obiektu wejściowego należy dane wyjściowe.

Uwagi

W przypadku używania parametru PassThru dane wyjściowe wyświetlane w konsoli mogą nie zawierać właściwości SideIndicator. Domyślny widok formatu danych wyjściowych typu obiektu według Compare-Object nie zawiera właściwości SideIndicator. Aby uzyskać więcej informacji, zobacz Przykład 3 w tym artykule.