Partage via


Compare-Object

Compare deux ensembles d’objets.

Syntaxe

Default (Par défaut)

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

Description

L’applet de commande 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 recherche les méthodes disponibles de comparaison d’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 chaîne. Vous pouvez fournir une ou plusieurs propriétés à utiliser pour la comparaison. Lorsque les propriétés sont fournies, l’applet de commande compare uniquement les valeurs de ces propriétés.

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

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

Certains exemples utilisent la mise en forme pour réduire la longueur de ligne des exemples de code. Pour plus d'informations, consultez À propos de la projection.

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 racon.

La sortie affiche uniquement les lignes qui sont différentes entre les fichiers. Les lignes avec du contenu qui apparaissent dans les deux fichiers ne sont pas affichées.

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

Pour cet exemple, la sortie affiche les informations suivantes

  • cat et racoon sont trouvés dans le fichier objet de différence, mais manquants dans le fichier objet de référence
  • dog et squirrel sont trouvés dans le fichier objet de référence, mais manquants dans le fichier objet de différence

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.

À partir de PowerShell 7.1, lors de l’utilisation du paramètre ExcludeDifferent, IncludeEqual est déduite et la sortie contient uniquement des lignes contenues dans les deux fichiers, comme le montre l'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        ==

Exemple 3 - Afficher la différence lors de l’utilisation du paramètre PassThru

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

  • Comparaison InputObject
  • Propriété SideIndicator montrant l’objet d’entrée auquel 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 un NoteProperty ajouté nommé SideIndicator. SideIndicator indique l’objet d’entrée auquel appartient la sortie.

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

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

Lorsque vous utilisez passThru, le type d’objet d’origine (System.Boolean) est retourné. Notez comment la sortie affichée par défaut pour objets System.Boolean n’a pas affiché la propriété SideIndicator. Toutefois, l’objet System.Boolean retourné a la NotePropertyajoutée.

Exemple 4 : comparer deux objets simples à l’aide de propriétés

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

$objects = @{
  ReferenceObject = 'abc'
  DifferenceObject = 'xyz'
  Property = 'Length'
}
Compare-Object @objects -IncludeEqual
Length SideIndicator
------ -------------
     3 ==

Exemple 5 : comparaison d’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 deux objets de processus différents pour différentes instances de PowerShell. Les deux variables contiennent des objets de processus portant le même nom. Lorsque les objets sont comparés sans spécifier le paramètre property, l’applet de commande considère que les objets sont égaux. Notez que la valeur du InputObject est identique au résultat de la méthode ToString(). Étant donné que la classe System.Diagnostics.Process n’a pas l’interface IComparable, l’applet de commande convertit les objets en chaînes, 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 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 <=

Lorsque vous spécifiez des propriétés à comparer, l’applet de commande affiche les différences.

Exemple 6 : comparaison d’objets complexes qui implémentent IComparable

Si l’objet implémente IComparable, l’applet de commande recherche des moyens de comparer les objets. Si les objets sont différents types, l’objet Difference est converti en type de l’objet ReferenceObject ensuite comparé.

Dans cet exemple, nous comparons une chaîne à un objet TimeSpan. Dans le premier cas, la chaîne est convertie en TimeSpan afin que les objets soient égaux.

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

Dans le deuxième cas, le TimeSpan est converti en chaîne afin que l’objet soit différent.

Paramètres

-CaseSensitive

Indique que les comparaisons doivent respecter la casse.

Propriétés du paramètre

Type:SwitchParameter
Valeur par défaut:False
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-Culture

Spécifie la culture à utiliser pour les comparaisons.

Propriétés du paramètre

Type:String
Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-DifferenceObject

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

Propriétés du paramètre

Type:

PSObject[]

Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:1
Obligatoire:True
Valeur du pipeline:True
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-ExcludeDifferent

Indique que cette applet de commande affiche uniquement les caractéristiques des objets comparés qui sont égaux. Les différences entre les objets sont ignorées.

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

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

Propriétés du paramètre

Type:SwitchParameter
Valeur par défaut:False
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-IncludeEqual

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

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

Propriétés du paramètre

Type:SwitchParameter
Valeur par défaut:False
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-PassThru

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

Propriétés du paramètre

Type:SwitchParameter
Valeur par défaut:False
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-Property

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

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

  • Expression - <string> ou <script block>

Pour plus d'informations, voir about_Calculated_Properties.

Propriétés du paramètre

Type:

Object[]

Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-ReferenceObject

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

Propriétés du paramètre

Type:

PSObject[]

Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:0
Obligatoire:True
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-SyncWindow

Spécifie le nombre d’objets adjacents qui Compare-Object inspecte lors de la recherche d’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 [int32]::MaxValue, ce qui signifie que Compare-Object examine l’ensemble de la collection d’objets.

Lorsque vous utilisez des collections volumineuses, la valeur par défaut peut ne pas être efficace, mais elle est exacte. La spécification d’une valeur plus petite pour SyncWindow peut augmenter les performances, mais peut avoir une précision inférieure.

Propriétés du paramètre

Type:Int32
Valeur par défaut:[int32]::MaxValue
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

CommonParameters

Cette applet de commande prend en charge les paramètres courants : -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction et -WarningVariable. Pour plus d’informations, consultez about_CommonParameters.

Entrées

PSObject

Vous pouvez envoyer un objet vers le bas du pipeline au paramètre DifferenceObject.

Sorties

None

Par défaut, cette applet de commande ne retourne aucune sortie lorsque l'ReferenceObject et la DifferenceObject sont identiques.

PSCustomObject

Lorsque les objets sont différents, cette applet de commande encapsule les objets différents dans un wrapper PSCustomObject avec un SideIndicator propriété pour référencer les différences.

Lorsque vous utilisez le paramètre IncludeEqual et que les objets sont identiques, l’applet de commande renvoie les objets encapsulés dans un PSCustomObject avec la propriété SideIndicator définie sur ==.

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

Notes

PowerShell inclut les alias suivants pour Compare-Object:

  • Windows :
    • compare
    • diff

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