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
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Étape 1 — Refuser un dossier de sortie inexistant
Vérifiez les cas d'erreur en premier, avec un exit immédiat, plutôt que d'imbriquer tout le reste du script dans un grand if. Le code principal reste ainsi lisible.
Étape 2 — Créer le dossier s'il manque, plutôt que d'échouer
Créer le dossier s'il manque, plutôt que d'échouer, rend le script rejouable sans effet indésirable : c'est l'équivalent PowerShell du if [ ! -d ] vu en Bash. | Out-Null évite d'afficher le résultat de New-Item, qui n'intéresse pas l'utilisateur ici.
Étape 3 — Alerter sur un disque trop rempli
$SeuilPourcent est un paramètre du script, pas une valeur fixe dans le code : chaque appelant peut ajuster la sensibilité de l'alerte sans modifier le script lui-même.
Étape 4 — Terminer avec un code de sortie explicite
Une tâche planifiée ne lit pas les messages affichés à l'écran, elle lit le code de sortie du script. Terminez toujours vos scripts d'administration par un exit explicite.