Sdílet prostřednictvím


Compare-Object

Porovná dvě sady objektů.

Syntax

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.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ší. Řá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.

  • cat a racoon nachází se v souboru objektu rozdílu, ale chybí v souboru referenčního objektu.
  • dog a squirrel jsou 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 -IncludeEqual -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í ExcludeDifferent IncludeEqual zobrazíte pouze řádky, které odpovídají odkazu a rozdíly objekty.

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

IncludeEqual zobrazí shodu mezi a rozdíly objekty.

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.

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

Windows PowerShell obsahuje následující aliasy pro Compare-Object:

  • 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.