Compare-Object

Modulo: Microsoft.PowerShell.Utility

Confronta due set di oggetti.

Sintassi

Compare-Object <PSObject> <PSObject> >] 

Descrizione

La cmdlet Compare-Object confronta due set di oggetti. Un insieme di oggetti è il riferimento, e l’altro insieme di oggetti è la differenza.

Compare-Object controlla i metodi disponibili per confrontare un oggetto intero. Se non riesce a trovare un metodo adatto, chiama i metodi ToString() degli oggetti di input e confronta i risultati delle stringhe. È possibile fornire una o più proprietà da utilizzare per il confronto. Quando le proprietà sono fornite, il cmdlet confronta solo i valori di quelle proprietà.

Il risultato del confronto indica se il valore di una proprietà è apparso solo nell’oggetto di riferimento (<=) o solo nell’oggetto differenza (=>). Se viene usato il parametro IncludeEqual, (==) indica che il valore è in entrambi gli oggetti.

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

Alcuni esempi usano lo splatting per ridurre la lunghezza delle linee degli esempi di codice. Per maggiori informazioni, vediabout_Splatting.

Esempi

Esempio 1 – Confronta il contenuto di due file di testo

Questo esempio confronta il contenuto di due file di testo. L’esempio usa i seguenti due file di testo, con ogni valore su una linea separata.

  • Testfile1.txt contiene i valori: cane, scoiattolo e uccello.
  • Testfile2.txt contiene i valori: gatto, uccello e procione.

L’output mostra solo le linee che sono diverse tra i file. Testfile1.txt è l’oggetto di riferimento (<=) e Testfile2.txt è l’oggetto differenza (=>). Le linee con contenuto che appaiono 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 – Confronta ogni linea di contenuto ed escludi le differenze

Questo esempio usa il parametro ExcludeDifferent per confrontare ogni linea 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 linee contenute in entrambi i file, come mostrato dal SideIndicator(==).

$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject SideIndicator----------- -------------bird ==

Esempio 3 – Mostra la differenza quando si usa il parametro PassThru

Normalmente, Compare-Object restituisce un tipo PSCustomObject con le seguenti proprietà:

  • L’InputObject confrontato
  • La proprietà SideIndicator che mostra a quale oggetto di input appartiene l’output

Quando si usa il parametro PassThru, il Tipo dell’oggetto non viene cambiato ma l’istanza dell’oggetto restituito ha un’aggiunta NoteProperty chiamata SideIndicator. SideIndicator mostra a quale oggetto di input l’output appartiene.

I seguenti esempi mostrano i diversi tipi di output.

$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===

Quando si usa PassThru, viene restituito il tipo di oggetto originale (System.Boolean). Notate come l’output visualizzato dal formato predefinito per gli oggetti System.Boolean non mostra la proprietàSideIndicator. Tuttavia, l’oggetto System.Boolean restituito ha la proprietà aggiuntaNoteProperty.

Esempio 4 – Confrontare due oggetti semplici usando le proprietà

In questo esempio, confrontiamo due diverse stringhe che hanno la stessa lunghezza.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqualLength SideIndicator------ ------------- 3 ==

Esempio 5 – Comparare oggetti complessi usando le proprietà

Questo esempio mostra il comportamento quando si confrontano oggetti complessi. In questo esempio memorizziamo due diversi oggetti di processo per diverse istanze di PowerShell. Entrambe le variabili contengono oggetti di processo con lo stesso nome. Quando gli oggetti vengono confrontati senza specificare il parametro Property, la cmdlet considera gli oggetti uguali. Notate che il valore di theInputObject è lo stesso del risultato del metodo ToString(). Poiché la classe System.Diagnostics.Process non ha l’interfaccia IComparable, la cmdlet converte gli oggetti in stringhe e 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 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 <=

Quando si specificano le proprietà da confrontare, la cmdlet mostra le differenze.

Esempio 6 – Confronto di oggetti complessi che implementano IComparable

Se l’oggetto implementa IComparable, la cmdlet cerca il modo di confrontare gli oggetti.Se gli oggetti sono di tipo diverso, l’oggetto Difference viene convertito nel tipo delReferenceObject quindi confrontato.

