Compare-Object
Porovná dvě sady objektů.
Syntaxe
Default (Výchozí)
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 odkaza 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 odkaz objektu (<=) nebo pouze v rozdílu objektu (=>). Pokud se použije parametr IncludeEqual, (==) indikuje hodnotu v obou objektech.
Pokud odkaz nebo rozdíl 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 naleznete v části s názvem 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.txtobsahuje hodnoty: pes, veverka a pták. -
Testfile2.txtobsahuje hodnoty: kočka, pták a racoon.
Ve výstupu se zobrazí jenom řádky, které se mezi soubory liší. Řádky s obsahem, které se zobrazují v obou souborech, se nezobrazují.
$objects = @{
ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt)
DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)
}
Compare-Object @objects
InputObject SideIndicator
----------- -------------
cat =>
racoon =>
dog <=
squirrel <=
V tomto příkladu výstup zobrazí následující informace.
-
cataracoonnachází se v souboru objektu rozdílu, ale chybí v souboru referenčního objektu. -
dogasquirreljsou nalezeny v souboru referenčního objektu, ale chybí v souboru objektu rozdílu.
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.
$objects = @{
ReferenceObject = 'abc'
DifferenceObject = 'xyz'
Property = 'Length'
}
Compare-Object @objects -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.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Culture
Určuje jazykovou verzi, která se má použít pro porovnání.
Vlastnosti parametru
| Typ: | String |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-DifferenceObject
Určuje objekty, které jsou porovnány s odkaz objekty.
Vlastnosti parametru
| Typ: | PSObject[] |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | 1 |
| Povinné: | True |
| Hodnota z kanálu: | True |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-ExcludeDifferent
Označuje, že tato rutina zobrazuje pouze vlastnosti porovnávaných objektů, které jsou stejné. Rozdíly mezi objekty jsou zahozeny.
Pomocí
Pokud ExcludeDifferent je zadán bez IncludeEqual, neexistuje žádný výstup.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-IncludeEqual
Ve výchozím nastavení výstup obsahuje také rozdíly mezi odkaz a rozdíl objekty.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-PassThru
Když použijete parametr PassThru, Compare-Object vynechá PSCustomObject obálku kolem porovnávaných objektů a vrátí odlišné objekty beze změny.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Property
Určuje pole vlastností odkazu a rozdíl objekty k porovnání.
Hodnota parametru Vlastnost může být nově vypočí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 naleznete v dokumentaci about_Calculated_Properties.
Vlastnosti parametru
| Typ: | Object[] |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-ReferenceObject
Určuje pole objektů, které se používají jako odkaz pro porovnání.
Vlastnosti parametru
| Typ: | PSObject[] |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | 0 |
| Povinné: | True |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | 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.
Vlastnosti parametru
| Typ: | Int32 |
| Default value: | [int32]::MaxValue |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
CommonParameters
Tato rutina podporuje běžné parametry: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction a -WarningVariable. Další informace najdete v about_CommonParameters.
Vstupy
PSObject
Objekt můžete odeslat do DifferenceObject parametru.
Výstupy
None
Ve výchozím nastavení tato rutina nevrátí žádný výstup, pokud jsou objekty ReferenceObject a DifferenceObject stejné.
PSCustomObject
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:
comparediff
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.