Genomför två uppsättningar objekt.
- Syntax
- Beskrivning
- Exempel
- Exempel 1 – Jämför innehållet i två textfiler
- Exempel 2 – Jämför varje innehållsrad och uteslut skillnaderna
- Exempel 3 – Visa skillnaden när du använder parametern PassThru
- Exempel 4 – Jämförelse av två enkla objekt med hjälp av egenskaper
- Exempel 5 – Jämförelse av komplexa objekt med hjälp av egenskaper
- Exempel 6 – Jämförelse av komplexa objekt som implementerar IComparable
- Parametrar
- Inputs
- Outputs
- Notes
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
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 |
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 |
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 |
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 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 |
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 |
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 |
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 |
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-Object
lindar de olika objekten i en PSCustomObject
wrapper 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