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/-orsans 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
whilesans 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-Datecomparée à un seuil) dans toute bouclewhiledestiné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_Switchetabout_Foreach(accessibles directement viaGet-Help about_If, sans connexion Internet nécessaire une foisUpdate-Helpexécuté, vu en leçon 1.4) détaille l’ensemble des variantes de syntaxe, y compris les usages avancés deswitchsur des tableaux ou des fichiers.
Retenez la logique de fond :
if/switchdé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.