Compare-Object
Jämför två uppsättningar med objekt.
Syntax
Default (Standard)
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
Cmdleten Compare-Object jämför två uppsättningar objekt. En uppsättning objekt är referensoch den andra uppsättningen objekt är skillnad.
Compare-Object söker efter tillgängliga metoder för att jämföra ett helt objekt. Om den inte hittar någon lämplig metod anropas ToString() metoder för indataobjekten och jämför strängresultatet. Du kan ange en eller flera egenskaper som ska användas för jämförelse. När egenskaper tillhandahålls jämför cmdleten endast värdena för dessa egenskaper.
Resultatet av jämförelsen anger om ett egenskapsvärde endast visas i -referensen -objektet (<=) eller endast i skillnad objekt (=>). Om parametern IncludeEqual används anger (==) att värdet finns i båda objekten.
Om -referensen eller den skillnaden objekt är null ($null), genererar Compare-Object ett avslutande fel.
Vissa exempel använder splatting för att minska radlängden för kodexemplen. Mer information finns i about_Splatting.
Exempel
Exempel 1 – Jämför innehållet i två textfiler
I det här exemplet jämförs innehållet i två textfiler. I exemplet används följande två textfiler, med varje värde på en separat rad.
-
Testfile1.txtinnehåller värdena: hund, ekorre och fågel. -
Testfile2.txtinnehåller värdena: katt, fågel och racoon.
Utdata visar bara de rader som skiljer sig mellan filerna. Rader med innehåll som visas i båda filerna visas inte.
$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 <=
I det här exemplet visar utdata följande information
-
catochracoonfinns i skillnadsobjektfilen, men saknas i referensobjektfilen -
dogochsquirrelfinns i referensobjektfilen, men saknas i skillnadsobjektfilen
Exempel 2 – Jämför varje innehållsrad och exkludera skillnaderna
I det här exemplet används parametern ExcludeDifferent för att jämföra varje innehållsrad i två textfiler.
Från och med PowerShell 7.1, när du använder parametern ExcludeDifferent, härleds IncludeEqual och utdata innehåller endast rader som finns i båda filerna, vilket visas av 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 ==
Exempel 3 – Visa skillnaden när du använder parametern PassThru
Normalt returnerar Compare-Object en PSCustomObject- typ med följande egenskaper:
- InputObject- jämförs
- Egenskapen SideIndicator som visar vilket indataobjekt som utdata tillhör
När du använder parametern PassThru ändras inte typ för objektet, men instansen av det returnerade objektet har en NoteProperty- med namnet SideIndicator. SideIndicator visar vilket indataobjekt som utdata tillhör.
Följande exempel visar de olika utdatatyperna.
$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===
När du använder PassThrureturneras den ursprungliga objekttypen (System.Boolean). Observera att utdata som visas som standardformat för System.Boolean-objekt inte visade egenskapen SideIndicator. Det returnerade objektet System.Boolean har dock det tillagda NoteProperty-.
Exempel 4 – Jämför två enkla objekt med hjälp av egenskaper
I det här exemplet jämför vi två olika strängar som har samma längd.
$objects = @{
ReferenceObject = 'abc'
DifferenceObject = 'xyz'
Property = 'Length'
}
Compare-Object @objects -IncludeEqual
Length SideIndicator
------ -------------
3 ==
Exempel 5 – Jämföra komplexa objekt med hjälp av egenskaper
Det här exemplet visar beteendet när du jämför komplexa objekt. I det här exemplet lagrar vi två olika processobjekt för olika instanser av PowerShell. Båda variablerna innehåller processobjekt med samma namn. När objekten jämförs utan att ange parametern egenskap anser cmdleten att objekten är lika. Observera att värdet för InputObject- är detsamma som resultatet av metoden ToString(). Eftersom klassen System.Diagnostics.Process inte har gränssnittet IComparable konverterar cmdleten objekten till strängar och jämför sedan resultatet.
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 <=
När du anger vilka egenskaper som ska jämföras visar cmdleten skillnaderna.
Exempel 6 – Jämföra komplexa objekt som implementerar IComparable
Om objektet implementerar IComparablesöker cmdleten efter sätt att jämföra objekten. Om objekten är olika typer konverteras objektet Difference till typen av ReferenceObject- sedan jämförs.
I det här exemplet jämför vi en sträng med ett TimeSpan- objekt. I det första fallet konverteras strängen till en TimeSpan- så att objekten är lika.
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 <=
I det andra fallet konverteras TimeSpan- till en sträng så att objektet skiljer sig.
Parametrar
-CaseSensitive
Anger att jämförelser ska vara skiftlägeskänsliga.
Parameteregenskaper
| Typ: | SwitchParameter |
| Standardvärde: | False |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-Culture
Anger vilken kultur som ska användas för jämförelser.
Parameteregenskaper
| Typ: | String |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-DifferenceObject
Anger de objekt som jämförs med referens objekt.
Parameteregenskaper
| Typ: | PSObject[] |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | 1 |
| Obligatorisk: | True |
| Värde från pipeline: | True |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-ExcludeDifferent
Anger att denna cmdlet endast visar egenskaperna för jämförd objekt som är lika med. Skillnaderna mellan objekten ignoreras.
Använd ExcludeDifferent med IncludeEqual om du bara vill visa de rader som matchar mellan referens och skillnad objekt.
Om ExcludeDifferent anges utan IncludeEqualfinns det inga utdata.
Parameteregenskaper
| Typ: | SwitchParameter |
| Standardvärde: | False |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-IncludeEqual
IncludeEqual visar matchningarna mellan -referensen och skillnad objekt.
Som standard innehåller utdata också skillnaderna mellan -referensen och skillnad objekt.
Parameteregenskaper
| Typ: | SwitchParameter |
| Standardvärde: | False |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-PassThru
När du använder parametern PassThru utelämnar Compare-ObjectPSCustomObject wrapper runt de jämförda objekten och returnerar de olika objekten oförändrade.
Parameteregenskaper
| Typ: | SwitchParameter |
| Standardvärde: | False |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-Property
Anger en matris med egenskaper för referens och skillnad objekt att jämföra.
Värdet för parametern Property kan vara en ny beräknad egenskap. Den beräknade egenskapen kan vara ett skriptblock eller en hash-tabell. Giltiga nyckel/värde-par är:
- Uttryck –
<string>eller<script block>
Mer information finns i about_Calculated_Properties.
Parameteregenskaper
| Typ: | Object[] |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-ReferenceObject
Anger en matris med objekt som används som referens för jämförelse.
Parameteregenskaper
| Typ: | PSObject[] |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | 0 |
| Obligatorisk: | True |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-SyncWindow
Anger antalet intilliggande objekt som Compare-Object inspekterar när du letar efter en matchning i en samling objekt.
Compare-Object undersöker närliggande objekt när det inte hittar objektet i samma position i en samling. Standardvärdet är [int32]::MaxValue, vilket innebär att Compare-Object undersöker hela objektsamlingen.
När du arbetar med stora samlingar kanske standardvärdet inte är effektivt men är korrekt. Om du anger ett mindre värde för SyncWindow kan öka prestandan men ha lägre noggrannhet.
Parameteregenskaper
| Typ: | Int32 |
| Standardvärde: | [int32]::MaxValue |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
CommonParameters
Den här cmdleten stöder vanliga parametrar: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction och -WarningVariable. Mer information finns i about_CommonParameters.
Indata
PSObject
Du kan skicka ett objekt nedåt i pipelinen till parametern DifferenceObject.
Utdata
None
Som standard returnerar den här cmdleten inga utdata när ReferenceObject- och DifferenceObject- är desamma.
PSCustomObject
När objekten skiljer sig omsluter den här cmdleten de olika objekten i en PSCustomObject wrapper med en SideIndicator egenskap för att referera till skillnaderna.
När du använder parametern IncludeEqual och objekten är desamma returnerar cmdleten objekten som omsluts i en PSCustomObject- med egenskapen SideIndicator inställd på ==.
När du använder parametern PassThru ändras inte typ för objektet, men instansen av det returnerade objektet har en NoteProperty- med namnet SideIndicator. SideIndicator visar vilket indataobjekt som utdata tillhör.
Kommentarer
PowerShell innehåller följande alias för Compare-Object:
- Windows:
comparediff
När du använder parametern PassThru kanske utdata som visas i konsolen inte innehåller egenskapen SideIndicator. Standardformatvyn för objekttypens utdata av Compare-Object innehåller inte egenskapen SideIndicator. Mer information finns i Exempel 3 i den här artikeln.