Comparer deux ensembles d’objets.
- Syntaxe
- Description
- Exemples
- Exemple 1 – Comparer le contenu de deux fichiers texte
- Exemple 2 – Comparer chaque ligne de contenu et exclure les différences
- Exemple 3 – Montrer la différence en utilisant le paramètre PassThru
- Exemple 4 – Comparer deux objets simples à l’aide de propriétés
- Exemple 5 – Comparer des objets complexes à l’aide de propriétés
- Exemple 6 – Comparaison d’objets complexes qui implémentent IComparable
- Paramètres
- Entrées
- Sorties
- Notes
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
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 |
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 |
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 |
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 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 |
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 |
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 |
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 |
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-Object
enveloppe les objets différents dans un PSCustomObject
wrapper 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
.