Sdílet prostřednictvím


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.txtje referenční objekt (<=) a Testfile2.txtje 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

PSObject

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

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