Compare-Object

Module : Microsoft.PowerShell.Utility

Comparer deux ensembles d’objets.

Syntaxe

Compare-Object <PSObject> <PSObject> >] 

Description

Le cmdlet Compare-Object compare deux ensembles d’objets. Un ensemble d’objets est la référence, et l’autre ensemble d’objets est la différence.

Compare-Object vérifie les méthodes disponibles pour comparer un objet entier. S’il ne trouve pas de méthode appropriée, il appelle les méthodes ToString() des objets d’entrée et compare les résultats de la chaîne de caractères. Vous pouvez fournir une ou plusieurs propriétés à utiliser pour la comparaison. Lorsque des propriétés sont fournies, le cmdlet compare uniquement les valeurs de ces propriétés.

Le résultat de la comparaison indique si une valeur de propriété est apparue uniquement dans l’objet de référence (<=) ou uniquement dans l’objet de différence (=>). Si le paramètre IncludeEqual est utilisé, (==) indique que la valeur se trouve dans les deux objets.

Si les objets de référence ou de différence sont nuls ($null), Compare-Object génère une erreur de terminaison.

Certains exemples utilisent le splatting pour réduire la longueur de ligne des échantillons de code. Pour plus d’informations, voirabout_Splatting.

Exemples

Exemple 1 – Comparer le contenu de deux fichiers texte

Cet exemple compare le contenu de deux fichiers texte. L’exemple utilise les deux fichiers texte suivants,avec chaque valeur sur une ligne distincte.

  • Testfile1.txt contient les valeurs : chien, écureuil et oiseau.
  • Testfile2.txt contient les valeurs : chat, oiseau et raton laveur.

La sortie affiche uniquement les lignes qui sont différentes entre les fichiers. Testfile1.txt est l’objet de référence (<=) et Testfile2.txt est l’objet de différence (=>). Les lignes de contenu qui apparaissent dans les deux fichiers ne sont pas affichées.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)InputObject SideIndicator----------- -------------cat =>racoon =>dog <=squirrel <=

Exemple 2 – Comparer chaque ligne de contenu et exclure les différences

Cet exemple utilise le paramètre ExcludeDifferent pour comparer chaque ligne de contenu dans deux fichiers texte.

Depuis PowerShell 7.1, lors de l’utilisation du paramètre ExcludeDifferent, IncludeEqual est déduit et la sortie ne contient que les lignes contenues dans les deux fichiers, comme le montre le SideIndicator(==).

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

Exemple 3 – Montrer la différence en utilisant le paramètre PassThru

Normalement, Compare-Object renvoie un type PSCustomObject avec les propriétés suivantes :

  • L’objet d’entrée en cours de comparaison
  • La propriété SideIndicator montrant à quel objet d’entrée appartient la sortie

Lorsque vous utilisez le paramètre PassThru, le Type de l’objet n’est pas modifié mais l’instance de l’objet retourné a une NoteProperty ajoutée nommée SideIndicator. SideIndicator indique à quel objet d’entrée appartient la sortie.

Les exemples suivants montrent les différents types de sortie.

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

Lorsque vous utilisez PassThru, le type d’objet original (System.Boolean) est retourné. Notez comment la sortie affichée par le format par défaut pour les objets System.Boolean n’a pas affiché la propriétéSideIndicator. Cependant, l’objet System.Boolean retourné possède la propriétéNoteProperty ajoutée.

Exemple 4 – Comparer deux objets simples à l’aide de propriétés

Dans cet exemple, nous comparons deux chaînes de caractères différentes qui ont la même longueur.

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

Exemple 5 – Comparer des objets complexes à l’aide de propriétés

Cet exemple montre le comportement lors de la comparaison d’objets complexes. Dans cet exemple, nous stockons deuxodifférents objets de processus pour différentes instances de PowerShell. Les deux variables contiennent des processobjects avec le même nom. Lorsque les objets sont comparés sans spécifier le paramètre Property, la cmdlet considère que les objets sont égaux. Remarquez que la valeur de l’objetInputObject est la même que le résultat de la méthode ToString(). Comme la classeSystem.Diagnostics.Process ne possède pas l’interface IComparable, le cmdletconvertit les objets en chaînes de caractères puis compare les résultats.

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

Lorsque vous spécifiez des propriétés à comparer, le cmdlet affiche les différences.

Exemple 6 – Comparaison d’objets complexes qui implémentent IComparable

Si l’objet implémente IComparable, le cmdlet recherche des moyens de comparer les objets.Si lesobjets sont de types différents, l’objet Différence est converti au type de l’objetRéférence puis comparé.

Dans cet exemple, nous comparons une chaîne de caractères à un objet TimeSpan. Dans le premier cas, la chaîne est convertie en TimeSpan donc les objets sont égaux.

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

