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


Compare-Object

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

Syntax

Default (Alapértelmezett)

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ókért tekintse meg a következőket: 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. 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    <=

Ebben a példában a kimenet a következő információkat jeleníti meg:

  • cat és racoon a különbség objektumfájlban találhatók, de hiányzik a referenciaobjektum-fájlból
  • dog található squirrel a referenciaobjektum-fájlban, de hiányzik a különbségobjektum-fájlból

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.

Paramétertulajdonságok

Típus:SwitchParameter
Alapértelmezett érték:False
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:Named
Kötelező:False
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték:False

-Culture

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

Paramétertulajdonságok

Típus:String
Alapértelmezett érték:None
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:Named
Kötelező:False
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték:False

-DifferenceObject

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

Paramétertulajdonságok

Típus:

PSObject[]

Alapértelmezett érték:None
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:1
Kötelező:True
Folyamatból származó érték:True
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték: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.

Paramétertulajdonságok

Típus:SwitchParameter
Alapértelmezett érték:False
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:Named
Kötelező:False
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték: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.

Paramétertulajdonságok

Típus:SwitchParameter
Alapértelmezett érték:False
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:Named
Kötelező:False
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték: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.

Paramétertulajdonságok

Típus:SwitchParameter
Alapértelmezett érték:False
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:Named
Kötelező:False
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték: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ókért lásd a about_Calculated_Propertiesrészt.

Paramétertulajdonságok

Típus:

Object[]

Alapértelmezett érték:None
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:Named
Kötelező:False
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték:False

-ReferenceObject

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

Paramétertulajdonságok

Típus:

PSObject[]

Alapértelmezett érték:None
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:0
Kötelező:True
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték: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.

Paramétertulajdonságok

Típus:Int32
Alapértelmezett érték:[int32]::MaxValue
Támogatja a helyettesítő karaktereket:False
DontShow:False

Paraméterkészletek

(All)
Position:Named
Kötelező:False
Folyamatból származó érték:False
Folyamatból származó érték tulajdonságnév alapján:False
Fennmaradó argumentumokból származó érték:False

CommonParameters

Ez a parancsmag a következő gyakori paramétereket támogatja: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction és -WarningVariable. További információért lásd about_CommonParameters.

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.