Compare-Object
Confronta due set di oggetti.
Sintassi
Default (impostazione predefinita).
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Descrizione
Il cmdlet Compare-Object confronta due set di oggetti. Un set di oggetti è il riferimento e l'altro set di oggetti è la differenza .
Compare-Object verifica la presenza di metodi disponibili per confrontare un intero oggetto. Se non riesce a trovare un metodo appropriato, chiama i metodi ToString() degli oggetti di input e confronta i risultati della stringa. È possibile specificare una o più proprietà da usare per il confronto. Quando vengono fornite proprietà, il cmdlet confronta solo i valori di tali proprietà.
Il risultato del confronto indica se un valore della proprietà è presente solo nell'oggetto di riferimento (<=) o solo nell'oggetto differenza oggetto (=>). Se viene usato il parametro IncludeEqual, (==) indica che il valore si trova in entrambi gli oggetti.
Se il riferimento o la differenza di oggetti sono null ($null), Compare-Object genera un errore irreversibile.
Alcuni esempi usano lo splatting per ridurre la lunghezza della riga degli esempi di codice. Per ulteriori informazioni, vedere about_Splatting.
Esempio
Esempio 1: confrontare il contenuto di due file di testo
In questo esempio viene confrontato il contenuto di due file di testo. Nell'esempio vengono usati i due file di testo seguenti, con ogni valore in una riga separata.
-
Testfile1.txtcontiene i valori: cane, scoiattolo e uccello. -
Testfile2.txtcontiene i valori: gatto, uccello e racoon.
L'output visualizza solo le righe diverse tra i file. Le righe con contenuto visualizzato in entrambi i file non vengono visualizzate.
$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 <=
Per questo esempio, l'output mostra le informazioni seguenti
-
cateracoonvengono trovati nel file dell'oggetto di differenza, ma mancanti nel file dell'oggetto di riferimento -
dogesquirrelvengono trovati nel file dell'oggetto di riferimento, ma mancanti nel file di oggetto di differenza
Esempio 2: confrontare ogni riga di contenuto ed escludere le differenze
In questo esempio viene usato il parametro ExcludeDifferent per confrontare ogni riga di contenuto in due file di testo.
A partire da PowerShell 7.1, quando si usa il parametro ExcludeDifferent, viene dedotto IncludeEqual e l'output contiene solo righe contenute in entrambi i file, come illustrato dal 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 ==
Esempio 3- Mostra la differenza quando si usa il parametro PassThru
In genere, Compare-Object restituisce un tipo di PSCustomObject con le proprietà seguenti:
- inputobject confrontato
- Proprietà SideIndicator che mostra l'oggetto di input a cui appartiene l'output
Quando si utilizza il parametro PassThru, il Type dell'oggetto non viene modificato, ma l'istanza dell'oggetto restituito ha aggiunto un NoteProperty denominato SideIndicator. SideIndicator mostra a quale oggetto di input appartiene l'output.
Gli esempi seguenti illustrano i diversi tipi di output.
$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===
Quando si usa PassThru, viene restituito il tipo di oggetto originale (System.Boolean). Si noti che l'output visualizzato dal formato predefinito per oggetti System.Boolean non visualizza la proprietà SideIndicator. Tuttavia, l'oggetto System.Boolean restituito ha aggiunto NoteProperty.
Esempio 4- Confrontare due oggetti semplici usando le proprietà
In questo esempio vengono confrontate due stringhe diverse con la stessa lunghezza.
$objects = @{
ReferenceObject = 'abc'
DifferenceObject = 'xyz'
Property = 'Length'
}
Compare-Object @objects -IncludeEqual
Length SideIndicator
------ -------------
3 ==
Esempio 5 - Confronto di oggetti complessi tramite proprietà
In questo esempio viene illustrato il comportamento durante il confronto di oggetti complessi. In questo esempio vengono archiviati due oggetti di processo diversi per istanze diverse di PowerShell. Entrambe le variabili contengono oggetti processo con lo stesso nome. Quando gli oggetti vengono confrontati senza specificare il parametro Property, il cmdlet considera gli oggetti uguali. Si noti che il valore del InputObject corrisponde al risultato del metodo ToString(). Poiché la classe System.Diagnostics.Process non dispone dell'interfaccia IComparable, il cmdlet converte gli oggetti in stringhe e quindi confronta i risultati.
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 <=
Quando si specificano le proprietà da confrontare, il cmdlet mostra le differenze.
Esempio 6 - Confronto di oggetti complessi che implementano IComparable
Se l'oggetto implementa IComparable, il cmdlet cerca modi per confrontare gli oggetti. Se gli oggetti sono tipi diversi, l'oggetto differenza viene convertito nel tipo di ReferenceObject quindi confrontato.
In questo esempio viene confrontata una stringa con un oggetto TimeSpan. Nel primo caso, la stringa viene convertita in un TimeSpan in modo che gli oggetti siano uguali.
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 <=
Nel secondo caso, il TimeSpan viene convertito in una stringa in modo che l'oggetto sia diverso.
Parametri
-CaseSensitive
Indica che i confronti devono fare distinzione tra maiuscole e minuscole.
Proprietà dei parametri
| Tipo: | SwitchParameter |
| Valore predefinito: | False |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-Culture
Specifica le impostazioni cultura da utilizzare per i confronti.
Proprietà dei parametri
| Tipo: | String |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-DifferenceObject
Specifica gli oggetti confrontati con gli oggetti riferimento.
Proprietà dei parametri
| Tipo: | PSObject[] |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | 1 |
| Obbligatorio: | True |
| Valore dalla pipeline: | True |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-ExcludeDifferent
Indica che questo cmdlet visualizza solo le caratteristiche degli oggetti confrontati uguali. Le differenze tra gli oggetti vengono eliminate.
Utilizzare ExcludeDifferent con IncludeEqual per visualizzare solo le righe che corrispondono tra riferimento e differenza oggetti.
Se ExcludeDifferent viene specificato senza IncludeEqual, non è presente alcun output.
Proprietà dei parametri
| Tipo: | SwitchParameter |
| Valore predefinito: | False |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-IncludeEqual
IncludeEqual visualizza le corrispondenze tra gli oggetti riferimento e differenza oggetti.
Per impostazione predefinita, l'output include anche le differenze tra l'riferimento e gli oggetti differenza.
Proprietà dei parametri
| Tipo: | SwitchParameter |
| Valore predefinito: | False |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-PassThru
Quando si utilizza il parametro PassThru, Compare-Object omette il wrapper pscustomObject intorno agli oggetti confrontati e restituisce gli oggetti diversi, invariati.
Proprietà dei parametri
| Tipo: | SwitchParameter |
| Valore predefinito: | False |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-Property
Specifica una matrice di proprietà del riferimento e differenza oggetti da confrontare.
Il valore del parametro Property
- Espressione -
<string>o<script block>
Per altre informazioni, vedere about_Calculated_Properties.
Proprietà dei parametri
| Tipo: | Object[] |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-ReferenceObject
Specifica una matrice di oggetti utilizzati come riferimento per il confronto.
Proprietà dei parametri
| Tipo: | PSObject[] |
| Valore predefinito: | None |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | 0 |
| Obbligatorio: | True |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
-SyncWindow
Specifica il numero di oggetti adiacenti che Compare-Object controlla durante la ricerca di una corrispondenza in una raccolta di oggetti.
Compare-Object esamina gli oggetti adiacenti quando non trova l'oggetto nella stessa posizione in una raccolta. Il valore predefinito è [int32]::MaxValue, il che significa che Compare-Object esamina l'intera raccolta di oggetti.
Quando si utilizzano raccolte di grandi dimensioni, il valore predefinito potrebbe non essere efficiente, ma è accurato. Specificando un valore più piccolo per SyncWindow può migliorare le prestazioni, ma potrebbe avere un'accuratezza inferiore.
Proprietà dei parametri
| Tipo: | Int32 |
| Valore predefinito: | [int32]::MaxValue |
| Supporta i caratteri jolly: | False |
| DontShow: | False |
Set di parametri
(All)
| Posizione: | Named |
| Obbligatorio: | False |
| Valore dalla pipeline: | False |
| Valore dalla pipeline in base al nome della proprietà: | False |
| Valore dagli argomenti rimanenti: | False |
CommonParameters
Questo cmdlet supporta i parametri comuni: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction e -WarningVariable. Per altre informazioni, vedi about_CommonParameters.
Input
PSObject
È possibile inviare un oggetto verso il basso nella pipeline al parametro DifferenceObject.
Output
None
Per impostazione predefinita, questo cmdlet non restituisce alcun output quando la ReferenceObject e la DifferenceObject sono uguali.
PSCustomObject
Quando gli oggetti sono diversi, questo cmdlet esegue il wrapping degli oggetti diversi in un PSCustomObject wrapper con una proprietà SideIndicator per fare riferimento alle differenze.
Quando si usa il parametro IncludeEqual e gli oggetti sono gli stessi, il cmdlet restituisce gli oggetti di cui è stato eseguito il wrapping in un PSCustomObject con la proprietà SideIndicator impostata su ==.
Quando si utilizza il parametro PassThru, il Type dell'oggetto non viene modificato, ma l'istanza dell'oggetto restituito ha aggiunto un NoteProperty denominato SideIndicator. SideIndicator mostra a quale oggetto di input appartiene l'output.
Note
PowerShell include gli alias seguenti per Compare-Object:
- Windows:
comparediff
Quando si usa il parametro PassThru, l'output visualizzato nella console potrebbe non includere la proprietà SideIndicator. La visualizzazione formato predefinita per l'output del tipo di oggetto da Compare-Object non include la proprietà SideIndicator. Per altre informazioni, vedere esempio 3 in questo articolo.