> 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 gratuitement cette ressource

Le Guide Server & Data center

Le Guide Server & Data center

Le Nouveau Guide Atlassian Server & Data center liste les meilleures pratiques et solutions pour libérer le potentiel de toutes les équipes. Découvrez, pas à pas, comment fluidifier l’organisation, accentuer la communication et la collaboration. Plus de 100 000 entreprises dans le monde, comme Coca Cola, Visa ou BMW utilisent des produits de gestion des services, de communication en temps réel, de partage et de création de contenu et de suivi de projets d'Atlassian pour gagner en efficacité, notamment Jira Software, Confluence, Crowd, Trello, Bitbucket, Jira ServiceDesk et Bamboo. Découvrez les meilleures pratiques.

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