Megosztás a következőn keresztül:


Compare-Object

Két objektumkészletet hasonlít össze.

Syntax

Compare-Object
       [-ReferenceObject] <PSObject[]>
       [-DifferenceObject] <PSObject[]>
       [-SyncWindow <Int32>]
       [-Property <Object[]>]
       [-ExcludeDifferent]
       [-IncludeEqual]
       [-PassThru]
       [-Culture <String>]
       [-CaseSensitive]
       [<CommonParameters>]

Description

A Compare-Object parancsmag két objektumkészletet hasonlít össze. Az egyik objektumkészlet a hivatkozási, a másik pedig a különbség.

Compare-Object egy teljes objektum összehasonlítására használható módszereket keres. Ha nem talál megfelelő metódust, meghívja a bemeneti objektumok ToString() metódusát, és összehasonlítja a sztring eredményeit. Az összehasonlításhoz egy vagy több tulajdonságot is megadhat. A tulajdonságok megadásakor a parancsmag csak ezeknek a tulajdonságoknak az értékeit hasonlítja össze.

Az összehasonlítás eredménye azt jelzi, hogy egy tulajdonságérték csak a hivatkozási objektumban (<=) jelent-e meg, vagy csak a különbségben objektumban (=>). Ha az IncludeEqual paramétert használja, (==) azt jelzi, hogy az érték mindkét objektumban szerepel.

Ha a hivatkozási vagy a különbség objektumok null ($null), Compare-Object végződési hibát okoz.

Néhány példa splatting használatával csökkenti a kódminták vonalhosszát. További információ: about_Splatting.

Példák

1. példa – Két szövegfájl tartalmának összehasonlítása

Ez a példa két szövegfájl tartalmát hasonlítja össze. A példa a következő két szövegfájlt használja, mindegyik érték egy külön sorban található.

  • Testfile1.txt a következő értékeket tartalmazza: kutya, mókus és madár.
  • Testfile2.txt a következő értékeket tartalmazza: macska, madár és racoon.

A kimenet csak azokat a sorokat jeleníti meg, amelyek különböznek a fájloktól. Testfile1.txt az hivatkozási objektum (<=), és Testfile2.txtaz különbség objektum (=>). A két fájlban megjelenő tartalommal rendelkező sorok nem jelennek meg.

$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    <=

2. példa – Az egyes tartalomsorok összehasonlítása és a különbségek kizárása

Ez a példa a ExcludeDifferent paramétert használja két szövegfájl egyes sorainak összehasonlításához.

A PowerShell 7.1-ben a ExcludeDifferent paraméter használatakor a rendszer IncludeEqual következtet, és a kimenet csak a két fájlban lévő sorokat tartalmazza, ahogy az SideIndicator (==) is mutatja.

$objects = @{
  ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt)
  DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)
}
Compare-Object @objects -ExcludeDifferent

InputObject SideIndicator
----------- -------------
bird        ==

3. példa – A Különbség megjelenítése a PassThru paraméter használatakor

A Compare-Object általában egy PSCustomObject típust ad vissza a következő tulajdonságokkal:

  • Az InputObject összehasonlítása
  • A SideIndicator tulajdonság azt mutatja, hogy melyik bemeneti objektumhoz tartozik a kimenet

Ha a PassThru paramétert használja, az objektum Típus nem változik, de a visszaadott objektum példánya hozzáadott NotePropertySideIndicatornéven. SideIndicator megmutatja, hogy melyik bemeneti objektumhoz tartozik a kimenet.

Az alábbi példák a különböző kimeneti típusokat mutatják be.

$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===

PassThruhasználatakor a rendszer visszaadja az eredeti objektumtípust (System.Boolean). Figyelje meg, hogy az System.Boolean objektumok alapértelmezett formátuma által megjelenített kimenet nem jeleníti meg a SideIndicator tulajdonságot. A visszaadott System.Boolean objektum azonban hozzáadta NoteProperty.

4. példa – Két egyszerű objektum összehasonlítása tulajdonságok használatával

Ebben a példában két különböző, azonos hosszúságú sztringet hasonlítunk össze.

$objects = @{
  ReferenceObject = 'abc'
  DifferenceObject = 'xyz'
  Property = 'Length'
}
Compare-Object @objects -IncludeEqual

Length SideIndicator
------ -------------
     3 ==

5. példa – Összetett objektumok összehasonlítása tulajdonságok használatával

Ez a példa az összetett objektumok összehasonlításának viselkedését mutatja be. Ebben a példában két különböző folyamatobjektumot tárolunk a PowerShell különböző példányaihoz. Mindkét változó azonos nevű folyamatobjektumokat tartalmaz. Ha az objektumokat a tulajdonság paraméter megadása nélkül hasonlítja össze, a parancsmag egyenlőnek tekinti az objektumokat. Figyelje meg, hogy a InputObject értéke megegyezik a ToString() metódus eredményével. Mivel a System.Diagnostics.Process osztály nem rendelkezik az IComparable felülettel, a parancsmag sztringekké alakítja az objektumokat, majd összehasonlítja az eredményeket.

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 <=

Az összehasonlítandó tulajdonságok megadásakor a parancsmag megjeleníti a különbségeket.

