Porównuje dwa zestawy obiektów.
- Syntaktyka
- Opis
- Przykłady
- Przykład 1 – Porównaj zawartość dwóch plików tekstowych
- Przykład 2 – Porównaj każdą linię treści i wyklucz różnice
- Przykład 3 – Pokaż różnicę przy użyciu parametru PassThru
- Przykład 4 – Porównywanie dwóch prostych obiektów przy użyciu właściwości
- Przykład 5 – Porównywanie złożonych obiektów przy użyciu właściwości
- Przykład 6 – Porównywanie złożonych obiektów, które implementują IComparable
- Parametry
- Inputs
- Outputs
- Notes
Syntaktyka
Compare-Object <PSObject> <PSObject> >]
Opis
Centdlet Compare-Object
porównuje dwa zestawy obiektów. Jeden zestaw obiektów jest odniesieniem,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 metody ToString() obiektów wejściowych i porównuje wyniki łańcuchów znaków. Możesz podać jedną lub więcej właściwości, które mają zostać użyte do porównania. Gdy podane są właściwości, 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 obiekcie odniesienia (<=
) czy tylko w obiekcie różnicy (=>
). Jeśli użyto parametru IncludeEqual, (==
) wskazuje, że wartość znajduje się w obu obiektach.
Jeśli obiekt odniesienia lub obiekt różnicy mają wartość null ($null
), Compare-Object
generuje błąd zakończenia.
W niektórych przykładach zastosowano splatanie w celu zmniejszenia długości wierszy próbek kodu. Aby uzyskać więcej informacji, zobaczabout_Splatting.
Przykłady
Przykład 1 – Porównaj zawartość dwóch plików tekstowych
Ten przykład porównuje zawartość dwóch plików tekstowych. W przykładzie użyto następujących dwóch plików tekstowych, w których każda wartość znajduje się w osobnym wierszu.
-
Testfile1.txt
zawiera wartości: pies, wiewiórka i ptak. -
Testfile2.txt
zawiera wartości: kot, ptak i szop.
Wyniki wyświetlają tylko te wiersze, które różnią się między plikami. Testfile1.txt
jest obiektem referencji (<=
), a Testfile2.txt
jest obiektem różnicy (=>
). Linie z treścią, które występują 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ównaj każdą linię treści i wyklucz różnice
Ten przykład wykorzystuje parametr ExcludeDifferent do porównania każdej linii treści w dwóch plikach tekstowych.
Od wersji PowerShell 7.1, gdy używany jest parametr ExcludeDifferent, IncludeEqual jest wnioskowane i dane wyjściowe zawierają tylko linie zawarte w obu plikach, jak pokazuje wskaźnik SideIndicator(==
).
$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject SideIndicator----------- -------------bird ==
Przykład 3 – Pokaż różnicę przy użyciu parametru PassThru
Normalnie, Compare-Object
zwraca typ PSCustomObject z następującymi właściwościami:
- Porównywany obiekt InputObject
- Właściwość SideIndicator pokazująca, do którego obiektu wejściowego należy wyjście
Gdy użyjemy parametru PassThru, typ obiektu nie ulega zmianie, ale zwrócona instancja obiektu ma dodaną właściwość NoteProperty o nazwie SideIndicator. SideIndicator pokazuje, do którego obiektu wejściowego należy wyjście.
Następujące przykłady pokazują różne typy wyjścia.
$a = $TrueCompare-Object -IncludeEqual $a $a(Compare-Object -IncludeEqual $a $a) | Get-MemberInputObject SideIndicator----------- ------------- True == TypeName: System.Management.Automation.PSCustomObjectName 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=TrueSideIndicator NoteProperty string SideIndicator===Compare-Object -IncludeEqual $a $a -PassThru(Compare-Object -IncludeEqual $a $a -PassThru) | Get-MemberTrue TypeName: System.BooleanName MemberType Definition---- ---------- ----------CompareTo Method int CompareTo(System.Object obj), int CompareTo(bool value), int IComparable.CompareTo(SystEquals Method bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable.Equals(bool otGetHashCode 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.ToToType 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 destination, int charsWritten)SideIndicator NoteProperty string SideIndicator===
Przy użyciu parametru PassThru zwracany jest oryginalny typ obiektu (System.Boolean). Zauważ, że wyjście wyświetlone przez domyślny format dla obiektów System.Boolean nie wyświetliło właściwościSideIndicator. Jednak zwrócony obiekt System.Boolean ma dodaną właściwośćNoteProperty.
Przykład 4 – Porównywanie dwóch prostych obiektów przy użyciu właściwości
W tym przykładzie porównujemy dwa różne łańcuchy znaków, które mają taką samą długość.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqualLength SideIndicator------ ------------- 3 ==
Przykład 5 – Porównywanie złożonych obiektów przy użyciu właściwości
Ten przykład pokazuje zachowanie podczas porównywania złożonych obiektów. W tym przykładzie przechowujemy dwa różne obiekty procesów dla różnych instancji PowerShell. Obie zmienne zawierają obiekty procesów o tej samej nazwie. Gdy obiekty są porównywane bez podania parametru Property, cmdlet uznaje, że obiekty są równe. Zauważ, że wartość obiektuInputObject jest taka sama jak wynik metody ToString(). Ponieważ klasaSystem.Diagnostics.Process nie posiada interfejsu IComparable, cmdlet konwertuje obiekty na ciągi znaków, 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 pwshPS> $a = Get-Process -Id 11168PS> $b = Get-Process -Id 17600PS> $a.ToString()System.Diagnostics.Process (pwsh)PS> $b.ToString()System.Diagnostics.Process (pwsh)PS> Compare-Object $a $b -IncludeEqualInputObject SideIndicator----------- -------------System.Diagnostics.Process (pwsh) ==PS> Compare-Object $a $b -Property ProcessName, Id, CPUProcessName Id CPU SideIndicator----------- -- --- -------------pwsh 17600 11.4375 =>pwsh 11168 36.203125 <=
Gdy określisz właściwości do porównania, cmdlet pokazuje różnice.
Przykład 6 – Porównywanie złożonych obiektów, które implementują IComparable
Jeśli obiekt implementuje IComparable, cmdlet szuka sposobów na porównanie obiektów.Jeśli obiekty są różnych typów, obiekt Difference jest konwertowany na typ obiektuReferenceObject, a następnie porównywany.
W tym przykładzie porównujemy ciąg znaków z obiektem TimeSpan. W pierwszym przypadku łańcuch jest konwertowany na TimeSpan, więc obiekty są równe.
Compare-Object ("0:0:1") "0:0:1" -IncludeEqualInputObject SideIndicator----------- -------------00:00:01 ==Compare-Object "0:0:1" ("0:0:1")InputObject SideIndicator----------- -------------00:00:01 =>0:0:1 <=
W drugim przypadku TimeSpan jest konwertowany na łańcuch, więc obiekty są różne.
Parametry
Wskazuje, że w porównaniach powinna być uwzględniana wielkość liter.
Typ: | SwitchParameter |
Pozycja: | Nazwa |
Wartość domyślna: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Culture
Określa kulturę do użycia przy porównaniach.
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa obiekty, które są porównywane z obiektami odniesienia.
Type: | PSObject |
Position: | 1 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Indicates that this cmdlet displays only the characteristics of compared objects that are equal. Różnice między obiektami są odrzucane.
Użyj polecenia ExcludeDifferent z funkcją IncludeEqual, aby wyświetlić tylko linie, które pasują do siebie między obiektami preferencji i różnicy.
Jeśli polecenie ExcludeDifferent jest określone bez funkcji IncludeEqual, nie ma danych wyjściowych.
Type: | SwitchParameter |
Position: | Named |
Wartość domyślna: | False |
Accept pipeline input: | False |
Akceptuj znaki wieloznaczne: | False |
IncludeEqual wyświetla dopasowania między obiektami odniesienia i różnicy.
Domyślnie dane wyjściowe zawierają również różnice między obiektami odniesienia i różnic.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Kiedy używasz parametru PassThru, Compare-Object
pomija wrapperaround PSCustomObject porównywanych obiektów i zwraca obiekty różniące się, niezmienione.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Property
Przedstawia tablicę właściwości obiektów odniesienia i różnicy do porównania.
Wartością parametru Property może być nowa właściwość obliczana. Obliczana właściwość może być blokiem skryptu lub tablicą haszującą. Prawidłowe pary klucz-wartość to:
- Wyrażenie –
<string>
lub<script block>
Więcej informacji można znaleźć w temacieabout_Calculated_Properties.
Type: | Object |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa tablicę obiektów używanych jako odniesienie do porównania.
Type: | PSObject |
Position: | 0 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa liczbę sąsiednich obiektów, które Compare-Object
sprawdza podczas szukania dopasowania w kolekcji obiektów. Compare-Object
bada sąsiednie obiekty, gdy nie znajduje obiektu w tej samej pozycji w kolekcji. Domyślną wartością jest ::MaxValue
, co oznacza, żeCompare-Object
bada całą kolekcję obiektów.
Type: | Int32 |
Position: | Named |
Wartość domyślna: | ::MaxValue |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Inputs
PSObject
Możesz wysłać obiekt w dół rurociągu do parametru DifferenceObject.
Outputs
None
Jeśli obiekt odniesienia i obiekt różnicy są takie same, nie ma wyjścia, chyba że użyjesz parametru IncludeEqual.
PSCustomObject
Jeśli obiekty są różne, Compare-Object
opakowuje różniące się obiekty w PSCustomObject
wrapper z właściwością SideIndicator, aby odnieść się do różnic.
Gdy używasz parametru PassThru, typ obiektu nie jest zmieniany, ale zwrócona instancja obiektu ma dodaną właściwość Note o nazwie SideIndicator. SideIndicator pokazuje, do którego obiektu wejściowego należy wyjście.
Notes
W przypadku użycia parametru PassThru, dane wyjściowe wyświetlane w konsoli mogą nie zawierać właściwościSideIndicator. Domyślny widok formatu dla typu obiektu wyprowadzanego przezCompare-Object
nie zawiera właściwości SideIndicator. Więcej informacji można znaleźć w przykładzie 3 w tym artykule.
- about_Calculated_Properties
- ForEach-Object
- Group-Object
- Measure-Object
- New-Object
- Select-Object
- Sort-Object
- Tee-Object
- Where-Object
- Get-Process