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.