6. példa – Az IComparable-t implementáló összetett objektumok összehasonlítása

Ha az objektum megvalósítja IComparable, a parancsmag megkeresi az objektumok összehasonlításának módjait. Ha az objektumok különböző típusúak, a Különbség objektum a ReferenceObject típusára lesz konvertálva, majd összehasonlítja.

Ebben a példában egy sztringet hasonlítunk össze egy TimeSpan objektummal. Az első esetben a sztring TimeSpan lesz, így az objektumok egyenlők.

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       <=

A második esetben a TimeSpan sztringgé alakul, így az objektum eltér.

Paraméterek

-CaseSensitive

Azt jelzi, hogy az összehasonlításoknak megkülönböztetik a kis- és nagybetűket.

Típus:SwitchParameter
Position:Named
Alapértelmezett érték:False
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-Culture

Az összehasonlításhoz használandó kultúrát adja meg.

Típus:String
Position:Named
Alapértelmezett érték:None
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-DifferenceObject

A hivatkozási objektumokkal összehasonlított objektumokat adja meg.

Típus:PSObject[]
Position:1
Alapértelmezett érték:None
Kötelező:True
Folyamatbemenet elfogadása:True
Helyettesítő karakterek elfogadása:False

-ExcludeDifferent

Azt jelzi, hogy ez a parancsmag csak az összehasonlított objektumok azonos jellemzőit jeleníti meg. A rendszer elveti az objektumok közötti különbségeket.

A ExcludeDifferent és IncludeEqual használatával csak a hivatkozási és különbség objektumok közötti vonalakat jelenítheti meg.

Ha ExcludeDifferentIncludeEqualnélkül van megadva, nincs kimenet.

Típus:SwitchParameter
Position:Named
Alapértelmezett érték:False
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-IncludeEqual

IncludeEqual megjeleníti a hivatkozási és különbség objektumok közötti egyezéseket.

Alapértelmezés szerint a kimenet tartalmazza a hivatkozási és objektumok közötti különbséget is.

Típus:SwitchParameter
Position:Named
Alapértelmezett érték:False
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-PassThru

Ha a PassThru paramétert használja, Compare-Object kihagyja a PSCustomObject burkolót az összehasonlított objektumok köré, és változatlanul visszaadja a különböző objektumokat.

Típus:SwitchParameter
Position:Named
Alapértelmezett érték:False
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-Property

A referencia- és összehasonlítandó objektumok tulajdonságainak tömbje.

A tulajdonság paraméter értéke új számított tulajdonság lehet. A számított tulajdonság lehet szkriptblokk vagy kivonattábla. Az érvényes kulcs-érték párok a következők:

  • Kifejezés – <string> vagy <script block>

További információ: about_Calculated_Properties.

Típus:Object[]
Position:Named
Alapértelmezett érték:None
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-ReferenceObject

Az összehasonlításhoz referenciaként használt objektumtömböt adja meg.

Típus:PSObject[]
Position:0
Alapértelmezett érték:None
Kötelező:True
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-SyncWindow

Megadja azoknak a szomszédos objektumoknak a számát, amelyek Compare-Object szempontokat, miközben egyezést keresnek egy objektumgyűjteményben. Compare-Object megvizsgálja a szomszédos objektumokat, ha nem találja az objektumot ugyanabban a helyzetben egy gyűjteményben. Az alapértelmezett érték a [int32]::MaxValue, ami azt jelenti, hogy Compare-Object a teljes objektumgyűjteményt megvizsgálja.

Nagy gyűjtemények használata esetén előfordulhat, hogy az alapértelmezett érték nem hatékony, de pontos. Ha kisebb értéket ad meg SyncWindow, az növelheti a teljesítményt, de kisebb pontosságot eredményezhet.

Típus:Int32
Position:Named
Alapértelmezett érték:[int32]::MaxValue
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

Bevitelek

PSObject

A folyamaton belül elküldhet egy objektumot a DifferenceObject paraméternek.

Kimenetek

None

Alapértelmezés szerint ez a parancsmag nem ad vissza kimenetet, ha a ReferenceObject és a DifferenceObject azonosak.

PSCustomObject

Ha az objektumok eltérnek, ez a parancsmag egy PSCustomObject burkolóban burkolja a különböző objektumokat egy SideIndicator tulajdonsággal, hogy hivatkozzon a különbségekre.

Ha az IncludeEqual paramétert használja, és az objektumok megegyeznek, a parancsmag egy PSCustomObject az SideIndicator tulajdonsággal ==.

Ha a PassThru paramétert használja, az objektum Típus nem változik, de a visszaadott objektum példánya hozzáadott NotePropertySideIndicatornéven. SideIndicator megmutatja, hogy melyik bemeneti objektumhoz tartozik a kimenet.

Jegyzetek

A PowerShell a következő aliasokat tartalmazza Compare-Object:

  • Windows:
    • compare
    • diff

A PassThru paraméter használatakor előfordulhat, hogy a konzolon megjelenő kimenet nem tartalmazza a SideIndicator tulajdonságot. Az objektumtípus kimenetének alapértelmezett formátumnézete Compare-Object nem tartalmazza a SideIndicator tulajdonságot. További információ: 3. példa ebben a cikkben.