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 :
$p = Get-Process | Select-Object -First 1
$pInfo
$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 :
Get-Process | Select-Object -First 1 | Get-MemberVous 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 :
Get-Process | Select-Object -First 1 | Get-Member -MemberType PropertyAccéder aux propriétés - la « syntaxe point »
On lit une propriété d'un objet avec un . :
$p = Get-Process | Select-Object -First 1
$p.Name
$p.IdObjets en liste (pipeline)
Get-Process | Select-Object -First 5 -Property Name, IdVous 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 :
"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
# 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 200MBInfo
La forme « courte » Where-Object Property -op valeur marche quand le cas est simple.
Forme scriptblock est plus flexible :
Get-Process | Where-Object { $_.Name -like 'p*' }Ici $_ représente l’objet courant qui passe dans le pipeline.
Transformer avec : Select-Object
Get-Process | Select-Object -First 10 Name, Id, CPUPropriété calculée - quand vous voulez une colonne « sur mesure » :
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
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, CPUGrouper avec : Group-Object
Get-Service | Group-Object StatusImportant : 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) :
Get-Process | Format-Table Name, Id | Export-Csv processes.csvBonne habitude : manipuler les objets d’abord, puis formater seulement à la fin :
Get-Process |
Select-Object Name, Id |
Export-Csv -NoTypeInformation processes.csvLes objets ont un type (et ça compte)
Vous pouvez vérifier le type comme ceci :
$p = Get-Process | Select-Object -First 1
$p.GetType().FullNameCréer vos propres objets avec : [pscustomobject]
Quand vous écrivez un script, vous voulez souvent produire un résultat structuré (facile à trier, filtrer, exporter).
$info = [pscustomobject]@{
ComputerName = $env:COMPUTERNAME
UserName = $env:USERNAME
When = Get-Date
}
$info | Format-ListVous pouvez ensuite exporter vers CSV/JSON :
$info | ConvertTo-JsonManipulations courantes « style script »
Sélection + export
Get-Service |
Select-Object Name, Status, StartType |
Export-Csv -NoTypeInformation services.csvTrouver « un seul objet »
$svc = Get-Service -Name 'w32time'
$svc.StatusVérifier l’existence (pattern utile)
$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.
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)
- Liste 10 processus (
Get-Process) et affiche uniquementName,Id,StartTime(attention : certains processus n’ont pas deStartTimeaccessible). - Fais un tri décroissant sur la RAM.
- Crée un objet
[pscustomobject]avec :When,ComputerName,TopProcessName,TopProcessRAMMB. - Exporte ce résultat en JSON.
Résumer
- PowerShell est un shell orienté objets.
Get-Membervous 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.
