Compare-Object
Porovná dvě sady objektů.
Syntaxe
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
Rutina Compare-Object
porovnává dvě sady objektů. Jedna sada objektů je odkaz a druhá sada objektů je rozdíl.
Compare-Object
kontroluje dostupné metody porovnání celého objektu. Pokud nemůže najít vhodnou metodu, volá metody ToString() vstupních objektů a porovnává výsledky řetězce. Můžete zadat jednu nebo více vlastností, které se mají použít k porovnání. Pokud jsou k dispozici vlastnosti, rutina porovnává pouze hodnoty těchto vlastností.
Výsledek porovnání označuje, zda se hodnota vlastnosti objevila pouze v referenčním objektu (<=
) nebo pouze v objektu rozdílu (=>
). Pokud se použije parametr IncludeEqual, (==
) indikuje hodnotu v obou objektech.
Pokud odkaz nebo rozdílové objekty mají hodnotu null ($null
), Compare-Object
vygeneruje ukončující chybu.
Některé příklady používají k zmenšení délky řádku ukázek kódu. Další informace najdete v tématu about_Splatting.
Příklady
Příklad 1 – porovnání obsahu dvou textových souborů
Tento příklad porovnává obsah dvou textových souborů. V příkladu se používají 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 racoon.
Ve výstupu se zobrazí jenom řádky, které se mezi soubory liší. Testfile1.txt
je referenční objekt (<=
) a Testfile2.txt
je rozdílový objekt (=>
). Řádky s obsahem, které se zobrazují v obou souborech, se nezobrazují.
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í jednotlivých řádků 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 PowerShellu 7.1 při použití parametru ExcludeDifferent je IncludeEqual odvozen a výstup obsahuje pouze řádky obsažené v obou souborech, jak je znázorněno parametrem 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 ==
Příklad 3 – zobrazení rozdílu při použití parametru PassThru
Compare-Object
Za normálních okolností vrátí typ PSCustomObject s následujícími vlastnostmi:
- Porovnávaný objekt InputObject
- Vlastnost SideIndicator zobrazující vstupní objekt, do kterého výstup patří
Při použití PassThru parametru Typ objektu se nezmění, ale instance vráceného objektu má přidanou NoteProperty s názvem SideIndicator. SideIndicator ukazuje, do kterého vstupního objektu patří výstup.
Následující příklady ukazují různé typy výstupu.
$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===
Při použití PassThru se vrátí původní typ objektu (System.Boolean). Všimněte si, jak výstup zobrazený ve výchozím formátu pro System.Boolean objekty nezobradil SideIndicator vlastnost. Vrácený System.Boolean objekt má přidaný NoteProperty.
Příklad 4 – porovnání dvou jednoduchých objektů pomocí vlastností
V tomto příkladu porovnáme dva různé řetězce se stejnou délkou.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual
Length SideIndicator
------ -------------
3 ==
Příklad 5 – porovnání složitých objektů pomocí vlastností
Tento příklad ukazuje chování při porovnávání složitých objektů. V tomto příkladu ukládáme dva různé objekty procesu pro různé instance PowerShellu. Obě proměnné obsahují objekty procesu se stejným názvem. Při porovnávání objektů bez zadání parametru Property rutina považuje objekty za stejné. Všimněte si, že hodnota InputObject je stejná jako výsledek ToString() metoda. Vzhledem k tomu, System.Diagnostics.Process třída nemá IComparable rozhraní, 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 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 <=
Když zadáte vlastnosti, které se mají porovnat, zobrazí rutina rozdíly.
Příklad 6 – Porovnání složitých objektů, které implementují IComparable
Pokud objekt implementuje IComparable, rutina hledá způsoby porovnání objektů. Pokud jsou objekty různé typy, rozdíl objekt je převeden na typ ReferenceObject pak porovná.
V tomto příkladu porovnáváme řetězec s objektem TimeSpan . V prvním případě je řetězec převeden na TimeSpan , takže objekty jsou stejné.
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 <=
Ve druhém případě se TimeSpan převede na řetězec, takže se objekt liší.
Parametry
-CaseSensitive
Označuje, že porovnání by měla rozlišovat malá a velká písmena.
Typ: | SwitchParameter |
Position: | Named |
Default value: | False |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-Culture
Určuje jazykovou verzi, která se má použít pro porovnání.
Typ: | String |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-DifferenceObject
Určuje objekty, které jsou porovnány s referenčními objekty.
Typ: | PSObject[] |
Position: | 1 |
Default value: | None |
Vyžadováno: | True |
Přijmout vstup kanálu: | True |
Přijmout zástupné znaky: | False |
-ExcludeDifferent
Označuje, že tato rutina zobrazuje pouze vlastnosti porovnávaných objektů, které jsou stejné. Rozdíly mezi objekty jsou zahozeny.
Použití ExcludeDifferent s IncludeEqual k zobrazení pouze čáry, které odpovídají mezi odkazem a rozdíl objekty.
Pokud je zadán ExcludeDifferent bez IncludeEqual, neexistuje žádný výstup.
Typ: | SwitchParameter |
Position: | Named |
Default value: | False |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-IncludeEqual
IncludeEqual zobrazí shody mezi odkazem a rozdílovými objekty.
Ve výchozím nastavení výstup obsahuje také rozdíly mezi objekty odkazu a rozdílu .
Typ: | SwitchParameter |
Position: | Named |
Default value: | False |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-PassThru
Pokud použijete parametr PassThru , Compare-Object
vynechá obálku PSCustomObject kolem porovnávaných objektů a vrátí rozdílové objekty beze změny.
Typ: | SwitchParameter |
Position: | Named |
Default value: | False |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-Property
Určuje pole vlastností odkazu a objektů rozdílů , které se mají porovnat.
Hodnota parametru Property může být nová počítaná vlastnost. Počítaná vlastnost může být blok skriptu nebo tabulka hash. Platné páry klíč-hodnota jsou:
- Výraz –
<string>
nebo<script block>
Další informace najdete v tématu about_Calculated_Properties.
Typ: | Object[] |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-ReferenceObject
Určuje pole objektů, které se používají jako odkaz pro porovnání.
Typ: | PSObject[] |
Position: | 0 |
Default value: | None |
Vyžadováno: | True |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-SyncWindow
Určuje počet sousedních objektů, které Compare-Object
kontroluje při hledání shody v kolekci objektů. Compare-Object
prozkoumá sousední objekty, pokud nenajde objekt ve stejné pozici v kolekci. Výchozí hodnota je [Int32]::MaxValue
, což znamená, že Compare-Object
prozkoumá celou kolekci objektů.
Při práci s velkými kolekcemi nemusí být výchozí hodnota efektivní, ale je přesná. Zadání menší hodnoty pro SyncWindow může zvýšit výkon, ale může mít nižší přesnost.
Typ: | Int32 |
Position: | Named |
Default value: | [Int32]::MaxValue |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
Vstupy
Objekt můžete odeslat dolů kanálu do parametru DifferenceObject .
Výstupy
None
Ve výchozím nastavení tato rutina nevrátí žádný výstup, pokud jsou objekty ReferenceObject a DifferenceObject stejné.
Pokud se objekty liší, tato rutina zabalí různé objekty do obálky PSCustomObject s vlastností SideIndicator odkazující na rozdíly.
Pokud použijete includeEqual parametr a objekty jsou stejné, rutina vrátí objekty zabalené v PSCustomObject s SideIndicator vlastnost nastavena na ==
.
Při použití PassThru parametru Typ objektu se nezmění, ale instance vráceného objektu má přidanou NoteProperty s názvem SideIndicator. SideIndicator ukazuje, do kterého vstupního objektu patří výstup.
Poznámky
PowerShell obsahuje následující aliasy pro Compare-Object
:
- Windows:
compare
diff
Při použití parametru PassThru nemusí výstup zobrazený v konzole zahrnovat SideIndicator vlastnost. Výchozí zobrazení formátu výstupu typu Compare-Object
objektu nezahrnuje SideIndicator vlastnost. Další informace naleznete v příkladu 3 v tomto článku.