> Tech > La commande PowerShell Compare-Object

La commande PowerShell Compare-Object

Tech - Par Jeffery Hicks - Publié le 07 novembre 2011
email

Quelques astuces fort utiles, mais parfois ignorées de la cmdlet Compare-Object.

Ce dossier est issu de notre publication IT Pro Magazine (10/10). Pour consulter les schémas et illustrations associés, rendez-vous dans le club abonnés.

La commande PowerShell Compare-Object

Ce n’est pas la première fois que nous abordons la cmdlet PowerShell Compare-Object. Celle-ci comporte un alias diff et s’avère très utile pour comparer deux types d’objets différents (que demander de plus ?). En général, vous voulez comparer une certaine propriété. Voici un exemple standard permettant d’illustrer ce propos :

PS C:\> $now=get-process
PS C:\> calc
PS C:\> $after=get-process
PS C:\> diff $now $after -Property name
name SideIndicator
—- ————-
calc =>
PS C:\>

L’objet $now est un cliché (snapshot) de tous les processus en cours d’exécution. Je démarre ensuite Calculator et je prends un autre cliché. Grâce à Compare- Object, je peux identifier le processus dont l’exécution a été lancée dans l’intervalle. SideIndicator affiche cette information. Mais, qu’en est-il maintenant si je souhaite voir plus de choses sur le processus, peut-être parce que je souhaite arrêter tous les processus qui viennent d’être lancés ? J’ai besoin de dire à Compare-Object de passer l’intégralité de l’objet via le pipeline :

PS C:\> diff $now $after -Property name -passthru
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
——- —— —– —– —– —— — ———–
87 7 5496 11480 71 1.26 1724 calc

Si je réexécute la cmdlet et que je transmets le résultat vers Get-Member, je peux vérifier que j’obtiens en fait un objet Process. Cela me permet alors d’exécuter ce qui suit :

PS C:\> diff $now $after -Property name -passthru | kill

Voyons quelques autres manières d’employer Compare-Object. J’ai deux dossiers que je souhaite, en quelque sorte, maintenir synchronisés. Les fichiers présents dans folderA doivent aussi figurer dans folderB. Le fait que folderB comporte des fichiers supplémentaires ne pose pas de problèmes, tant qu’il conserve également une copie complète du contenu de folderA. Maintenant, je peux voir s’il y a un écart entre les deux :

PS C:\> $a=dir f:\folderA
PS C:\> $b=dir f:\folderB
PS C:\> $a.count
77
PS C:\> $b.count
76
PS C:\>

Pour les besoins de mon exemple, je vais seulement effectuer la synchronisation sur le nom du fichier :

PS C:\> diff $a $b -property Name
name SideIndicator
—- ————-
a.csv =>
b.csv =>
d.csv =>
w.txt <=
w1.txt <=
winrminfo.txt <=
wmidata.txt <=

Je m’intéresse uniquement aux fichiers présents dans $a mais pas dans $b. Je peux essayer de filtrer la sortie sur SideIndicator, mais je vais passer les objets et regarder uniquement les fichiers présents dans folderA :

PS C:\> diff $a $b -property Name -pass | Where
{$_.DirectoryName -eq «F:\folderA»}
Directory: F:\folderA
Mode LastWriteTime Length Name
—- ————- —— —-
-a— 5/14/2009 4:38 PM 863 w.txt
-a— 5/14/2009 4:42 PM 266 w1.txt
-a— 3/3/2009 12:41 PM 3538 winrminfo.txt
-a— 3/21/2009 4:47 PM 96786 wmidata.txt

Ces fichiers doivent être ajoutés à folderB :

PS C:\> diff $a $b -property Name -pass | Where {$_.
DirectoryName -eq «F:\folderA»} | copy -dest f:\folderB
-passthru

Directory: F:\folderB

Mode LastWriteTime Length Name
—- ————- —— —-
-a— 5/14/2009 4:38 PM 863 w.txt
-a— 5/14/2009 4:42 PM 266 w1.txt
-a— 3/3/2009 12:41 PM 63538 winrminfo.txt
-a— 3/21/2009 4:47 PM 96786 wmidata.txt

Je transfère simplement les objets de type fichier à Copy-Object et j’utilise son paramètre -passthru afin de voir les résultats. Désormais, tous les fichiers dans folderA figurent aussi dans folderB. Il ne faudrait pas beaucoup plus de temps pour effectuer la synchronisation dans les deux sens.
 

Téléchargez cette ressource

Travail à distance – Guide complet pour les Directions IT et Métiers

Travail à distance – Guide complet pour les Directions IT et Métiers

Le travail à distance met à l'épreuve la maturité numérique des entreprises en termes de Cybersécurité, d'espace de travail, de bien-être des collaborateurs, de communication et gestion de projet à distance. Découvrez, dans ce nouveau Guide Kyocera, quels leviers activer prioritairement pour mettre en place des solutions de travail à domicile efficaces, pérennes et sécurisées.

Tech - Par Jeffery Hicks - Publié le 07 novembre 2011