5.3 : Structures de contrôle (if, switch, boucles)

Vous avez déjà croisé un if et un foreach dans plusieurs exemples depuis la section 3, sans qu’on s’y attarde vraiment. Sophie referme le dernier script d’inventaire : « Il est temps de comprendre vraiment ce qu’on a utilisé sans le détailler jusqu’ici. Ce sont les fondations de tout script qui doit prendre une décision, ou répéter une action. »

if / elseif / else : prendre une décision

La structure conditionnelle la plus courante teste une condition, et exécute un bloc de code seulement si elle est vraie :

$espaceLibre = 15

if ($espaceLibre -lt 20) {
    Write-Warning "Espace disque faible : $espaceLibre Go restants"
} elseif ($espaceLibre -lt 50) {
    Write-Output "Espace disque correct, à surveiller"
} else {
    Write-Output "Espace disque confortable"
}

PowerShell évalue les conditions dans l’ordre, et s’arrête au premier bloc dont la condition est vraie. else n’est jamais obligatoire, mais elseif doit toujours suivre un if (jamais isolé).

Piège fréquent en environnement d’entreprise : combiner plusieurs conditions avec -and / -or sans parenthèses explicites peut produire un résultat inattendu dès que la logique se complique. Prenez l’habitude de parenthéser chaque condition individuelle dès que vous en combinez plus d’une :

if (($service.Status -eq "Stopped") -and ($service.StartType -eq "Automatic")) { ... }

switch : quand if/elseif s’allonge trop

Dès qu’on teste une même variable contre de nombreuses valeurs possibles, switch devient plus lisible qu’une longue chaîne de elseif :

$codeErreur = 3

switch ($codeErreur) {
    1 { Write-Output "Erreur réseau" }
    2 { Write-Output "Erreur d'authentification" }
    3 { Write-Output "Service indisponible" }
    default { Write-Output "Code erreur inconnu" }
}

default joue le même rôle qu’un else final, pour couvrir tous les cas non explicitement listés. switch accepte aussi des caractères génériques et des expressions régulières (-Wildcard, -Regex), utiles pour tester un nom de service ou un motif de fichier.

Les boucles : répéter une action

foreach parcourt chaque élément d’une collection (déjà vu en section 3 et 4) :

$serveurs = "SRV-01", "SRV-02", "SRV-03"

foreach ($serveur in $serveurs) {
    Write-Output "Vérification de $serveur"
}

for répète une action un nombre de fois défini, utile quand on a besoin d’un compteur explicite :

for ($i = 1; $i -le 5; $i++) {
    Write-Output "Tentative $i sur 5"
}

while répète une action tant qu’une condition reste vraie, sans nombre de répétitions connu à l’avance — typiquement pour attendre qu’un service atteigne un état donné :

$tentatives = 0
while ((Get-Service -Name "Spooler").Status -ne "Running" -and $tentatives -lt 5) {
    Start-Service -Name "Spooler"
    Start-Sleep -Seconds 2
    $tentatives++
}

Retour d’expérience terrain : une boucle while sans condition d’arrêt fiable (ici, $tentatives -lt 5) est l’une des causes les plus fréquentes de script bloqué en production, consommant du CPU indéfiniment sur un serveur. Ajoutez systématiquement un compteur ou une limite de temps (Get-Date comparée à un seuil) dans toute boucle while destinée à tourner sans surveillance.

break et continue : sortir ou passer

Deux mots-clés utiles pour affiner le comportement d’une boucle :

foreach ($serveur in $serveurs) {
    if ($serveur -eq "SRV-02") {
        continue   # passe au serveur suivant sans exécuter la suite pour SRV-02
    }
    if ($serveur -eq "SRV-03") {
        break      # arrête complètement la boucle dès qu'on atteint SRV-03
    }
    Write-Output "Traitement de $serveur"
}

Un exemple concret Nordika : combiner switch et foreach

$services = Get-Service -Name "Spooler", "W32Time", "Dnscache"

foreach ($service in $services) {
    switch ($service.Status) {
        "Running" { Write-Output "$($service.Name) : OK" }
        "Stopped" { 
            Write-Warning "$($service.Name) est arrêté, redémarrage..."
            Start-Service -Name $service.Name
        }
        default   { Write-Warning "$($service.Name) : état inattendu ($($service.Status))" }
    }
}

Source officielle : la documentation Microsoft about_If, about_Switch et about_Foreach (accessibles directement via Get-Help about_If, sans connexion Internet nécessaire une fois Update-Help exécuté, vu en leçon 1.4) détaille l’ensemble des variantes de syntaxe, y compris les usages avancés de switch sur des tableaux ou des fichiers.

Retenez la logique de fond : if/switch décident, les boucles répètent. La quasi-totalité des scripts d’automatisation de cette formation, y compris le TP à venir, combinent ces deux familles pour transformer une liste de tickets répétitifs en un script qui s’exécute une seule fois.

Dans la prochaine leçon, on structure ce code en blocs réutilisables : les fonctions et leurs paramètres.