PowerShell - Pipelines

Pipelines

Comme sous Unix, PowerShell permet de chaîner des commandes entre elles. Le principe est le même : la sortie standard d'une commande est redirigée vers l'entrée standard de la commande suivante à l'aide du caractère | (pipe).

commande1 | commande2 | commande3

Cependant, PowerShell est plus puissant que les shells Unix traditionnels car il manipule des objets .NET plutôt que du texte brut (ce que nous verrons très prochainement). Cela permet de passer des données structurées entre les commandes, facilitant ainsi le traitement et la transformation des données.

Commençons tout d'abord par s'exercer avec les pipelines.

Pipelines simples

Un pipeline relie deux commandes : la sortie de la première devient l’entrée de la seconde.
Par exemple :

Dir | More

Ici, Dir (alias de Get-ChildItem) liste les fichiers et dossiers du répertoire courant, et More affiche la sortie page par page. La sortie de Dir est donc envoyée directement à More pour un affichage paginé.

Attention! Cette commande fonctionne uniquement dans la console PowerShell classique, et pas dans l’interface intégrée de PowerShell ISE ou autres environnements graphiques. En effet, More dépend de la console pour gérer l’affichage page par page. Lorsqu’on utilise PowerShell dans un environnement graphique, la sortie est capturée et affichée dans une fenêtre dédiée, ce qui empêche More de fonctionner correctement.

Un autre exemple (qui marchera partout) est le tri des processus par statut :

Get-Process | Sort-Object Status

Ici, Get-Process récupère la liste des processus en cours d'exécution, et Sort-Object Status trie cette liste par statut. La sortie de Get-Process est ainsi triée avant d'être affichée.

Ou encore, pour afficher certaines propriétés spécifiques des processus :

Get-Process | Select-Object -Property Name, Id, VM, PM

Ici, Select-Object -Property Name, Id, VM, PM sélectionne uniquement les propriétés Name, Id, VM (Virtual Memory) et PM (Physical Memory) des objets processus retournés par Get-Process.

Pipelines d'action

Certaines cmdlets effectuent des actions sur les objets qu'elles reçoivent en entrée. Par exemple, Stop-Process arrête un processus donné. Nous pouvons utiliser un pipeline pour arrêter un processus spécifique en fonction de son nom ou de son ID.

Par exemple, pour arrêter le processus notepad :

Get-Process -Name notepad | Stop-Process

Ici, Get-Process -Name notepad récupère le processus nommé notepad, et Stop-Process arrête ce processus.

Par sécurité , il est souvent préférable d'ajouter le paramètre -WhatIf à Stop-Process pour simuler l'arrêt sans réellement arrêter le processus :

Get-Process -Name notepad | Stop-Process -WhatIf

Ici, PowerShell affichera ce qu'il ferait sans réellement exécuter l'arrêt du processus.

Redirection de la sortie

Il est possible de rediriger la sortie d'une commande vers un fichier, au lieu de l'afficher à l'écran, en utilisant des pipelines. Pour ce faire, nous utilisons la cmdlet Out-File, qui écrit la sortie dans un fichier texte.

Par exemple, pour sauvegarder la liste des processus dans un fichier texte :

Get-Process | Out-File -FilePath "processes.txt"

Cependant, une manière plus simple et courante de rediriger la sortie vers un fichier est d'utiliser les opérateurs de redirection > et >>, qui est l'équivalent de ce qui se fait sous Unix.

Get-Process > processes.txt

Ici, la liste des processus est redirigée vers un fichier texte nommé processes.txt.

Pour rediriger la sortie en ajoutant au fichier au lieu de l'écraser, nous utilisons >> :

Get-Process >> processes.txt

Ici, la liste des processus est ajoutée à la fin du fichier processes.txt.