Les conditions : if, elseif, else
Notions théoriques
La syntaxe
if ($age -ge 18) {
Write-Host "Majeur"
} elseif ($age -ge 16) {
Write-Host "Presque"
} else {
Write-Host "Mineur"
}
Les parenthèses autour de la condition et les accolades autour de chaque bloc sont obligatoires. Il n'y a ni then, ni fi.
Les opérateurs de comparaison
C'est le point central de cette séance. Confrontons-les directement à ce que vous connaissez déjà en Bash :
| Sens | PowerShell | Bash |
|---|---|---|
| égal | -eq | -eq (nombres) ou = (chaînes) |
| différent | -ne | -ne / != |
| inférieur | -lt, -le | -lt, -le |
| supérieur | -gt, -ge | -gt, -ge |
Les noms sont les mêmes, mais deux différences majeures :
- PowerShell les écrit entre parenthèses, sans crochets —
if ($n -eq 5), jamaisif [ $n -eq 5 ]. - PowerShell utilise ces mêmes opérateurs pour tous les types, nombres et chaînes confondus. Bash impose
-eqaux nombres et=aux chaînes ; PowerShell n'a pas cette distinction.
== n'existe pas en PowerShell : if ($a == $b) provoque une erreur. Et rappelez-vous, = reste toujours une affectation, jamais une comparaison.
Comparaisons de texte
$nom -like "SRV-*" # motif avec jokers * et ?
$nom -notlike "SRV-*"
$texte -match "^\d+$" # expression régulière (aperçu)
$tableau -contains "web" # le tableau contient-il cet élément ?
"web" -in $tableau # équivalent, écrit dans l'autre sens
Ces comparaisons sont insensibles à la casse par défaut. Pour forcer la sensibilité à la casse, préfixez d'un c : -ceq, -clike.
Combiner des conditions
-and # ET
-or # OU
-not # NON, ou !
if ($libre -lt 20 -and $Detail) { ... }
Tester l'existence d'un fichier ou d'un dossier
L'équivalent PowerShell des tests -e, -f, -d de Bash :
Test-Path -Path $Chemin # existe-t-il, fichier ou dossier ?
Test-Path -Path $Chemin -PathType Container # est-ce un dossier ?
Test-Path -Path $Chemin -PathType Leaf # est-ce un fichier ?
| Test Bash | Équivalent PowerShell |
|---|---|
[ -e fichier ] | Test-Path $fichier |
[ -f fichier ] | Test-Path $fichier -PathType Leaf |
[ -d dossier ] | Test-Path $dossier -PathType Container |
$null et les valeurs « fausses »
$null, 0, "", @() (tableau vide) et $false sont tous évalués comme faux dans un if.
Écrivez toujours $null à gauche de la comparaison :
if ($null -eq $Chemin) { ... }
Si $Chemin est une collection et que $null est placé à droite ($Chemin -eq $null), l'opérateur -eq se comporte comme un filtre sur la collection plutôt que comme un test global — un piège classique.
Savoir si la commande précédente a réussi
$?: un booléen ($true/$false) indiquant si la dernière commande a réussi — à la différence du code numérique$?de Bash.$LASTEXITCODE: le code de sortie numérique du dernier exécutable externe appelé (équivalent le plus proche du$?de Bash).exit 0/exit 1: termine le script avec un code exploitable, par exemple par une tâche planifiée.
switch existe aussi en PowerShell, comme alternative à une longue cascade de elseif. Nous le détaillerons au niveau 2.
| Bash | PowerShell |
|---|---|
if [ $n -eq 5 ]; then ... fi | if ($n -eq 5) { ... } |
-eq (nombres), = (chaînes) | -eq pour tous les types |
[ -d dossier ] | Test-Path $dossier -PathType Container |
$? = code numérique (0 = succès) | $? = booléen ; $LASTEXITCODE = code numérique |
Exemple pratique
<#
Script : Test-EspaceDisque.ps1
Rôle : alerter si un disque est presque plein
#>
param(
[string]$Lettre = "C:",
[int]$SeuilPourcent = 20
)
$disque = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='$Lettre'"
if ($null -eq $disque) {
Write-Host "Erreur : le lecteur $Lettre est introuvable" -ForegroundColor Red
exit 1
}
$pourcentLibre = [math]::Round(($disque.FreeSpace / $disque.Size) * 100, 1)
if ($pourcentLibre -lt $SeuilPourcent) {
Write-Host "ALERTE : $Lettre n'a plus que $pourcentLibre % d'espace libre" -ForegroundColor Red
exit 1
} elseif ($pourcentLibre -lt 40) {
Write-Host "Attention : $Lettre est à $pourcentLibre % libre" -ForegroundColor Yellow
} else {
Write-Host "$Lettre est en bonne santé ($pourcentLibre % libre)" -ForegroundColor Green
}
exit 0