In questo esempio, stiamo confrontando una stringa con un oggetto TimeSpan. Nel primo caso, la stringa è convertita in un TimeSpan così gli oggetti sono uguali.

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 <=

Nel secondo caso, il TimeSpan è convertito in una stringa così gli oggetti sono diversi.

Parametri

-CaseSensitive

Indica che i confronti devono essere case-sensitive.

Type: SwitchParameter
Position: Named
Valore predefinito: False
Accetta ingresso pipeline: Falso
Accetta caratteri jolly: Falso
-Cultura

Specifica la cultura da usare per i confronti.

Tipo: Stringa
Posizione: Nominato
Valore predefinito: Nessuno
Accetta ingresso pipeline: Falso
Accetta caratteri jolly: Falso
-DifferenceObject

Specifica gli oggetti che sono confrontati con quelli di riferimento.

Type: PSObject
Position: 1
Valore predefinito: None
Accetta ingresso pipeline: Vero
Accetta caratteri jolly: Falso
-ExcludeDifferent

Indica che questo cmdlet visualizza solo le caratteristiche degli oggetti confrontati che sono uguali. Le differenze tra gli oggetti vengono scartate.

Usa ExcludeDifferent con IncludeEqual per visualizzare solo le linee che corrispondono tra gli oggetti differenza e differenza.

Se ExcludeDifferent è specificato senza IncludeEqual, non c’è output.

Type: SwitchParameter
Position: Named
Valore predefinito: False
Accetta input pipeline: Falso
Accetta caratteri jolly: Falso
-IncludeEqual

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

Di default, l’output include anche le differenze tra gli oggetti di riferimento e di differenza.

Type: SwitchParameter
Position: Named
Valore predefinito: Falso
Accetta input pipeline: Falso
Accetta caratteri jolly: False
-PassThru

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

Tipo: SwitchParameter
Posizione: Nominato
Valore predefinito: Falso
Accetta ingresso pipeline: Falso
Accetta caratteri jolly: Falso
-Proprietà

Specifica un array 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 maggiori informazioni, vedereabout_Calculated_Properties.

Tipo: Oggetto
Posizione: Nominato
Valore predefinito: Nessuno
Accetta ingresso pipeline: Falso
Accetta caratteri jolly: Falso
-ReferenceObject

Specifica un array di oggetti usati come riferimento per il confronto.

Type: PSObject
Position: 0
Valore predefinito: None
Accetta ingresso pipeline: Falso
Accetta caratteri jolly: Falso
-SyncWindow

Specifica il numero di oggetti adiacenti che Compare-Object controlla mentre cerca una corrispondenza in una collezione di oggetti. Compare-Object esamina gli oggetti adiacenti quando non trova l’oggetto nella stessa posizione in una collezione. Il valore predefinito è ::MaxValue, il che significa che Compare-Object esamina l’intera collezione di oggetti.

Type: Int32
Position: Named
Valore predefinito: ::MaxValue
Accetta ingresso pipeline: False
Accetta caratteri jolly: False

Inputs

PSObject

Puoi inviare un oggetto lungo la pipeline al parametro DifferenceObject.

Outputs

None

Se l’oggetto di riferimento e l’oggetto differenza sono uguali, non c’è nessun output, a meno che non si usi il parametro IncludeEqual.

PSCustomObject

Se gli oggetti sono diversi, Compare-Objectavvolge gli oggetti diversi in un PSCustomObjectwrapper con una proprietà SideIndicator per fare riferimento alle differenze.

Quando usate il parametro PassThru, il Tipo dell’oggetto non viene cambiato ma l’istanza dell’oggetto restituito ha una proprietà aggiunta NoteProperty chiamata SideIndicator. SideIndicator mostra a quale oggetto di input appartiene l’output.

Notes

Quando si usa il parametro PassThru, l’output visualizzato nella console potrebbe non includere la proprietàSideIndicator. La visualizzazione predefinita del formato per l’output del tipo di oggetto daCompare-Object non include la proprietà SideIndicator. Per maggiori informazioni vediExample 3 in questo articolo.

  • about_Calculated_Properties
  • ForEach-Object
  • Group-Object
  • Measure-Object
  • New-Object
  • Select-Object
  • Sort-Object
  • Tee-Object
  • Where-Object
  • Get-Process

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.