Compare-Object
Vergelijkt twee sets objecten.
Syntaxis
Default (Standaard)
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
Met de cmdlet Compare-Object worden twee sets objecten vergeleken. Eén set objecten is de verwijzingen de andere set objecten is het verschil.
Compare-Object controleert op beschikbare methoden voor het vergelijken van een heel object. Als er geen geschikte methode kan worden gevonden, wordt de ToString() methoden van de invoerobjecten aangeroepen en worden de tekenreeksresultaten vergeleken. U kunt een of meer eigenschappen opgeven die moeten worden gebruikt voor vergelijking. Wanneer er eigenschappen worden opgegeven, vergelijkt de cmdlet alleen de waarden van deze eigenschappen.
Het resultaat van de vergelijking geeft aan of een eigenschapswaarde alleen wordt weergegeven in de verwijzing object (<=) of alleen in het verschil object (=>). Als de parameter IncludeEqual wordt gebruikt, geeft (==) aan dat de waarde zich in beide objecten bevindt.
Als de verwijzing of het verschil objecten null ($null) zijn, genereert Compare-Object een afsluitfout.
In sommige voorbeelden wordt splatting gebruikt om de regellengte van de codevoorbeelden te verminderen. Zie about_Splattingvoor meer informatie.
Voorbeelden
Voorbeeld 1: de inhoud van twee tekstbestanden vergelijken
In dit voorbeeld wordt de inhoud van twee tekstbestanden vergeleken. In het voorbeeld worden de volgende twee tekstbestanden gebruikt, waarbij elke waarde op een afzonderlijke regel wordt weergegeven.
-
Testfile1.txtbevat de waarden: hond, eekhoorn en vogel. -
Testfile2.txtbevat de waarden: kat, vogel en.
In de uitvoer worden alleen de regels weergegeven die verschillen tussen de bestanden. Regels met inhoud die in beide bestanden worden weergegeven, worden niet weergegeven.
$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 <=
In dit voorbeeld ziet u in de uitvoer de volgende informatie
-
catenracoonworden gevonden in het objectbestand verschil, maar ontbreekt in het referentieobjectbestand -
dogensquirrelzijn te vinden in het referentieobjectbestand, maar ontbreekt in het objectbestand van het verschil
Voorbeeld 2: elke regel met inhoud vergelijken en de verschillen uitsluiten
In dit voorbeeld wordt de parameter ExcludeGedifferentieerd gebruikt om elke regel met inhoud in twee tekstbestanden te vergelijken.
Vanaf PowerShell 7.1 wordt bij het gebruik van de parameter ExcludeGedifferentieerdIncludeEqual- afgeleid en bevat de uitvoer alleen regels in beide bestanden, zoals wordt weergegeven in de 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 ==
Voorbeeld 3: het verschil weergeven bij het gebruik van de parameter PassThru
Normaal gesproken retourneert Compare-Object een PSCustomObject type met de volgende eigenschappen:
- De InputObject worden vergeleken
- De eigenschap SideIndicator die laat zien tot welk invoerobject de uitvoer behoort
Wanneer u de parameter PassThru gebruikt, wordt de Type van het object niet gewijzigd, maar het exemplaar van het geretourneerde object heeft een toegevoegde NoteProperty- met de naam SideIndicator. SideIndicator laat zien tot welk invoerobject de uitvoer behoort.
In de volgende voorbeelden ziet u de verschillende uitvoertypen.
$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===
Wanneer u PassThru-gebruikt, wordt het oorspronkelijke objecttype (System.Boolean) geretourneerd. Houd er rekening mee dat de uitvoer die wordt weergegeven in de standaardindeling voor System.Boolean-objecten de eigenschap SideIndicator niet heeft weergegeven. Het geretourneerde System.Boolean-object heeft echter de toegevoegde NoteProperty-.
Voorbeeld 4: twee eenvoudige objecten vergelijken met behulp van eigenschappen
In dit voorbeeld vergelijken we twee verschillende tekenreeksen met dezelfde lengte.
$objects = @{
ReferenceObject = 'abc'
DifferenceObject = 'xyz'
Property = 'Length'
}
Compare-Object @objects -IncludeEqual
Length SideIndicator
------ -------------
3 ==
Voorbeeld 5: complexe objecten vergelijken met behulp van eigenschappen
In dit voorbeeld ziet u het gedrag bij het vergelijken van complexe objecten. In dit voorbeeld slaan we twee verschillende procesobjecten op voor verschillende exemplaren van PowerShell. Beide variabelen bevatten procesobjecten met dezelfde naam. Wanneer de objecten worden vergeleken zonder de eigenschap parameter op te geven, beschouwt de cmdlet de objecten als gelijk. U ziet dat de waarde van de InputObject- hetzelfde is als het resultaat van de methode ToString(). Omdat de klasse System.Diagnostics.Process niet beschikt over de interface IComparable, worden de objecten door de cmdlet geconverteerd naar tekenreeksen en worden de resultaten vergeleken.
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 <=
Wanneer u eigenschappen opgeeft die moeten worden vergeleken, worden de verschillen in de cmdlet weergegeven.
Voorbeeld 6: Complexe objecten vergelijken die IComparable implementeren
Als het object IComparableimplementeert, zoekt de cmdlet naar manieren om de objecten te vergelijken. Als de objecten verschillende typen zijn, wordt het Verschil object geconverteerd naar het type ReferenceObject vervolgens vergeleken.
In dit voorbeeld vergelijken we een tekenreeks met een TimeSpan-object. In het eerste geval wordt de tekenreeks geconverteerd naar een TimeSpan- zodat de objecten gelijk zijn.
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 <=
In het tweede geval wordt de TimeSpan- geconverteerd naar een tekenreeks, zodat het object anders is.
Parameters
-CaseSensitive
Geeft aan dat vergelijkingen hoofdlettergevoelig moeten zijn.
Parametereigenschappen
| Type: | SwitchParameter |
| Default value: | False |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | Named |
| Verplicht: | False |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-Culture
Hiermee geeft u de cultuur die moet worden gebruikt voor vergelijkingen.
Parametereigenschappen
| Type: | String |
| Default value: | None |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | Named |
| Verplicht: | False |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-DifferenceObject
Hiermee geeft u de objecten op die worden vergeleken met de verwijzing objecten.
Parametereigenschappen
| Type: | PSObject[] |
| Default value: | None |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | 1 |
| Verplicht: | True |
| Waarde uit pijplijn: | True |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-ExcludeDifferent
Geeft aan dat deze cmdlet alleen de kenmerken weergeeft van vergeleken objecten die gelijk zijn. De verschillen tussen de objecten worden verwijderd.
Gebruik ExcludeGedifferentieerd met IncludeEqual- om alleen de lijnen weer te geven die overeenkomen met de verwijzing en verschil objecten.
Als ExcludeGedifferentieerd- is opgegeven zonder IncludeEqual-, is er geen uitvoer.
Parametereigenschappen
| Type: | SwitchParameter |
| Default value: | False |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | Named |
| Verplicht: | False |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-IncludeEqual
IncludeEqual- geeft de overeenkomsten weer tussen de verwijzing en verschil objecten.
Standaard bevat de uitvoer ook de verschillen tussen de -verwijzing en verschil objecten.
Parametereigenschappen
| Type: | SwitchParameter |
| Default value: | False |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | Named |
| Verplicht: | False |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-PassThru
Wanneer u de parameter PassThru gebruikt, laat Compare-Object de PSCustomObject wrapper rond de vergeleken objecten weg en worden de verschillende objecten ongewijzigd geretourneerd.
Parametereigenschappen
| Type: | SwitchParameter |
| Default value: | False |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | Named |
| Verplicht: | False |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-Property
Hiermee geeft u een matrix van eigenschappen van de verwijzing en verschil objecten te vergelijken.
De waarde van de parameter eigenschap kan een nieuwe berekende eigenschap zijn. De berekende eigenschap kan een scriptblok of een hash-tabel zijn. Geldige sleutel-waardeparen zijn:
- Expressie:
<string>of<script block>
Zie about_Calculated_Propertiesvoor meer informatie.
Parametereigenschappen
| Type: | Object[] |
| Default value: | None |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | Named |
| Verplicht: | False |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-ReferenceObject
Hiermee geeft u een matrix van objecten die worden gebruikt als referentie voor vergelijking.
Parametereigenschappen
| Type: | PSObject[] |
| Default value: | None |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | 0 |
| Verplicht: | True |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
-SyncWindow
Hiermee geeft u het aantal aangrenzende objecten op dat Compare-Object inspecteert tijdens het zoeken naar een overeenkomst in een verzameling objecten.
Compare-Object onderzoekt aangrenzende objecten wanneer het object niet op dezelfde positie in een verzameling wordt gevonden. De standaardwaarde is [int32]::MaxValue, wat betekent dat Compare-Object de hele objectverzameling onderzoekt.
Wanneer u met grote verzamelingen werkt, is de standaardwaarde mogelijk niet efficiënt maar juist. Het opgeven van een kleinere waarde voor SyncWindow- kan de prestaties verbeteren, maar kan een lagere nauwkeurigheid hebben.
Parametereigenschappen
| Type: | Int32 |
| Default value: | [int32]::MaxValue |
| Ondersteunt jokertekens: | False |
| DontShow: | False |
Parametersets
(All)
| Position: | Named |
| Verplicht: | False |
| Waarde uit pijplijn: | False |
| Waarde uit pijplijn op eigenschapsnaam: | False |
| Waarde van resterende argumenten: | False |
CommonParameters
Deze cmdlet ondersteunt de algemene parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction en -WarningVariable. Zie about_CommonParametersvoor meer informatie.
Invoerwaarden
PSObject
U kunt een object omlaag verzenden naar de parameter DifferenceObject.
Uitvoerwaarden
None
Deze cmdlet retourneert standaard geen uitvoer wanneer de ReferenceObject- en het DifferenceObject hetzelfde zijn.
PSCustomObject
Wanneer de objecten verschillend zijn, verpakt deze cmdlet de verschillende objecten in een PSCustomObject wrapper met een eigenschap SideIndicator om te verwijzen naar de verschillen.
Wanneer u de parameter IncludeEqual gebruikt en de objecten hetzelfde zijn, retourneert de cmdlet de objecten die zijn verpakt in een PSCustomObject- met de eigenschap SideIndicator ingesteld op ==.
Wanneer u de parameter PassThru gebruikt, wordt de Type van het object niet gewijzigd, maar het exemplaar van het geretourneerde object heeft een toegevoegde NoteProperty- met de naam SideIndicator. SideIndicator laat zien tot welk invoerobject de uitvoer behoort.
Notities
PowerShell bevat de volgende aliassen voor Compare-Object:
- Windows:
comparediff
Wanneer u de parameter PassThru gebruikt, bevat de uitvoer die wordt weergegeven in de console mogelijk niet de eigenschap SideIndicator. De standaardindelingsweergave voor de uitvoer van het objecttype door Compare-Object bevat niet de eigenschap SideIndicator. Zie voorbeeld 3 in dit artikel voor meer informatie.