{{tag>dev powershell}} ====== 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 : * **Continue** interrompt l'itération courante de la boucle et continue immédiatement sur l'itération suivante de la boucle ; * **Break** arrête complètement le traitement de la boucle. 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 ===== * https://learn.microsoft.com/fr-fr/training/modules/work-script-constructs-windows-powershell/