Condividi tramite


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.txt contiene i valori: cane, scoiattolo e uccello.
  • Testfile2.txt contiene 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

  • cat e racoon vengono trovati nel file dell'oggetto di differenza, ma mancanti nel file dell'oggetto di riferimento
  • dog e squirrel vengono 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 può essere una nuova proprietà calcolata. La proprietà calcolata può essere un blocco di script o una tabella hash. Le coppie chiave-valore valide sono:

  • 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:
    • compare
    • diff

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.