Automatiser des tâches répétitives en PowerShell, c’est souvent le nerf de la guerre pour les prestataires de services managés (MSP). Mais face à des collections de fichiers, de services ou d’objets à traiter en boucle, on se retrouve vite à bricoler du script à rallonge... et à se battre avec la syntaxe. C’est là que foreach PowerShell entre en jeu : une méthode simple mais puissante pour faire le ménage, ligne par ligne.
Heureusement, PowerShell a une arme bien affûtée dans sa boîte à outils : la boucle foreach. Elle permet de parcourir chaque élément d’un ensemble pour lui appliquer des actions ciblées — sans perdre la tête (ni les performances).
Dans cet article, on décortique ensemble les différentes manières d’utiliser foreach, on compare avec ForEach-Object, on explore des cas concrets avec Get-ChildItem, des scripts typiques pour MSP, et même quelques astuces de traitement parallèle.
Alors si tu veux dompter tes collections comme un chef et automatiser comme un pro, ce guide est fait pour toi.
Envie d’aller encore plus loin dans la gestion automatisée de vos environnements ? Le pack Kaseya 365 proposé par BeMSP est là pour vous. Supervision, documentation, gestion des tickets, sécurité… tout est intégré, scriptable, et pensé pour faire le job à votre place.
À Retenir
- foreach est la boucle idéale pour automatiser des traitements sur des collections (fichiers, utilisateurs, objets, etc.)
- Elle offre une syntaxe claire : foreach ($item in $collection) { # action }
- Utilisez des noms de variables explicites ($utilisateur, $fichier, etc.) pour améliorer la lisibilité
- Pour les pipelines, préférez ForEach-Object, notamment avec -Parallel sous PowerShell 7+
- Combinez foreach avec Get-ChildItem, Where-Object, ou Export-Csv pour booster vos scripts
- Kaseya 365 vous permet d’automatiser, superviser et documenter vos actions PowerShell à grande échelle
Qu'est-ce que la boucle foreach en PowerShell ?
Commençons par les bases. La boucle foreach, en PowerShell, c’est l’équivalent d’un chef de cuisine qui passe chaque ingrédient en revue pour y appliquer la même action. Pas besoin de conditions tordues ou de compteurs manuels : elle s’occupe de tout, un élément à la fois.
La syntaxe de base
Voici la structure générique de la boucle :
foreach ($item in $collection) {
# Actions à effectuer sur $item
}
Décomposons ça tranquillement :
- $item : c’est la variable temporaire qui contiendra l’élément en cours. Elle change à chaque tour de boucle.
- $collection : c’est l’ensemble d’éléments que vous voulez parcourir. Ça peut être un tableau, une sortie de commande comme Get-ChildItem, ou même une liste d’objets personnalisés.
- le bloc {} : c’est là que vous placez les actions à répéter pour chaque élément. Vous pouvez y faire ce que vous voulez : affichage, condition, modification, suppression...
Autre exemple basique avec des fichiers
Prenons un cas ultra-courant : vous voulez afficher les noms de tous les fichiers dans un dossier. Avec foreach, c’est aussi simple que ça :
foreach ($file in Get-ChildItem) {
Write-Output $file.Name
}
Explication ligne par ligne :
- Get-ChildItem : récupère la liste des fichiers et dossiers dans le répertoire courant. C’est le fournisseur de la collection.
- $file : à chaque itération, cette variable contient un objet FileInfo ou DirectoryInfo issu de Get-ChildItem.
- Write-Output $file.Name : on affiche simplement le nom de l’élément courant.
Résultat : tous les noms de fichiers (et dossiers) apparaissent un à un dans la console. Facile, lisible, efficace.
Autre cas d’usage
Exécuter une commande simple pour inspecter des éléments système.
PowerShell brille justement par sa capacité à enchaîner les instructions de manière fluide.
Si vous explorez déjà les différentes façons d’utiliser foreach, c’est probablement que vous jonglez régulièrement avec des instructions comme Get-ChildItem, Get-Process, ou même des scripts un peu plus avancés.
À ce sujet, cet aperçu des commandes PowerShell essentielles est une bonne base pour enrichir votre boîte à outils.
Zoom sur la variable d’itération : $item, ou comment parler clairement à son script
Dans une boucle foreach, la variable que vous déclarez entre parenthèses est la star du moment : elle représente l’élément en cours de traitement dans la collection. On la voit souvent sous le nom générique $item, mais... vous pouvez faire bien mieux.
Donner un nom parlant à sa variable
Prenons un exemple. Si vous bouclez sur une liste d’utilisateurs Active Directory, pourquoi garder $item quand vous pouvez nommer la variable $utilisateur ?
Ça change tout en termes de lisibilité, surtout pour les scripts que vous ou un collègue relirez dans 6 mois à 2h du mat.
foreach ($utilisateur in Get-ADUser -Filter *) {
Write-Output $utilisateur.SamAccountName
}
Ici, pas besoin de deviner ce que contient la variable : on sait d'emblée qu’on manipule un utilisateur. Et si votre collection contient des fichiers, des groupes, des processus, vous pouvez faire pareil : $fichier, $groupe, $processus… Du sur-mesure syntaxique.
La lisibilité, c’est la maintenabilité
Un script clair, c’est un script qu’on peut déboguer ou améliorer sans froncer les sourcils. En choisissant des noms de variables explicites dans foreach, vous facilitez :
- La lecture rapide du code
- La compréhension des actions menées sur chaque objet
- La collaboration avec d’autres techniciens
Et accessoirement, vous réduisez le risque d’erreurs dues à des variables génériques qui se ressemblent toutes.
Que peut-on faire dans le bloc de code d’un foreach ?
C’est ici que la magie opère. Le bloc {} est votre terrain de jeu : chaque instruction à l’intérieur sera répétée pour chaque élément de la collection. Et PowerShell ne fait pas les choses à moitié : vous pouvez tout y mettre.
Quelques super-pouvoirs du bloc foreach :
- Conditions : if, switch, pour adapter les actions selon les cas.
- Cmdlets : tous les outils de l’écosystème PowerShell (et il y en a une sacrée panoplie).
- Manipulations de fichiers : lecture, écriture, copie, suppression...
- Transformations : conversions de formats, calculs, création d’objets personnalisés.
- Export : CSV, JSON, XML, ou même en base de données si vous êtes joueur.
Exemple : créer une copie .bak de chaque fichier .conf
Imaginons un dossier plein de fichiers de configuration. Vous voulez garder une sauvegarde avant modification ? Pas de souci :
foreach ($confFile in Get-ChildItem -Filter *.conf) {
Copy-Item $confFile.FullName -Destination "$($confFile.FullName).bak"
}
Ce script parcourt chaque fichier .conf, et crée une copie .bak à côté. C’est rapide, clair, et surtout… vous n’avez pas à faire ça à la main fichier par fichier (ce qui, avouons-le, est une torture digne de 1998).
Autre exemple : appliquer un traitement conditionnel
Vous pouvez aussi intégrer des conditions directement dans la boucle :
foreach ($log in Get-ChildItem -Filter *.log) {
if ($log.Length -gt 100KB) {
Write-Output "Fichier volumineux détecté : $($log.Name)"
}
}
Ici, on ne signale que les fichiers .log dépassant les 100 Ko. Une logique simple, mais puissante pour des scripts de surveillance ou d’audit.
Foreach PowerShell vs ForEach-Object : quelle différence ?
PowerShell propose deux approches pour itérer sur des collections :
- Foreach : structure de contrôle qui charge toute la collection en mémoire avant de l'itérer.
- ForEach-Object : cmdlet utilisée dans un pipeline, traitant chaque objet au fur et à mesure.
Exemple avec ForEach-Object :
Get-ChildItem | ForEach-Object {
Write-Output $_.Name
}
Utilisez foreach lorsque vous avez besoin de manipuler l'ensemble de la collection en mémoire, et ForEach-Object pour traiter des flux de données dans un pipeline.
Utiliser Get-ChildItem avec foreach
Get-ChildItem (alias gci) permet de lister les fichiers et dossiers d'un répertoire. Combiné avec foreach, vous pouvez effectuer des opérations sur chaque élément.
Exemple : afficher la taille de chaque fichier dans un dossier :
foreach ($file in Get-ChildItem -File) {
Write-Output "$($file.Name) - $($file.Length) octets"
}
Exemples pratiques avec foreach
- Renommer des fichiers
- Ajouter un suffixe "_backup" à tous les fichiers .txt :
foreach ($file in Get-ChildItem -Filter *.txt) {
Rename-Item $file.FullName "$($file.BaseName)_backup.txt"
}
- Modifier le contenu de fichiers
- Ajouter une ligne au début de chaque fichier .log :
foreach ($file in Get-ChildItem -Filter *.log) {
$content = Get-Content $file.FullName
$newContent = "Log Start:`n" + $content
Set-Content $file.FullName $newContent
}
Variables dans foreach
Dans une boucle foreach, la variable d'itération (par exemple, $item) représente l'élément courant de la collection. Vous pouvez également utiliser la variable automatique $_ dans ForEach-Object.
Exemple avec ForEach-Object :
Get-Process | ForEach-Object {
Write-Output $_.ProcessName
}
Paralléliser avec ForEach-Object -Parallel
Depuis PowerShell 7, vous pouvez exécuter des boucles en parallèle pour améliorer les performances :
1..5 | ForEach-Object -Parallel {
Start-Sleep -Seconds 1
"$_ terminé"
}
Notez que l'utilisation de -Parallel nécessite PowerShell 7 ou supérieur.
Astuces supplémentaires
- Évitez Write-Host : utilisez Write-Output pour permettre la redirection de la sortie.
- Utilisez Export-Csv : pour exporter des données structurées.
- Combinez avec Where-Object : pour filtrer les éléments avant l'itération.
Conclusion : maîtriser foreach, c’est automatiser avec style
La boucle foreach Powershell, c’est un peu le moteur diesel du scripting PowerShell : fiable, endurante, et toujours prête à tourner. En comprenant ses usages, en personnalisant vos variables et en combinant intelligemment les cmdlets, vous gagnez non seulement en efficacité, mais aussi en clarté dans vos scripts.
Que vous manipuliez des fichiers, des utilisateurs, ou des flux d’informations plus complexes, foreach est une alliée précieuse pour industrialiser vos tâches récurrentes. Et en tant que MSP, chaque minute automatisée, c’est du temps rendu à votre équipe, à vos clients, et à votre croissance.
Demandez une démo gratuite dès maintenant et voyez comment Kaseya et PowerShell peuvent transformer votre quotidien de MSP.
FAQ
Quelle est la méthode foreach dans PowerShell ?
La méthode foreach permet de parcourir chaque élément d’une collection (fichiers, utilisateurs, processus, objets personnalisés...) pour exécuter une ou plusieurs instructions.
Elle est utilisée pour automatiser des traitements répétitifs sans avoir à écrire du code complexe. C’est l’outil idéal pour travailler de manière structurée sur des listes d’éléments — un classique pour tout MSP qui veut gagner du temps.
Quand utiliser foreach ?
Utilisez foreach lorsque :
- Vous avez besoin de répéter une action sur chaque élément d’un tableau, d’un résultat de commande ou d’une collection.
- Vous souhaitez conserver la collection entière en mémoire (ce qui est pratique pour la modifier, l’analyser ou y revenir).
La lisibilité du script est importante (par exemple pour des scripts partagés dans une équipe technique).
C’est la méthode à privilégier pour des scripts planifiés, des traitements batch ou des opérations où vous avez besoin de garder le contrôle sur chaque itération.
Comment exécuter une commande sur PowerShell ?
Lancer une commande sur PowerShell, c’est aussi simple que d’ouvrir un terminal. Tapez votre commande (par exemple Get-Service ou foreach ($u in $users) { Write-Output $u }) puis validez avec Entrée. Vous pouvez enchaîner plusieurs instructions, les combiner dans des scripts .ps1, ou utiliser des modules comme ceux fournis par Kaseya ou Datto pour gérer vos environnements clients de manière proactive.
Quels sont les trois types de variables dans PowerShell ?
Même si PowerShell est dynamiquement typé (il devine le type de données que vous utilisez), on peut distinguer trois grandes familles de variables, utiles à connaître pour organiser vos scripts :
- Types simples : comme les chaînes de caractères (string), les entiers (int), les booléens ($true, $false).
- Collections : comme les tableaux (@()) ou les listes d’objets renvoyées par des cmdlets (résultat de Get-ChildItem, par exemple).
- Objets complexes : comme les objets personnalisés ([PSCustomObject]), les hashtables (@{ clé = valeur }), ou les objets issus d’API ou de modules tiers.
Bien structurer vos variables permet de mieux manipuler les données, mais aussi de documenter vos scripts sans effort.
Quelle est la limite de foreach parallèle dans PowerShell ?
Lorsque vous utilisez ForEach-Object -Parallel (fonctionnalité introduite à partir de PowerShell 7), PowerShell lance plusieurs blocs d’instructions en parallèle — pratique pour gagner en vitesse sur des traitements lourds ou distants.
Par défaut, le nombre de threads parallèles est limité à 5. Mais vous pouvez l’augmenter avec le paramètre -ThrottleLimit, par exemple :
1..20 | ForEach-Object -Parallel { $_ * 2 } -ThrottleLimit 10
Attention : comme toujours avec la parallélisation, qui dit performance dit aussi vigilance — testez bien vos scripts sur des environnements de recette avant de les envoyer en prod.