Dans le second cas, le TimeSpan est converti en chaîne donc l’objet est différent.

Paramètres

-CaseSensitive

Indique que les comparaisons doivent être sensibles à la casse.

Type: Paramètre de commutation
Position: Nommé
Valeur par défaut: Faux
Accepter l’entrée du pipeline : Faux
Acceptation des caractères génériques: Faux
-Culture

Spécifie la culture à utiliser pour les comparaisons.

Type: String
Position: Nommé
Valeur par défaut: None
Acceptation de l’entrée pipeline : False
Acceptation des caractères génériques: False
-DifferenceObject

Spécifie les objets qui sont comparés aux objets de référence.

Type: PSObject
Position: 1
Valeur par défaut: None
Acceptation de l’entrée pipeline : True
Accepter les caractères génériques: False
-ExcludeDifferent

Indique que ce cmdlet affiche uniquement les caractéristiques des objets comparés qui sont égaux. Les différences entre les objets sont écartées.

Utilisez ExcludeDifferent avec IncludeEqual pour afficher uniquement les lignes qui correspondent entre les objets de référence et de différence.

Si ExcludeDifferent est spécifié sans IncludeEqual, il n’y a pas de sortie.

Type: Paramètre de commutation
Position: Nommé
Valeur par défaut: Faux
Accepter l’entrée du pipeline : Faux
Acceptation des caractères génériques: Faux
-IncludeEqual

IncludeEqual affiche les correspondances entre les objets de référence et de différence.

Par défaut, la sortie inclut également les différences entre les objets de référence et de différence.

Type: Paramètre de commutation
Position: Nommé
Valeur par défaut : Faux
Acceptation de l’entrée pipeline: Faux
Acceptation des caractères génériques : Faux
-PassThru

Lorsque vous utilisez le paramètre PassThru, Compare-Object omet le wrapper PSCustomObject autour des objets comparés et renvoie les objets différents, inchangés.

Type: Paramètre de commutation
Position: Nommé
Valeur par défaut: Faux
Accepter l’entrée du pipeline : False
Acceptation des caractères génériques: False
-Property

Spécifie un tableau de propriétés des objets référence et différence à comparer.

La valeur du paramètre Property peut être une nouvelle propriété calculée. La propriété calculéepeut être un bloc de script ou un tableau de hachage. Les paires clé-valeur valides sont :

  • Expression – <string> ou <script block>

Pour plus d’informations, voirabout_Calculated_Properties.

Type: Objet
Position: Nommé
Valeur par défaut: None
Acceptation de l’entrée pipeline : Faux
Acceptation des caractères génériques: Faux
-ReferenceObject

Spécifie un tableau d’objets utilisés comme référence pour la comparaison.

Type: PSObject
Position: 0
Valeur par défaut: None
Acceptation de l’entrée pipeline : Faux
Acceptation des caractères génériques : Faux
-SyncWindow

Spécifie le nombre d’objets adjacents que Compare-Object inspecte tout en recherchant une correspondance dans une collection d’objets. Compare-Object examine les objets adjacents lorsqu’il ne trouve pas l’objet dans la même position dans une collection. La valeur par défaut est ::MaxValue, ce qui signifie queCompare-Object examine toute la collection d’objets.

Type: Int32
Position: Nommé
Valeur par défaut: ::MaxValue
Accepter l’entrée du pipeline : False
Acceptation des caractères génériques: False

Entrées

PSObject

Vous pouvez envoyer un objet dans le pipeline au paramètre DifferenceObject.

Sorties

None

Si l’objet de référence et l’objet de différence sont les mêmes, il n’y a pas de sortie, sauf si vous utilisez le paramètre IncludeEqual.

PSCustomObject

Si les objets sont différents, Compare-Objectenveloppe les objets différents dans un PSCustomObjectwrapper avec une propriété SideIndicator pour référencer les différences.

Lorsque vous utilisez le paramètre PassThru, le Type de l’objet n’est pas modifié mais l’instancede l’objet retourné a une NoteProperty ajoutée nommée SideIndicator. SideIndicator indique à quel objet d’entrée appartient la sortie.

Notes

Lorsque vous utilisez le paramètre PassThru, la sortie affichée dans la console peut ne pas inclure la propriétéSideIndicator. La vue du format par défaut de la pour le type d’objet sortie parCompare-Object n’inclut pas la propriété SideIndicator. Pour plus d’informations, voirExemple 3 dans cet article.

  • A propos des propriétés calculées
  • Pour chaque objet
  • Groupe-objet
  • Mesure-objet
  • Nouveau-Objet
  • Select-Object
  • Sort-Object
  • Tee-Object
  • Where-Object
  • Get-Process

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.