Compare-Object

Modul: Microsoft.PowerShell.Utility

Genomför två uppsättningar objekt.

Syntax

Compare-Object <PSObject> <PSObject> >] 

Beskrivning

Cmdletten Compare-Object jämför två uppsättningar objekt. Den ena uppsättningen objekt är referensen och den andra uppsättningen objekt är skillnaden.

Compare-Object kontrollerar om det finns tillgängliga metoder för att jämföra ett helt objekt. Om den inte hittar någon lämplig metod anropar den ToString()-metoderna för de ingående objekten och jämför strängresultaten. Du kan ange en eller flera egenskaper som ska användas för jämförelsen. När egenskaper tillhandahålls jämför cmdlet endast värdena för dessa egenskaper.

Resultatet av jämförelsen anger om ett egenskapsvärde endast förekom i referensobjektet (<=) eller endast i differensobjektet (=>). Om parametern IncludeEqual används, (==) indikerar att värdet finns i båda objekten.

Om referens- eller differensobjekten är noll ($null) genererar Compare-Object ett avslutningsfel.

I vissa exempel används splatting för att minska radlängden på kodproverna. För mer information, seom_Splatting.

Exempel

Exempel 1 – Jämför innehållet i två textfiler

Detta exempel jämför innehållet i två textfiler. Exemplet använder 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 tvättbjörn.

Utmatningen visar endast de rader som skiljer sig åt mellan filerna. Testfile1.txt är referensobjektet (<=) och Testfile2.txt är differensobjektet (=>). Rader med innehåll som förekommer 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 uteslut skillnaderna

I det här exemplet används parametern ExcludeDifferent för att jämföra varje innehållsrad i två textfiler.

Sedan PowerShell 7.1, när man använder parametern ExcludeDifferent, är IncludeEqual inferredoch utmatningen innehåller endast rader som finns i båda filerna, vilket framgår av SideIndicatorn(==).

$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject 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 som jämförs
  • Fegenskapen SideIndicator som visar vilket inputobjekt som utmatningen tillhör

När du använder parametern PassThru ändras inte objektets typ, men den instans av objektet som returneras har en tillagd NoteProperty som heter SideIndicator. SideIndicatorsvisar vilket inmatningsobjekt som utmatningen tillhör.

Följande exempel visar de olika utmatningstyperna.

