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.txt
jest 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
- 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
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ść
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
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
Określa tablicę właściwości odwołania i różnicy obiektów do porównania.
Wartość parametru Property może być nową właściwością obliczeniową. Właściwość obliczeniowa może być blokiem skryptu lub tabelą skrótów. Prawidłowe pary klucz-wartość to:
- Wyrażenie —
<string>
lub<script block>
Aby uzyskać więcej informacji, zobacz about_Calculated_Properties.
Typ: | Object[] |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | False |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-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
Obiekt można wysłać w dół potoku do parametru DifferenceObject.
Dane wyjściowe
None
Jeśli
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 Compare-Object
nie zawiera właściwości SideIndicator. Aby uzyskać więcej informacji, zobacz Przykład 3 w tym artykule.