Skip to content

Les Objets avec PowerShell

L’une des grandes forces de PowerShell est sa capacité à manipuler des objets plutôt que du simple texte, ce qui facilite l’analyse, le tri, le filtrage et la réutilisation des données.

Objectif

À la fin de ce chapitre, vous saurez :

  • ce qu’est un objet en PowerShell (et pourquoi c’est différent du texte)
  • inspecter un objet avec Get-Member
  • lire et manipuler propriétés et méthodes
  • exploiter le pipeline avec Where-Object, Select-Object, Sort-Object, Group-Object
  • créer vos propres objets ([pscustomobject]) et produire une sortie “propre” pour des scripts

Le principe clé

PowerShell manipule des objets.

Dans beaucoup de shells, la sortie d’une commande est surtout du texte. En PowerShell, la sortie est (souvent) une collection d’objets.

Un objet = une « chose » avec :

  • des propriétés (des données) : ex. Name, Id, Status
  • des méthodes (des actions) : ex. ToString(), Kill(), ...

Exemple :

powershell
$p = Get-Process | Select-Object -First 1
$p

Info

$p n’est pas une ligne de texte. C’est un objet .NET (souvent un System.Diagnostics.Process).

Get-Member (alias gm)

La commande la plus importante pour découvrir les objects retourné par les cmdlets :

powershell
Get-Process | Select-Object -First 1 | Get-Member

Vous obtenez :

  • le TypeName (le type réel de l’objet)
  • la liste des propriétés et méthodes disponibles

Pour ne voir que les propriétés :

powershell
Get-Process | Select-Object -First 1 | Get-Member -MemberType Property

Accéder aux propriétés - la « syntaxe point »

On lit une propriété d'un objet avec un . :

powershell
$p = Get-Process | Select-Object -First 1
$p.Name
$p.Id

Objets en liste (pipeline)

powershell
Get-Process | Select-Object -First 5 -Property Name, Id

Vous remarquez : Select-Object fabrique un nouvel objet « réduit » qui ne contient que les propriétés demandées, ici Name et Id.

Appeler des méthodes

Une méthode s’appelle avec des parenthèses :

powershell
"bonjour".ToUpper()
( Get-Date ).AddDays(7)

Beaucoup d’objets ont des méthodes utiles, mais vous n’avez pas besoin de toutes les mémoriser : Get-Member vous les montre.

Le pipeline : on filtre, on transforme, on trie

Le pipeline | passe des objets de commande en commande.

Filtrer avec : Where-Object

powershell
# services en cours d'exécution
Get-Service | Where-Object Status -eq 'Running'

# processus consommant plus de 200 MB (WorkingSet en octets)
Get-Process | Where-Object WorkingSet -gt 200MB

Info

La forme « courte » Where-Object Property -op valeur marche quand le cas est simple.

Forme scriptblock est plus flexible :

powershell
Get-Process | Where-Object { $_.Name -like 'p*' }

Ici $_ représente l’objet courant qui passe dans le pipeline.

Transformer avec : Select-Object

powershell
Get-Process | Select-Object -First 10 Name, Id, CPU

Propriété calculée - quand vous voulez une colonne « sur mesure » :

powershell
Get-Process |
  Select-Object -First 10 Name,
    @{ Name = 'RAM_MB'; Expression = { [math]::Round($_.WorkingSet / 1MB, 1) } }

Ici l'on utilise [math]::Round(), pour arrondir la valeur retournée.

Trier avec : Sort-Object

powershell
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, CPU

Grouper avec : Group-Object

powershell
Get-Service | Group-Object Status

Important : formatage ≠ données

Format-Table / Format-List servent à afficher. Une fois que vous avez formaté, vous perdez souvent la possibilité de réutiliser l’objet correctement dans le pipeline.

Mauvaise habitude (à éviter) :

powershell
Get-Process | Format-Table Name, Id | Export-Csv processes.csv

Bonne habitude : manipuler les objets d’abord, puis formater seulement à la fin :

powershell
Get-Process |
  Select-Object Name, Id |
  Export-Csv -NoTypeInformation processes.csv

Les objets ont un type (et ça compte)

Vous pouvez vérifier le type comme ceci :

powershell
$p = Get-Process | Select-Object -First 1
$p.GetType().FullName

Créer vos propres objets avec : [pscustomobject]

Quand vous écrivez un script, vous voulez souvent produire un résultat structuré (facile à trier, filtrer, exporter).

powershell
$info = [pscustomobject]@{
  ComputerName = $env:COMPUTERNAME
  UserName     = $env:USERNAME
  When         = Get-Date
}

$info | Format-List

Vous pouvez ensuite exporter vers CSV/JSON :

powershell
$info | ConvertTo-Json

Manipulations courantes « style script »

Sélection + export

powershell
Get-Service |
  Select-Object Name, Status, StartType |
  Export-Csv -NoTypeInformation services.csv

Trouver « un seul objet »

powershell
$svc = Get-Service -Name 'w32time'
$svc.Status

Vérifier l’existence (pattern utile)

powershell
$svc = Get-Service -Name 'w32time' -ErrorAction SilentlyContinue
if ($null -eq $svc) {
  "Service introuvable"
} else {
  $svc.Status
}

Exemple plus complet

Objectif : produire un petit « rapport » RAM/CPU des 8 processus les plus gourmands.

powershell
Get-Process |
  Where-Object { $_.CPU -ne $null } |
  Sort-Object CPU -Descending |
  Select-Object -First 8 Name, Id,
    @{ Name = 'CPU_s';  Expression = { [math]::Round($_.CPU, 1) } },
    @{ Name = 'RAM_MB'; Expression = { [math]::Round($_.WorkingSet / 1MB, 0) } }

Vous obtenez une table d’objets que vous pouvez ensuite :

  • exporter (Export-Csv)
  • filtrer à nouveau
  • comparer d’un poste à l’autre

Mini-lab (à faire)

  1. Liste 10 processus (Get-Process) et affiche uniquement Name, Id, StartTime (attention : certains processus n’ont pas de StartTime accessible).
  2. Fais un tri décroissant sur la RAM.
  3. Crée un objet [pscustomobject] avec : When, ComputerName, TopProcessName, TopProcessRAMMB.
  4. Exporte ce résultat en JSON.

Résumer

  • PowerShell est un shell orienté objets.
  • Get-Member vous dit tout sur ce que vous manipulez.
  • Manipule des objets (Where-Object, Select-Object, Sort-Object) avant d’afficher (Format-*).
  • [pscustomobject] est la base pour produire des résultats propres dans vos scripts.