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.
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.
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.
Dans le contexte actuel, l'expérience client est un levier clé de réussite. Pour rester compétitives, les entreprises doivent adopter des stratégies CX audacieuses, en s'appuyant sur le cloud, le digital et l'IA. Alors quelles stratégies mettre en place pour garder une longueur d’avance ?