Table des matières

,

PowerShell : Les structures de contrôle

Les boucles

ForEach

La boucle ForEach permet de traiter chaque éléments d'un tableau ou plus généralement d'un objet itérable :

ForEach ($user in $users) {
     Set-ADUser $user -Department "Marketing"
}
A partir de PowerShell 7 une cmdlet ForEach-Object permet de paralléliser les traitements accélérant significativement le temps d'exécution. La commande précédente peut alors s'écrire :
$users | ForEach-Object -Parallel { Set-ADUser $user -Department "Marketing" }

For

La boucle For est utilisée dans les cas ou l'on souhaite répéter un nombre déterminé d'instructions.

For($i=1; $i -le 10; $i++) {
   Write-Host "Creating User $i"
}

Do While

Re-exécute un bloc d'instructions tant que la condition évaluée reste vraie

# Repose la question tant que l'utilisateur
# ne répond pas Oui
Do {
        $userChoise = Read-Host -Prompt "Oui ou Non"
} While ($userChoise -ne "Oui")

Do Until

Inversement, la structure de boucle Do…Until rejouera le boc d'instruction jusqu'à ce que la condi

# Repose la question tant que l'utilisateur ne répond
# pas Oui
Do {
        $userChoise = Read-Host -Prompt "Oui ou Non"
} Until ($userChoise -eq "Oui")

While

La boucle While commence par évaluer la condition avant l'exécution du bloc d'instructions. Le bonc peut donc s’exécuter 0 ou plusieurs fois contrairement aux structures Do..While|Until qui exécutent le bloc 1 ou plusieurs fois.

$userChoise = 'Oui'
 
# La variable est initialisée à 'oui'
# le bloc ci-dessous ne sera pas exécuté
While ( $userChoise -eq 'Non') {
        $userChoise = Read-Host -Prompt "Oui ou Non"
}

Break et Continue

Les instructions Break et Continue permettent de modifier le comportement par défaut des boucles :

Ces instructions peuvent être utilisées par exemple pour interrompre les traitements lorsque des données sont considérées invalides.

# Applique des traitements sur l'ensemble 
# des utilisateurs du tableau sauf l'administrateur
 
ForEach ($user in $users) {
   If ($user.Name -eq "Administrator") {Continue}
   Write-Host "Modify user object"
}

Les branchements

If

If ($freeSpace -le 5GB) {
   Write-Host "Free disk space is less than 5 GB"
} ElseIf ($freeSpace -le 10GB) {
   Write-Host "Free disk space is less than 10 GB"
} Else {
   Write-Host "Free disk space is more than 10 GB"
}

Switch

Pour un branchement conditionnel à choix multiples, il peut être plus lisible d'utiliser l'instruction Switch plutôt qu'une instruction If comprenant plusieurs sections ElseIf ou des If imbriqués.

Switch compare la valeur fournie a un ensemble de valeurs attendues. Un bloc d'instructions est associé et exécuté pour chaque alternative

Switch ($choice) {
   1 { Write-Host "You selected menu item 1" }
   2 { Write-Host "You selected menu item 2" }
   3 { Write-Host "You selected menu item 3" }
   Default { Write-Host "You did not select a valid option" }
}

Switch possède les options -Wilcard, -Like et -Regex permettant d'utiliser des méta-caractères pour l'évaluation sur les chaînes de caractères. Cette fonctionnalité a un comportement spécifique car plusieurs correspondances sont alors possibles : dans ce cas, les blocs de script pour tous les critères correspondants sont exécutés.

Switch -WildCard ($ip) {
   "10.*" { Write-Host "This computer is on the internal network" }
   "10.1.*" { Write-Host "This computer is in London" }
   "10.2.*" { Write-Host "This computer is in Vancouver" }
   Default { Write-Host "This computer is not on the internal network" }
 }

Seconde remarque si la variable a évaluer est un tableau, chaque élément sera évaluer.

Références