Confronta due set di oggetti.
- Sintassi
- Descrizione
- Esempi
- Esempio 1 – Confronta il contenuto di due file di testo
- Esempio 2 – Confronta ogni linea di contenuto ed escludi le differenze
- Esempio 3 – Mostra la differenza quando si usa il parametro PassThru
- Esempio 4 – Confrontare due oggetti semplici usando le proprietà
- Esempio 5 – Comparare oggetti complessi usando le proprietà
- Esempio 6 – Confronto di oggetti complessi che implementano IComparable
- Parametri
- Inputs
- Outputs
- Notes
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
Indica che i confronti devono essere case-sensitive.
Type: | SwitchParameter |
Position: | Named |
Valore predefinito: | False |
Accetta ingresso pipeline: | Falso |
Accetta caratteri jolly: | Falso |
Specifica la cultura da usare per i confronti.
Tipo: | Stringa |
Posizione: | Nominato |
Valore predefinito: | Nessuno |
Accetta ingresso pipeline: | Falso |
Accetta caratteri jolly: | Falso |
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 |
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 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 |
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 |
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 |
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 |
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-Object
avvolge gli oggetti diversi in un PSCustomObject
wrapper 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