Compare-Object

Confronta due set di oggetti.

Sintassi

Compare-Object
       [-ReferenceObject] <PSObject[]>
       [-DifferenceObject] <PSObject[]>
       [-SyncWindow <Int32>]
       [-Property <Object[]>]
       [-ExcludeDifferent]
       [-IncludeEqual]
       [-PassThru]
       [-Culture <String>]
       [-CaseSensitive]
       [<CommonParameters>]

Descrizione

Il Compare-Object cmdlet 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 il confronto di 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 riferimento (<=) o solo nell'oggetto differenza (=>). Se viene usato il parametro IncludeEqual , (==) indica che il valore si trova in entrambi gli oggetti.

Se il riferimento o gli oggetti differenza sono Null ($null), Compare-Object genera un errore di terminazione.

Alcuni esempi usano lo splatting per ridurre la lunghezza della riga degli esempi di codice. Per altre 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. Testfile1.txt è l'oggetto di riferimento (<=) ed Testfile2.txtè l'oggetto differenza (=>). Le righe con contenuto visualizzato in entrambi i file non vengono visualizzate.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)

InputObject SideIndicator
----------- -------------
cat         =>
racoon      =>
dog         <=
squirrel    <=

Esempio 2: confrontare ogni riga di contenuto ed escludere le differenze

In questo esempio viene utilizzato 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 , IncludeEqual viene dedotto e l'output contiene solo righe contenute in entrambi i file, come illustrato da 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, restituisce Compare-Object un tipo 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 tipo dell'oggetto non viene modificato ma l'istanza dell'oggetto restituito ha un elemento NoteProperty denominato SideIndicator aggiunto. 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 gli 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.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -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 di 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 Difference 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 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, timeSpan viene convertito in una stringa in modo che l'oggetto sia diverso.

Parametri

-CaseSensitive

Indica che nei confronti è rilevante la distinzione tra maiuscole e minuscole.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

Specifica le impostazioni cultura da usare per i confronti.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DifferenceObject

Specifica gli oggetti confrontati con gli oggetti di riferimento .

Type:PSObject[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters: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 gli oggetti riferimento e differenza .

Se excludeDifferent viene specificato senza IncludeEqual, non è presente alcun output.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IncludeEqual

IncludeEqual visualizza le corrispondenze tra gli oggetti di riferimento e di differenza.

Per impostazione predefinita, l'output include anche le differenze tra gli oggetti di riferimento e di differenza.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

Quando si usa il parametro PassThru , Compare-Object omette il wrapper PSCustomObject intorno agli oggetti confrontati e restituisce gli oggetti diversi, invariati.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Specifica una matrice di proprietà degli oggetti riferimento e differenza 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.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ReferenceObject

Specifica una matrice di oggetti utilizzati come riferimento per il confronto.

Type:PSObject[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-SyncWindow

Specifica il numero di oggetti adiacenti che Compare-Object controllano 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, ovvero Compare-Object esamina l'intera raccolta di oggetti.

Quando si utilizzano raccolte di grandi dimensioni, il valore predefinito potrebbe non essere efficiente, ma è accurato. La specifica di un valore inferiore per SyncWindow può migliorare le prestazioni, ma potrebbe avere un'accuratezza inferiore.

Type:Int32
Position:Named
Default value:[Int32]::MaxValue
Required:False
Accept pipeline input:False
Accept wildcard characters:False

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 ReferenceObject e DifferenceObject sono uguali.

PSCustomObject

Quando gli oggetti sono diversi, questo cmdlet esegue il wrapping degli oggetti diversi in un wrapper PSCustomObject 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 tipo dell'oggetto non viene modificato ma l'istanza dell'oggetto restituito ha un elemento NoteProperty denominato SideIndicator aggiunto. 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 l'esempio 3 in questo articolo.