2.5 : Formater et analyser : Format-Table, Format-List, Out-GridView, Group-Object, Measure-Object, Compare-Object

Sophie s’arrête en bout de chaîne : « Une fois que les pièces sont triées et filtrées, il reste deux choses à faire : bien les présenter, et parfois les analyser plus finement avant de livrer le résultat. » Voici les six derniers postes de cette section, ceux qu’on trouve généralement en toute fin de tapis roulant.

Format-Table : l’affichage en colonnes

Par défaut, PowerShell choisit lui-même comment afficher un résultat — souvent déjà sous forme de tableau. Format-Table permet de reprendre la main sur cet affichage :

Get-Process | Format-Table -Property ProcessName, Id, WS -AutoSize

-AutoSize ajuste la largeur des colonnes au contenu réel, souvent plus lisible que l’affichage par défaut.

Point important : Format-Table casse le pipeline. Une fois passé par Format-Table, le résultat n’est plus une collection d’objets utilisables (Get-Member derrière renverra un type d’affichage, pas vos objets Process). Cette cmdlet doit donc toujours être la dernière du tapis, jamais suivie de Where-Object ou Sort-Object.

Format-List : l’affichage détaillé, une propriété par ligne

Quand un objet a beaucoup de propriétés, ou qu’on veut simplement tout voir en détail plutôt qu’en colonnes serrées :

Get-Process -Name pwsh | Format-List -Property *

Le * demande d’afficher toutes les propriétés disponibles, une par ligne — pratique pour explorer un objet inconnu en complément de Get-Member.

Out-GridView : une fenêtre interactive (Windows uniquement)

Sur Windows, Out-GridView ouvre une véritable fenêtre graphique avec tri et filtre interactifs à la souris — un vrai confort pour explorer un gros résultat sans tout retaper en ligne de commande :

Get-Process | Out-GridView

Comme évoqué en leçon 1.3, cette cmdlet dépend d’une brique Windows (elle nécessite le module Microsoft.PowerShell.GraphicalTools sur PowerShell 7, et n’est pas disponible sur Linux/macOS). Sur un poste Windows classique avec Windows PowerShell 5.1, elle fonctionne nativement.

Group-Object : regrouper les pièces par catégorie

Group-Object répartit les objets en groupes selon une propriété commune, un peu comme des casiers étiquetés à l’atelier :

Get-Service | Group-Object -Property Status

Résultat : un groupe pour chaque valeur distincte de Status (Running, Stopped…), avec le nombre d’éléments dans chacun (Count). Utile pour un premier coup d’œil rapide : « combien de services sont arrêtés, combien sont démarrés ? »

Measure-Object : mesurer une collection de pièces

Measure-Object calcule des statistiques simples sur une propriété numérique : somme, moyenne, minimum, maximum.

Get-Process | Measure-Object -Property WS -Sum -Average -Maximum

C’est la cmdlet qu’on utilisait déjà en filigrane en TP de la section 1 pour compter des objets (Measure-Object sans propriété renvoie simplement le Count).

Compare-Object : repérer les différences entre deux pièces

Compare-Object compare deux collections et indique ce qui diffère — extrêmement utile pour un audit (« quels services ont changé entre deux serveurs censés être identiques ? ») :

$servicesSRV01 = Get-Service -ComputerName SRV-01 | Select-Object -ExpandProperty Name
$servicesSRV02 = Get-Service -ComputerName SRV-02 | Select-Object -ExpandProperty Name

Compare-Object -ReferenceObject $servicesSRV01 -DifferenceObject $servicesSRV02

La colonne SideIndicator du résultat indique le sens de la différence : <= pour un élément présent uniquement dans $servicesSRV01, => pour un élément présent uniquement dans $servicesSRV02.

Un exemple qui combine plusieurs postes

Get-Service | 
    Group-Object -Property Status | 
    Sort-Object -Property Count -Descending | 
    Format-Table -Property Name, Count -AutoSize

Ici : on regroupe par statut, on trie les groupes par taille décroissante, puis on formate proprement en tableau — avec Format-Table bien en dernière position, comme convenu plus haut.

Retenez la distinction entre ces deux familles : Group-Object, Measure-Object et Compare-Object analysent vos objets et renvoient encore des objets exploitables ; Format-Table, Format-List et Out-GridView ne servent qu’à présenter un résultat final, et doivent toujours clore le tapis roulant

Dans la prochaine leçon, un TP pour mettre en pratique tout le trio de tri de la 2.4, avant de refermer cette section.