Aller au contenu principal

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 :

SensPowerShellBash
é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 crochetsif ($n -eq 5), jamais if [ $n -eq 5 ].
  • PowerShell utilise ces mêmes opérateurs pour tous les types, nombres et chaînes confondus. Bash impose -eq aux nombres et = aux chaînes ; PowerShell n'a pas cette distinction.
attention

== 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.

attention

É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.
info

switch existe aussi en PowerShell, comme alternative à une longue cascade de elseif. Nous le détaillerons au niveau 2.

Et en Bash ?
BashPowerShell
if [ $n -eq 5 ]; then ... fiif ($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


Quel opérateur teste l'égalité en PowerShell ?


Pourquoi if [ $n -eq 5 ] échoue-t-il en PowerShell ?


Quelle condition sélectionne un nom de machine commençant par SRV- ?


Quelle commande vérifie qu'un chemin est bien un dossier ?


Pourquoi écrit-on if ($null -eq $x) plutôt que if ($x -eq $null) ?


TP pour réfléchir et résoudre des problèmes

Étape 1 — Refuser un dossier de sortie inexistant


Bonne pratique - Sortir tôt

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


Bonne pratique - Un script idempotent

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


Bonne pratique - Un seuil paramétrable, jamais codé en dur

$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


Bonne pratique - Un code de sortie exploitable

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.

📌 Une solution