FRFAM.COM >> Famille >> Technologie &Innovation >> Informatique

Maîtriser les boucles PowerShell : ForEach, While, Do-While et bien plus

Apprendre à utiliser les boucles est une étape essentielle en programmation. PowerShell évolue avec vos compétences, vous permettant d'automatiser efficacement vos tâches quotidiennes.

Encadrez vos commandes habituelles dans des boucles pour gagner du temps et des efforts. Vos scripts gèrent les opérations répétitives pendant que vous vous concentrez sur des tâches plus stratégiques.

Boucles PowerShell ForEach : la porte d'entrée vers la gestion avancée des données

ForEach est un alias de ForEach-Object, un raccourci pratique pour cette commande PowerShell. Parlons maintenant de la gestion des données en PowerShell.

Comme la plupart des langages modernes, PowerShell est orienté objet. Tout est un objet : les variables possèdent des propriétés et méthodes étendues. C'est pourquoi une recherche sur une variable retourne un tableau de résultats.

$votreVar = Get-ChildItem *
foreach ($fichier in $votreVar) {
    # Vos étapes
}

Dans d'autres langages, traiter ce tableau nécessiterait plusieurs étapes : obtenir la longueur, puis itérer. En PowerShell, ForEach parcourt directement le tableau et applique l'action à chaque élément, économisant des lignes de code. Voici un exemple concret : un script qui archive en ZIP tous les fichiers non ouverts depuis 30 jours.

Création d'un système d'archivage de fichiers avec des boucles ForEach

Décomposons le script. Get-ChildItem liste tous les fichiers du dossier Documents via la variable d'environnement portable $env:USERPROFILE. Les résultats sont stockés dans $MyDocs. La boucle ForEach parcourt chaque $Doc in $MyDocs.

$oldDocs = @()
$MyDocs = Get-ChildItem -Path "$($env:USERPROFILE)\Documents" -Recurse
foreach ($doc in $MyDocs) {
    if ($doc.LastAccessTime -lt (Get-Date).AddDays(-30)) {
        $oldDocs += $doc
    }
}
$ArchiveFolder = New-Item -Path "$($env:USERPROFILE)\Documents\$((Get-Date -Format MMddyy).ToString())" -ItemType Directory
foreach ($doc in $oldDocs) {
    Move-Item -Path $doc.FullName -Destination "$($ArchiveFolder.FullName)\$($doc.Name)" -Confirm:$false
}
$source = $ArchiveFolder.FullName
$destination = "$($env:USERPROFILE)\Documents\$($ArchiveFolder.Name).zip"
Add-Type -AssemblyName "System.IO.Compression.FileSystem"
[IO.Compression.ZipFile]::CreateFromDirectory($source, $destination)
if (Test-Path $destination) {
    Remove-Item -Path $ArchiveFolder -Recurse -Confirm:$false
}

Dans la boucle, on vérifie si LastAccessTime dépasse 30 jours via Get-Date et AddDays(-30). Les fichiers correspondants sont ajoutés à $oldDocs. Ensuite, on crée un dossier daté, y déplace les fichiers, puis une archive ZIP via .NET. Si l'archive réussit, le dossier temporaire est supprimé. Planifiez ce script mensuellement pour libérer de l'espace et organiser vos Documents.

Boucles While et Do-While : itérations conditionnelles

Pour une boucle exécutée tant qu'une condition est vraie, utilisez While. Initialisez d'abord votre variable de comptage.

$i = 0
while ($i -lt 10) {
    # Vos étapes
    $i += 1
}

Si vous voulez que le code s'exécute au moins une fois, même si la condition est fausse initialement, optez pour Do-While.

do {
    # Vos étapes
} while (condition)

Ces boucles sont idéales pour les débutants en scripts quotidiens, notamment pour implémenter des temporisations. Exemple : un script qui redémarre une machine distante et vérifie son retour en 15 minutes.

Redémarrage et vérification avec une boucle Do-While

Utilisez Restart-Computer pour redémarrer (remplacez 127.0.0.1 par l'IP/DNS cible). Initialisez le compteur $i, puis la boucle Do-While avec Start-Sleep.

Restart-Computer -ComputerName 127.0.0.1
$i = 0
do {
    Start-Sleep -Seconds 300
    $i += 1
} while (-not (Test-Connection 127.0.0.1 -Quiet) -or $i -gt 3)
if ($i -gt 3) {
    Write-Output "La machine distante ne répond pas, veuillez vérifier."
} else {
    Write-Output "Redémarrage réussi."
}

La condition While combine Test-Connection -Quiet (Ping silencieux) et le compteur pour éviter les boucles infinies. À la fin, un if/else affiche le statut.

Autres boucles

PowerShell offre aussi For et Do-Until. For initialise, teste et incrémente en une ligne :

for ($i = 0; $i -lt 10; $i++) {
    # Vos étapes
}

Do-Until inverse Do-While : continue jusqu'à ce que la condition soit vraie. Do-While est plus versatile.

Maîtriser les boucles PowerShell : ForEach, While, Do-While et bien plus

Pour de l'aide, utilisez Get-Help about_ForEach, about_While, etc., pour exemples et astuces.

Évoluez avec PowerShell

Vous maîtrisez désormais les bases pour des scripts puissants. Automatisez votre environnement domestique ou professionnel. Associez-les à la gestion d'erreurs pour passer au niveau supérieur.

Quel script PowerShell ingénieux avez-vous créé avec des boucles ? Partagez-le en commentaires !


[]