Compare-Object
Compare deux ensembles d'objets.
Syntax
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
L’applet Compare-Object
de commande 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 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 chaîne. Vous pouvez fournir une ou plusieurs propriétés à utiliser pour la comparaison. Lorsque des 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 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 la référence ou les objets de différence sont null ($null
), Compare-Object
génère une erreur de fin.
Certains exemples utilisent la platissement pour réduire la longueur de ligne des exemples de code. Pour plus d’informations, consultez about_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 : cat, bird et racoon.
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 avec du contenu qui s’affichent 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.
À partir de PowerShell 7.1, lors de l’utilisation du paramètre ExcludeDifferent , IncludeEqual est déduit et la sortie contient uniquement les lignes contenues dans les deux fichiers, comme indiqué par 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 :
- InputObject en cours de comparaison
- 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 le instance de l’objet retourné a ajouté un Objet NoteProperty nommé SideIndicator. SideIndicator indique à quel objet d’entrée 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===
Lors de l’utilisation de PassThru, le type d’objet d’origine (System.Boolean) est retourné. Notez que la sortie affichée par le format par défaut pour les objets System.Boolean n’a pas affiché la propriété SideIndicator . Toutefois, l’objet System.Boolean retourné a ajouté noteProperty.
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.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -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 les objets comme égaux. Notez que la valeur de l’objet 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 de types différents, l’objet Difference est converti en type de l’objet ReferenceObject , puis 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, timeSpan est converti en chaîne de sorte que l’objet est différent.
Paramètres
-CaseSensitive
Indique que les comparaisons doivent respecter la casse.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Culture
Spécifie la culture à utiliser pour les comparaisons.
Type: | String |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-DifferenceObject
Spécifie les objets qui sont comparés aux objets de référence .
Type: | PSObject[] |
Position: | 1 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | 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 objets de référence et de différence .
Si ExcludeDifferent est spécifié sans IncludeEqual, il n’y a pas de sortie.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-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: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-PassThru
Lorsque vous utilisez le paramètre PassThru , Compare-Object
omet le wrapper PSCustomObject autour des objets comparés et retourne les objets différents, inchangés.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Property
Spécifie un tableau de propriétés des objets de référence et de différence à 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, consultez about_Calculated_Properties.
Type: | Object[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ReferenceObject
Spécifie un tableau d’objets utilisé comme référence pour la comparaison.
Type: | PSObject[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-SyncWindow
Spécifie le nombre d’objets adjacents qui Compare-Object
inspectent 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 travaillez avec 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.
Type: | Int32 |
Position: | Named |
Default value: | [Int32]::MaxValue |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Entrées
Vous pouvez envoyer un objet vers le bas du pipeline vers le paramètre DifferenceObject .
Sorties
None
Si l’objet de référence et l’objet de différence sont identiques, il n’y a pas de sortie, sauf si vous utilisez le paramètre IncludeEqual .
Si les objets sont différents, Compare-Object
encapsule 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 le instance de l’objet retourné a ajouté un Objet NoteProperty nommé 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 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 l’exemple 3 de cet article.