Le pipeline et les objets
La différence fondamentale entre PowerShell et les shells UNIX est la nature du pipeline. En Bash, | transporte du texte. En PowerShell, | transporte des objets .NET avec des propriétés et des méthodes.
Pourquoi les objets changent tout
# UNIX : parse du texte pour extraire le PID
ps aux | grep firefox | awk '{print $2}'
# PowerShell : accès direct à la propriété Id
Get-Process firefox | Select-Object -ExpandProperty Id
Pas de parsing fragile. Si Microsoft renomme une colonne dans la sortie texte, votre script Bash casse. Si Microsoft renomme une propriété objet, PowerShell émet une erreur explicite.
Select-Object : filtrer les propriétés
# Afficher uniquement Name et CPU des processus
Get-Process | Select-Object Name, CPU, WorkingSet
# Créer une propriété calculée
Get-Process | Select-Object Name, @{Name='RAM_MB'; Expression={[math]::Round($_.WorkingSet / 1MB, 2)}}
Where-Object : filtrer les objets
# Processus consommant plus de 100 Mo de RAM
Get-Process | Where-Object { $_.WorkingSet -gt 100MB }
# Services arrêtés
Get-Service | Where-Object { $_.Status -eq 'Stopped' }
# Syntaxe courte PowerShell 3+
Get-Service | Where-Object Status -eq Stopped
Sort-Object et Format-Table
# Trier par RAM décroissant, afficher les 5 premiers
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 | Format-Table Name, CPU, @{N='RAM_MB';E={[math]::Round($_.WorkingSet/1MB,1)}} -AutoSize
Cas concret : rapport des services arrêtés
Get-Service |
Where-Object { $_.Status -eq 'Stopped' -and $_.StartType -eq 'Automatic' } |
Select-Object Name, DisplayName, StartType |
Sort-Object DisplayName |
Export-Csv -Path C:\Temp\services-arretes.csv -NoTypeInformation
Ce pipeline en 5 étapes génère un rapport CSV des services automatiques arrêtés : utile en audit.
Erreurs fréquentes
- Oublier
$_dansWhere-Object:$_représente l'objet courant dans le pipeline. Sans lui, la condition ne fait pas référence à l'objet. - Mixer Format- avec d'autres cmdlets* :
Format-Tableconvertit les objets en objets de formatage. Ne pipez jamaisFormat-TableversExport-Csv: exportez AVANT de formater. - Trop tôt dans le pipeline :
Select-Object Nameen début de pipeline élimine les autres propriétés dont les cmdlets suivants auraient besoin.
À retenir
- Pipeline PowerShell = objets, pas du texte → accès direct aux propriétés.
Where-Object { $_.Propriété -opérateur valeur }pour filtrer.Select-Objectpour choisir les colonnes,Sort-Objectpour trier.- Formater (
Format-Table) seulement en dernière étape du pipeline.
Mini-exercice
Construisez un pipeline qui liste les 3 processus consommant le plus de mémoire virtuelle (VirtualMemorySize64), en affichant leur nom et leur consommation en Mo.