Utiliser la mise en forme et le filtrage
Quand vous utilisez PowerShell, le filtrage et la mise en forme sont des concepts importants à saisir, et ce pour plusieurs raisons. Premièrement, vous voulez créer un pipeline qui produit le résultat désiré. Deuxièmement, vous voulez que l’opération soit efficace, à la fois en ce qui concerne l’extraction des données sur le réseau et l’obtention d’un résultat exploitable.
Filtrage à gauche
Dans une instruction de pipeline, le filtrage à gauche signifie filtrer le plus tôt possible pour les résultats que vous voulez. Vous pouvez considérer que le terme gauche équivaut à tôt, car les instructions PowerShell s’exécutent de gauche à droite. L’idée est de rendre l’instruction rapide et efficace en veillant à ce que le jeu de données sur lequel vous travaillez soit le plus petit possible. Ce principe est vraiment efficace quand vos commandes sont appliquées à de grands magasins de données ou quand vous replacez les résultats sur le réseau.
Prenons l'instruction suivante :
Get-Process | Select-Object Name | Where-Object Name -eq 'name-of-process'
Cette instruction récupère d’abord tous les processus sur la machine. Il finit par mettre en forme la réponse afin que seule la propriété Name soit listée. Cette instruction ne suit pas le principe de filtrage à gauche, car elle s’applique à tous les processus, tente de mettre en forme la réponse, puis filtre à la fin.
Il est préférable de filtrer d’abord, puis de mettre en forme, comme dans l’instruction suivante.
Get-Process | Where-Object Name -eq 'name-of-process' | Select-Object Name
Souvent, une applet de commande qui offre le filtrage est plus efficace que l’utilisation de Where-Object. Voici une version plus efficace de l’instruction précédente :
Get-Process -Name 'name-of-process' | Select-Object Name
Dans cette version, le paramètre -Name effectue le filtrage pour vous.
Formatter correctement, comme si c’était la dernière chose que vous faisiez
Alors que le filtrage à gauche signifie filtrer les éléments le plus tôt possible dans une instruction, la mise en forme à droite signifie mettre en forme quelque chose le plus tard possible dans l’instruction. Mais pourquoi dois-je effectuer le formatage en dernier ? Cela se justifie par le fait que les commandes de mise en forme modifient la structure de l’objet contenant les résultats, et que vos données ne se trouvent donc plus dans les mêmes propriétés. À cause de cette modification, vous ne pouvez pas récupérer les informations souhaitées en utilisant des commandes pipe, Select-Object, ou en effectuant une boucle sur les résultats avec foreach.
La mise en forme détruit l’objet traité. Par exemple, prenons l’appel suivant :
Get-Process 'some process' | Select-Object Name, CPU | Get-Member
Le type que vous récupérez est System.Diagnostics.Process. Maintenant, ajoutez le formateur Format-Table comme suit :
Get-Process 'some process' | Format-Table Name,CPU | Get-Member
Si vous examinez les types obtenus, vous voyez que le résultat obtenu est différent :
TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData
Ces types ne sont pas l’objet de cette leçon. Il est important de comprendre que, selon le type de commande de mise en forme que vous utilisez, vos données sont différentes. En cas de changement, le résultat peut ne plus contenir les colonnes qui vous intéressent. Illustrons cela par un exemple :
Get-Process 'some process' | Select-Object Name, Cpu
La commande précédente vous donne un résultat avec les colonnes Name et CPU.
Name CPU
---- ---
zsh 1.2984395
zsh 0.2522047
zsh 0.2486375
zsh 0.2683466
zsh 0.2681874
zsh 1.6799438
zsh 0.2909816
zsh 0.7855272
Nous allons tout d’abord formater, puis utiliser Select-Object, pour illustrer ce qui peut se passer si vous ne formatez pas en dernier :
Get-Process 'some process' | Format-Table Name,CPU | Select-Object Name, CPU
Voilà à quoi ressemble le résultat :
Name CPU
---- ---
Il est vide, car Format-Table a transformé l’objet contenant vos résultats en plaçant les données dans d’autres propriétés. Vos données n’ont pas disparu mais seulement vos propriétés. La commande PowerShell précédente tente de rechercher des propriétés, mais ce n’est pas possible.
Les commandes de mise en forme doivent être le dernier élément dans votre instruction, car elles sont destinées à la mise en forme pour une présentation agréable à l’écran. Ces commandes ne sont pas destinées à être utilisées pour filtrer ou trier vos données.
Commandes de mise en forme
Les applets de commande les plus couramment utilisées pour mettre en forme la sortie sont Format-Table et Format-List. Par défaut, la plupart des applets de commande mettent en forme la sortie sous forme de tableau. Si vous ne souhaitez pas que votre sortie affiche des propriétés dans des colonnes, utilisez l’applet de commande Format-List pour les remettre au format liste.