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ás, 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ódusait, é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 referenciaobjektumban (<=) vagy csak a különbségobjektumban (=>) jelent-e meg. Ha az IncludeEqual paramétert használja, (==) azt jelzi, hogy az érték mindkét objektumban szerepel.

Ha a hivatkozás vagy a különbségobjektumok null értékűek ($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 a referenciaobjektum (<=) és Testfile2.txta különbségobjektum (=>). A két fájlban megjelenő tartalommal rendelkező sorok nem jelennek meg.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)

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 az ExcludeDifferent paramétert használja két szövegfájl egyes sorainak összehasonlítására.

A PowerShell 7.1-ben az ExcludeDifferent paraméter használatakor az IncludeEqual kikövetkeztetett, és a kimenet csak a két fájlban lévő sorokat tartalmazza, ahogyan azt a 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

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

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

A PassThru paraméter használata esetén az objektum típusa nem változik, de a visszaadott objektum példánya hozzáadta a SideIndicator nevű NoteProperty paramétert. A SideIndicator megjeleníti, 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===

A PassThru használatakor a rendszer visszaadja az eredeti objektumtípust (System.Boolean). Figyelje meg, hogy a System.Boolean objektumok alapértelmezett formátuma által megjelenített kimenet nem jeleníti meg a SideIndicator tulajdonságot. A visszaadott System.Boolean objektumban azonban megjelenik a hozzáadott 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.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -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 az 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 az IComparable parancsmagot, 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ává lesz konvertálva, majd összehasonlítja.

Ebben a példában egy sztringet hasonlítunk össze egy TimeSpan objektummal. Az első esetben a sztringet a rendszer TimeSpan értékké alakítja, í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.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

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

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DifferenceObject

Megadja a referenciaobjektumokkal összehasonlított objektumokat.

Type:PSObject[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters: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.

Az ExcludeDifferent és az IncludeEqual használatával csak a hivatkozás és a különbségobjektumok közötti vonalak jelennek meg.

Ha az ExcludeDifferent értéke IncludeEqual nélkül van megadva, nincs kimenet.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IncludeEqual

Az IncludeEqual megjeleníti a hivatkozás és a különbségobjektumok közötti egyezéseket.

Alapértelmezés szerint a kimenet tartalmazza a hivatkozás és a különbségobjektumok közötti különbségeket is.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

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

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Az összehasonlítandó referencia- és különbségobjektumok tulajdonságainak tömbje.

A Tulajdonság paraméter értéke lehet egy új számított tulajdonság. 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.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ReferenceObject

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

Type:PSObject[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-SyncWindow

Megadja azoknak a szomszédos objektumoknak a számát, amelyek Compare-Object egy objektumgyűjteményben keresnek egyezést. 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 az [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 a SyncWindow-hoz, az növelheti a teljesítményt, de kisebb pontosságot eredményezhet.

Type:Int32
Position:Named
Default value:[Int32]::MaxValue
Required:False
Accept pipeline input:False
Accept wildcard characters: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 az DifferenceObject azonos.

PSCustomObject

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

Ha az IncludeEqual paramétert használja, és az objektumok megegyeznek, a parancsmag a PSCustomObjectbeburkolt objektumokat adja vissza a SideIndicator tulajdonság beállításával==.

A PassThru paraméter használata esetén az objektum típusa nem változik, de a visszaadott objektum példánya hozzáadta a SideIndicator nevű NoteProperty paramétert. A SideIndicator megjeleníti, hogy melyik bemeneti objektumhoz tartozik a kimenet.

Jegyzetek

A PowerShell a következő aliasokat Compare-Objecttartalmazza:

  • Windows:
    • compare
    • diff

A PassThru paraméter használatakor előfordulhat, hogy a konzolon megjelenített 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.