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.txt
az 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
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.
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.