2.3 : Le pipeline | : passer une pièce d’un poste à l’autre

Vous savez maintenant qu’une cmdlet renvoie de vrais objets (leçon 1.2), et que Get-Member permet d’ouvrir ces objets pour voir ce qu’ils contiennent (leçon 2.2). Il est temps de relier les postes de travail entre eux : c’est le rôle du pipeline, symbolisé par le caractère |.

Le principe du tapis roulant

Sophie pointe deux postes voisins de l’atelier : « Regarde. Ce que sort le premier poste, c’est exactement ce qu’attend le suivant en entrée. Rien ne se perd, rien ne se retranscrit. »

Get-Process | Where-Object { $_.WS -gt 100MB }

Ici, il se passe trois choses :

  1. Get-Process produit une collection d’objets Process
  2. Le | prend cette collection telle quelle (pas de texte, pas de conversion) et la pose sur le tapis
  3. Where-Object reçoit ces objets un par un, et ne garde que ceux dont la propriété WS (mémoire utilisée) dépasse 100 Mo

Aucune des deux cmdlets n’a besoin de « comprendre » l’affichage de l’autre. Elles se passent directement des objets .NET, avec toutes leurs propriétés intactes.

$_ : la pièce en cours de traitement

Vous avez sans doute remarqué $_ dans l’exemple ci-dessus. C’est une variable spéciale qui représente l’objet actuellement traité dans le pipeline, un par un — comme un ouvrier qui ne voit qu’une seule pièce à la fois sur le tapis, jamais la pile entière.

Get-Process | Where-Object { $_.ProcessName -eq "pwsh" }

Ici, $_ représente, tour à tour, chaque processus qui défile devant le poste Where-Object.

Enchaîner plusieurs postes

Rien n’empêche d’aligner plus de deux postes sur le tapis :

Get-Process | Where-Object { $_.WS -gt 100MB } | Sort-Object -Property WS -Descending | Select-Object -First 3

Lu à voix haute, ça donne : « Récupère tous les processus, ne garde que ceux qui dépassent 100 Mo, trie-les par mémoire décroissante, et affiche seulement les 3 premiers. »

Chaque poste fait une seule chose, simplement. C’est la somme de ces petites transformations qui donne sa puissance à la chaîne complète — bien plus lisible que d’essayer d’écrire toute la logique en une seule commande complexe.

L’ordre des postes a de l’importance

Un piège classique : l’ordre des cmdlets sur le tapis n’est pas interchangeable. Comparez :

Get-Process | Sort-Object -Property WS -Descending | Select-Object -First 3

avec

Get-Process | Select-Object -First 3 | Sort-Object -Property WS -Descending

La première version trie tous les processus puis garde les 3 plus gros. La seconde prend 3 processus au hasard (les 3 premiers renvoyés par Get-Process, sans logique de tri) puis les trie entre eux — ce qui ne donne presque jamais le résultat souhaité. Comme sur une vraie chaîne de montage : inverser deux postes change complètement la pièce finale.

Le pipeline n’est pas qu’une astuce de syntaxe pour raccourcir l’écriture : c’est la colonne vertébrale de PowerShell. La quasi-totalité des scripts de cette formation, y compris ceux que vous écrirez à la section 5, reposeront sur cette même logique : des cmdlets simples, enchaînées dans le bon ordre.

Dans la prochaine leçon, on détaille les trois postes de tri les plus utilisés au quotidien : Where-Object, Sort-Object et Select-Object.