19Aug

Geek School: apprentissage de la mise en forme, du filtrage et de la comparaison dans PowerShell

Dans cette édition de Geek School, nous examinons la mise en forme, le filtrage et la comparaison d'objets dans le Pipeline.

Soyez sûr de lire les articles précédents de la série:

  • Apprendre à automatiser Windows avec PowerShell
  • Apprendre à utiliser des applets de commande dans PowerShell
  • Apprendre à utiliser des objets dans PowerShell

Et restez à l'écoute pour le reste de la série toute la semaine.

Formatage par défaut

Quand j'ai commencé avec PowerShell, je pensais que tout était magique, mais la vérité est qu'il faut juste un peu de temps pour comprendre ce qui se passe sous le capot. La même chose est vraie pour le système de formatage PowerShell. En fait, si vous exécutez la cmdlet Get-Service, la sortie générée affiche uniquement les propriétés 3: Status, Name et DisplayName.

Mais si vous redirigez Get-Service vers Get-Member, vous verrez que les objets ServiceController ont beaucoup plus que ces trois propriétés, alors que se passe-t-il?

La réponse réside dans un fichier caché qui définit la manière dont la plupart des cmdlets intégrées affichent leur sortie. Pour comprendre, tapez ce qui suit dans le shell et appuyez sur Entrée.

notepad C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ DotNetTypes.format.ps1xml

Si nous utilisons la fonction Find de notepad, nous pouvons rapidement passer à la section qui détaille la sortie de la cmdlet Get-Service en recherchant le ServiceControllertype.

Soudainement, vous pouvez voir que sous PowerShell est en train de formater les objets du type ServiceController dans le Pipeline et de créer une table avec trois colonnes: Status, Name et DisplayName. Mais que se passe-t-il si le type que vous traitez n'a pas d'entrée dans ce fichier ou dans un autre fichier de format? Eh bien, c'est assez simple en fait. Si l'objet sortant du pipeline possède 5 propriétés ou plus, PowerShell affiche toutes les propriétés de l'objet dans une liste;s'il a moins de 5 propriétés, il les affiche dans une table.

Formatage de vos données

Si vous n'êtes pas satisfait de la mise en forme par défaut d'un objet ou d'un type, vous pouvez lancer votre propre mise en forme. Il y a trois cmdlets que vous devez savoir pour le faire.

  • Format-List
  • Format-Table
  • Format-Wide

Format-Wide prend simplement une collection d'objets et affiche une seule propriété de chaque objet. Par défaut, il recherchera une propriété de nom;Si vos objets ne contiennent pas de propriété name, ils utiliseront la première propriété de l'objet une fois les propriétés triées par ordre alphabétique.

Get-Service |Format-Wide

Comme vous pouvez le voir, il a aussi deux colonnes par défaut, bien que vous puissiez spécifier à la fois quelle propriété vous voulez utiliser, ainsi que le nombre de colonnes que vous souhaitez afficher.

Get-Service |Format-Wide -Property DisplayName -Colonne 6

Si quelque chose est formaté en tant que table par défaut, vous pouvez toujours passer en mode liste à l'aide de la cmdlet Format-List. Jetons un coup d'œil à la sortie de la cmdlet Get-Process.

Cette vue tabulaire convient très bien à ce genre d'information, mais supposons que nous voulons l'afficher sous forme de liste. Tout ce que nous avons vraiment à faire est de le rediriger vers Format-List .

Get-Process |Format-List

Comme vous pouvez le voir, il n'y a que quatre éléments affichés dans la liste par défaut. Pour afficher toutes les propriétés de l'objet, vous pouvez utiliser un caractère générique.

Get-Process |Format-List -Property *

Vous pouvez également sélectionner uniquement les propriétés souhaitées.

Get-Process |Format-List -Nom de propriété, id

Format-Table, d'autre part, prend des données et les transforme en une table. Puisque nos données de Get-Process sont déjà sous la forme d'une table, nous pouvons l'utiliser pour choisir facilement les propriétés que nous voulons afficher dans la table. J'ai utilisé le paramètre AutoSize pour faire tenir toutes les données sur un seul écran.

Get-Process |Nom de la table de format, id -AutoSize

Filtrage et comparaison de

Une des meilleures choses à propos de l'utilisation d'un pipeline basé sur un objet est que vous pouvez filtrer les objets hors du pipeline à tout moment à l'aide de la cmdlet Where-Object.

Get-Service |Where-Object{ $ _. État -eq "en cours d'exécution"}

Utilisation de l'endroit où l'objet est réellement très simple.$ _ représente l'objet pipeline actuel, à partir duquel vous pouvez choisir une propriété sur laquelle vous souhaitez filtrer. Ici, nous ne conservons que les objets dont la propriété Status est égale à Running. Il existe quelques opérateurs de comparaison que vous pouvez utiliser dans le bloc de script de filtrage:

  • eq( Égal à)
  • neq( Non égal à)
  • gt( supérieur à)
  • ge( supérieur ou égal à)
  • lt( inférieur à)

Une liste complète et plus d'informations peuvent être consultées dans le fichier d'aide conceptuel about_comparison, mais il faut un certain temps pour s'habituer à la syntaxe Where-Obeject. C'est tout pour cette fois!