Compare-Object

Jämför två uppsättningar med objekt.

Syntax

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 med objekt. En uppsättning objekt är referensen och den andra uppsättningen objekt är skillnaden.

Compare-Object söker efter tillgängliga metoder för att jämföra ett helt objekt. Om den inte kan hitta en lämplig metod anropar den ToString() -metoderna 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 referensobjektet (<=) eller endast i differensobjektet (=>). Om parametern IncludeEqual används anger (==) att värdet finns i båda objekten.

Om referensen eller differensobjekten är null ($null), Compare-Object genererar 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.txt innehåller värdena: hund, ekorre och fågel.
  • Testfile2.txt innehåller värdena: katt, fågel och racoon.

Utdata visar bara de rader som skiljer sig mellan filerna. Testfile1.txtär referensobjektet (<=) och Testfile2.txtär differensobjektet (=>). Rader med innehåll som visas i båda filerna visas inte.

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

InputObject SideIndicator
----------- -------------
cat         =>
racoon      =>
dog         <=
squirrel    <=

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

Compare-Object Normalt returnerar 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 objektets typ, men instansen av objektet som returneras har en tillagd 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 PassThru returneras 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 lagt till 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.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -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 egenskapsparametern 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 IComparable-gränssnittet 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 IComparable söker cmdleten efter sätt att jämföra objekten. Om objekten är olika typer konverteras differensobjektet till typen av ReferenceObject och jämförs sedan.

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.

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

-Culture

Anger vilken kultur som ska användas för jämförelser.

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

-DifferenceObject

Anger de objekt som jämförs med referensobjekten.

Type:PSObject[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters: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 för att endast visa de rader som matchar mellan referens- och skillnadsobjekten.

Om ExcludeDifferent har angetts utan IncludeEqual finns det inga utdata.

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

-IncludeEqual

IncludeEqual visar matchningarna mellan referens- och skillnadsobjekten.

Som standard innehåller utdata också skillnaderna mellan referens- och skillnadsobjekten.

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

-PassThru

När du använder parametern PassThru utelämnar Compare-ObjectPSCustomObject-omslutningen runt de jämförda objekten och returnerar de olika objekten, oförändrade.

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

-Property

Anger en matris med egenskaper för referens- och skillnadsobjekten som ska jämföras.

Värdet för egenskapsparametern 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.

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

-ReferenceObject

Anger en matris med objekt som används som referens för jämförelse.

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

-SyncWindow

Anger antalet intilliggande objekt som Compare-Object inspekteras 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. Att ange ett mindre värde för SyncWindow kan öka prestandan men kan ha lägre noggrannhet.

Type:Int32
Position:Named
Default value:[Int32]::MaxValue
Required:False
Accept pipeline input:False
Accept wildcard characters:False

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 är olika omsluter den här cmdleten de olika objekten i en PSCustomObject-omslutning med egenskapen SideIndicator 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 objektets typ, men instansen av objektet som returneras har en tillagd NoteProperty med namnet SideIndicator. SideIndicator visar vilket indataobjekt som utdata tillhör.

Kommentarer

PowerShell innehåller följande alias för Compare-Object:

  • Windows:
    • compare
    • diff

När du använder parametern PassThru kanske utdata som visas i konsolen inte innehåller egenskapen SideIndicator . Standardformatvyn för objekttypen utdata från Compare-Object innehåller inte egenskapen SideIndicator . Mer information finns i Exempel 3 i den här artikeln.