$a = $TrueCompare-Object -IncludeEqual $a $a(Compare-Object -IncludeEqual $a $a) | Get-MemberInputObject SideIndicator----------- ------------- True == TypeName: System.Management.Automation.PSCustomObjectName 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=TrueSideIndicator NoteProperty string SideIndicator===Compare-Object -IncludeEqual $a $a -PassThru(Compare-Object -IncludeEqual $a $a -PassThru) | Get-MemberTrue TypeName: System.BooleanName MemberType Definition---- ---------- ----------CompareTo Method int CompareTo(System.Object obj), int CompareTo(bool value), int IComparable.CompareTo(SystEquals Method bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable.Equals(bool otGetHashCode 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.ToToType 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 destination, int charsWritten)SideIndicator NoteProperty string SideIndicator===

När du använder PassThru returneras den ursprungliga objekttypen (System.Boolean). Observera att den utdata som visas med standardformatet för System.Boolean-objekt inte visade egenskapenSideIndicator. Det returnerade System.Boolean-objektet har dock den tillagda egenskapenNoteProperty.

Exempel 4 – Jämförelse av 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 -IncludeEqualLength SideIndicator------ ------------- 3 ==

Exempel 5 – Jämförelse av komplexa objekt med hjälp av egenskaper

Det här exemplet visar hur det går till när komplexa objekt jämförs. 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 Propertyparameteren anges anser cmdlet att objekten är lika. Lägg märke till att värdet påInputObject är detsamma som resultatet av metoden ToString(). Eftersom klassenSystem.Diagnostics.Process inte har gränssnittet IComparable omvandlar cmdlet objekten till strängar och jämför sedan resultaten.

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 pwshPS> $a = Get-Process -Id 11168PS> $b = Get-Process -Id 17600PS> $a.ToString()System.Diagnostics.Process (pwsh)PS> $b.ToString()System.Diagnostics.Process (pwsh)PS> Compare-Object $a $b -IncludeEqualInputObject SideIndicator----------- -------------System.Diagnostics.Process (pwsh) ==PS> Compare-Object $a $b -Property ProcessName, Id, CPUProcessName Id CPU SideIndicator----------- -- --- -------------pwsh 17600 11.4375 =>pwsh 11168 36.203125 <=

När du anger egenskaper som ska jämföras visar cmdlet skillnaderna.

Exempel 6 – Jämförelse av komplexa objekt som implementerar IComparable

Om objektet implementerar IComparable söker cmdlet efter sätt att jämföra objekten.Omobjekten är av olika typer konverteras Difference-objektet till typenReferenceObject 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 ett TimeSpan så att objekten är lika.

Compare-Object ("0:0:1") "0:0:1" -IncludeEqualInputObject SideIndicator----------- -------------00:00:01 ==Compare-Object "0:0:1" ("0:0:1")InputObject SideIndicator----------- -------------00:00:01 =>0:0:1 <=

I det andra fallet konverteras TimeSpan till en sträng så att objekten är olika.

Parametrar

-CaseSensitive

Anger att jämförelser ska vara skiftlägeskänsliga.

Typ: SwitchParameter
Position: Named
Standardvärde: False
Acceptera inmatning från pipeline: False
Accept wildcard characters: False
-Culture

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

Typ: String
Position: Named
Standardvärde: None
Accepterar inmatning från pipeline: False
Accept wildcard characters: False
-DifferenceObject

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

Typ: PSObject
Position: 1
Standardvärde: None
Accepterar inmatning från pipeline: True
Accept wildcard characters: False
-ExcludeDifferent

Indikerar att den här cmdlet endast visar egenskaperna för jämförda objekt som är lika. Skillnaderna mellan objekten bortkastas.

Använd ExcludeDifferent med IncludeEqual för att endast visa de rader som matchar mellan jämförelse- och differensobjekten.

Om ExcludeDifferent anges utan IncludeEqual visas ingen utdata.

Typ: SwitchParameter
Position: Named
Standardvärde: False
Acceptera inmatning från pipeline: False
Accept wildcard characters: False
-IncludeEqual

IncludeEqual visar matchningar mellan referens- och differensobjekt.

Som standard innehåller utmatningen även skillnaderna mellan referens- och differensobjekten.

Typ: SwitchParameter
Position: Named
Standardvärde: False
Accept pipeline input: False
Accept wildcard characters: False
-PassThru

När du använder parametern PassThru utelämnar Compare-Object PSCustomObject-omslaget kring de jämförda objekten och returnerar de olika objekten oförändrade.

Typ: SwitchParameter
Position: Named
Standardvärde: False
Acceptera inmatning från pipeline: False
Accept wildcard characters: False
-Property

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

Värdet för parametern Property kan vara en ny beräknad egenskap. Den beräknade egenskapen kan vara ett skriptblock eller en hashtabell. Giltiga nyckel-värdepar är:

  • Uttryck – <string> eller <script block>

För mer information, seom_Calculated_Properties.

Typ: Objekt
Position: Namn
Standardvärde: Inget
Acceptera inmatning från pipeline: False
Accept wildcard characters: False
-ReferenceObject

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

Typ: PSObject
Position: 0
Standardvärde: None
Accepterar inmatning från pipeline: False
Accept wildcard characters: False
-SyncWindow

Anger antalet intilliggande objekt som Compare-Object inspekterar när han/hon söker efter en matchning i en samling objekt. Compare-Object undersöker angränsande objekt när den inte hittar objektet i samma position i en samling. Standardvärdet är ::MaxValue, vilket innebär attCompare-Object undersöker hela objektsamlingen.

Typ: Int32
Position: Named
Standardvärde: ::MaxValue
Accepterar inmatning från pipeline: False
Acceptera jokertecken: False

Inputs

PSObject

Du kan skicka ett objekt ner i pipeline till parametern DifferenceObject.

Outputs

None

Om referensobjektet och differensobjektet är likadana, sker ingen output, såvida du inte använder parametern IncludeEqual.

PSCustomObject

Om objekten är olika, Compare-Objectlindar de olika objekten i en PSCustomObjectwrapper med en SideIndicator-egenskap för att referera till skillnaderna.

När du använder parametern PassThru ändras inte objektets Typ, men den instans av objektet som returneras har en tillagd NoteProperty som heter SideIndicator. SideIndicators visar vilket inmatningsobjekt som utmatningen tillhör.

Notes

När du använder parametern PassThru kan det hända att den utmatning som visas i konsolen inte innehåller egenskapenSideIndicator. Standardformatvyn för den för objekttypen utdata avCompare-Object innehåller inte egenskapen SideIndicator. Mer information finns iExempel 3 i den här artikeln.

  • om_Calculated_Properties
  • ForEach-Object
  • Group-Object
  • Measure-Object
  • New-Object
  • Select-Object
  • Sort-Object
  • Tee-Object
  • Where-Object
  • Get-Process

Lämna ett svar

Din e-postadress kommer inte publiceras.