- Syntaxe
- Popis
- Příklady
- Příklad 1 – Porovnání obsahu dvou textových souborů
- Příklad 2 – Porovnání každého řádku obsahu a vyloučení rozdílů
- Příklad 3 – Zobrazení rozdílu při použití parametru PassThru
- Příklad 4 – Porovnání dvou jednoduchých objektů pomocí vlastností
- Příklad 5 – Porovnání složených objektů pomocí vlastností
- Příklad 6 – Porovnávání složitých objektů, které implementují IComparable
- Parametry
- Inputs
- Výstupy
- Notes
Syntaxe
Compare-Object <PSObject> <PSObject> >]
Popis
Cemlet Compare-Object
porovnává dvě sady objektů. Jedna sada objektů je referenční a druhá sada objektů je rozdílová.
Compare-Object
kontroluje dostupné metody porovnávání celého objektu. Pokud nenajde vhodnou metodu, zavolá metody ToString() vstupních objektů a porovná řetězcovévýsledky. Můžete zadat jednu nebo více vlastností, které se mají pro porovnání použít. Pokud jsou vlastnosti zadány, rutina porovnává pouze hodnoty těchto vlastností.
Výsledek porovnání udává, zda se hodnota vlastnosti vyskytovala pouze v referenčním objektu (<=
) nebo pouze v rozdílovém objektu (=>
). Pokud je použit parametr IncludeEqual, (==
) indikuje, že hodnota je v obou objektech.
Pokud jsou referenční nebo rozdílové objekty nulové ($null
), Compare-Object
vygeneruje chybu ukončení.
Některé příklady používají rozplývání, aby se zkrátila délka řádků ukázek kódu. Další informace naleznete v částio_Splatting.
Příklady
Příklad 1 – Porovnání obsahu dvou textových souborů
Tento příklad porovnává obsah dvou textových souborů. Příklad používá následující dva textové soubory,přičemž každá hodnota je na samostatném řádku.
-
Testfile1.txt
obsahuje hodnoty: pes, veverka a pták. -
Testfile2.txt
obsahuje hodnoty: kočka, pták a mýval.
Výstup zobrazí pouze řádky, které se mezi soubory liší. Testfile1.txt
je objekt reference (<=
) a Testfile2.txt
je objekt rozdílu (=>
). Řádky s obsahem, které se vyskytují v obou souborech, se nezobrazí.
Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)InputObject SideIndicator----------- -------------cat =>racoon =>dog <=squirrel <=
Příklad 2 – Porovnání každého řádku obsahu a vyloučení rozdílů
Tento příklad používá parametr ExcludeDifferent k porovnání každého řádku obsahu ve dvou textových souborech.
Od prostředí PowerShell 7.1 se při použití parametru ExcludeDifferent odvozuje IncludeEquala výstup obsahuje pouze řádky obsažené v obou souborech, jak ukazuje indikátor SideIndicator(==
).
$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject SideIndicator----------- -------------bird ==
Příklad 3 – Zobrazení rozdílu při použití parametru PassThru
Normálně Compare-Object
vrací typ PSCustomObject s následujícími vlastnostmi:
- Porovnávaný vstupní objekt
- Vlastnost SideIndicator, která ukazuje, ke kterému vstupnímu objektu výstup patří
Při použití parametru PassThru se typ objektu nezmění, ale instance vráceného objektu má přidanou vlastnost NoteProperty s názvem SideIndicator. SideIndicatorsukazuje, ke kterému vstupnímu objektu výstup patří.
Následující příklady ukazují různé typy výstupů.
$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===
Při použití parametru PassThru je vrácen původní typ objektu (System.Boolean). Všimněte si, ževýstup zobrazený výchozím formátem pro objekty System.Boolean nezobrazoval vlastnostSideIndicator. Vrácený objekt System.Boolean má však přidanou vlastnostNoteProperty.
Příklad 4 – Porovnání dvou jednoduchých objektů pomocí vlastností
V tomto příkladu porovnáváme dva různé řetězce, které mají stejnou délku.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqualLength SideIndicator------ ------------- 3 ==
Příklad 5 – Porovnání složených objektů pomocí vlastností
Tento příklad ukazuje chování při porovnávání složených objektů. V tomto příkladu ukládáme dva různé objekty procesu pro různé instance prostředí PowerShell. Obě proměnné obsahují objekty procesů se stejným názvem. Pokud jsou objekty porovnávány bez zadání parametru Property, rutina považuje objekty za stejné. Všimněte si, že hodnotaInputObject je stejná jako výsledek metody ToString(). Protože třídaSystem.Diagnostics.Process nemá rozhraní IComparable, rutina převede objekty na řetězce a pak porovná výsledky.
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 <=
Pokud zadáte vlastnosti, které se mají porovnat, rutina zobrazí rozdíly.
Pokud objekt implementuje IComparable, rutina vyhledá způsoby porovnání objektů. pokud jsou objekty různých typů, objekt Difference je převeden na typReferenceObject a poté porovnán.
V tomto příkladu porovnáváme řetězec s objektem TimeSpan. V prvním případě je řetězeckonvertován na TimeSpan, takže objekty jsou si rovny.
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 <=
V druhém případě je TimeSpan konvertován na řetězec, takže objekty jsou rozdílné.
Parametry
Určuje, že porovnávání má být citlivé na velká a malá písmena.
Typ: | PřepínačParametr |
Pozice: | Název |
Výchozí hodnota: | False |
Přijímá vstup z potrubí: | False |
Accept wildcard characters: | False |
Určuje kulturu, která se použije pro porovnání.
Typ: | Řetězec |
Pozice: | Název |
Výchozí hodnota: | Jedna |
Přijímá vstup z potrubí: | False |
Accept wildcard characters: | False |
Určuje objekty, které jsou porovnávány s referenčními objekty.
Typ: | PSObject |
Pozice: | 1 |
Výchozí hodnota: | None |
Přijímá vstup z potrubí: | True |
Accept wildcard characters: | False |
Určuje, že tato rutina zobrazí pouze charakteristiky porovnávaných objektů, které jsou stejné. Rozdíly mezi objekty jsou vyřazeny.
Použije-li se příkaz ExcludeDifferent s příkazem IncludeEqual, zobrazí se pouze řádky, které se shodují mezi srovnávanými a rozdílnými objekty.
Pokud je příkaz ExcludeDifferent zadán bez příkazu IncludeEqual, nezobrazí se žádný výstup.
Typ: | PřepínačParametr |
Pozice: | Název |
Výchozí hodnota: | False |
Přijmout vstup z potrubí: | False |
Accept wildcard characters: | False |
IncludeEqual zobrazuje shody mezi referenčními a rozdílovými objekty.
Ve výchozím nastavení obsahuje výstup také rozdíly mezi referenčními a rozdílovými objekty.
Typ: | PřepínačParametr |
Pozice: | Název |
Výchozí hodnota: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Při použití parametru PassThru Compare-Object
vynechá obal PSCustomObject kolem porovnávaných objektů a vrátí odlišné objekty beze změny.
Typ: | PřepínačParametr |
Pozice: | Název |
Výchozí hodnota: | False |
Přijmout vstup z potrubí: | False |
Accept wildcard characters: | False |
Určuje pole vlastností referenčních a rozdílových objektů k porovnání.
Hodnotou parametru Property může být nová vypočtená vlastnost. Vypočtená vlastnostmůže být blok skriptu nebo hashovací tabulka. Platné dvojice klíč-hodnota jsou:
- Výraz –
<string>
nebo<script block>
Další informace najdete v částio_vypočítaných_vlastnostech.
Typ: | Objekt |
Pozice: | Název |
Výchozí hodnota: | Jedna |
Přijímá vstup z potrubí: | False |
Accept wildcard characters: | False |
Určuje pole objektů použitých jako reference pro porovnání.
Typ: | PSObject |
Pozice: | 0 |
Výchozí hodnota: | None |
Přijímá vstup z potrubí: | False |
Accept wildcard characters: | False |
Určuje počet sousedních objektů, které Compare-Object
kontroluje při hledání shody v kolekci objektů. Compare-Object
zkoumá sousední objekty, když nenajde objektna stejné pozici v kolekci. Výchozí hodnota je ::MaxValue
, což znamená, žeCompare-Object
zkoumá celou kolekci objektů.
Typ: | Int32 |
Pozice: | Název |
Výchozí hodnota: | ::MaxValue |
Přijímá vstup z potrubí: | False |
Accept wildcard characters: | False |
Inputs
PSObject
Do parametru DifferenceObject můžete poslat objekt po pipeline.
Výstupy
Žádný
Jsou-li referenční objekt a rozdílový objekt stejné, není žádný výstup, pokud nepoužijete parametr IncludeEqual.
PSCustomObject
Jsou-li objekty rozdílné, Compare-Object
obalí rozdílné objekty do PSCustomObject
obalu s vlastností SideIndicator, který odkazuje na rozdíly.
Při použití parametru PassThru se typ objektu nezmění, ale instance vráceného objektu má přidanou vlastnost NoteProperty s názvem SideIndicator. SideIndicatorsukazuje, ke kterému vstupnímu objektu výstup patří.
Notes
Při použití parametru PassThru nemusí výstup zobrazený v konzole obsahovat vlastnostSideIndicator. Výchozí zobrazení formátu pro výstup typu objektu pomocíCompare-Object
neobsahuje vlastnost SideIndicator. Další informace naleznete vPříklad 3 v tomto článku.
- o_vypočítaných_vlastnostech
- Pro_každý_objekt
- Skupina-Objekt
- Měření-Objekt
- Nový-Object
- Select-Object
- Sort-Object
- Tee-Object
- Where-Object
- Get-Proces