⏹ FOR
La commande FOR est sans doute l’une des commandes les plus puissantes du terminal de commande Windows.
Elle permet d’exécuter une même instruction plusieurs fois, en parcourant une liste de fichiers, de dossiers, de nombres ou même le contenu d’une commande.
Grâce à elle, on peut automatiser des tâches répétitives, traiter des lots de données ou appliquer une action à un ensemble d’éléments.
C’est une commande essentielle pour créer des scripts batch efficaces et gagner du temps dans l’administration système.
La commande FOR permet de pallier le fait que le terminal de commandes Windows ne gère pas la substitution de commande, comme le font d’autres interpréteurs de commandes tels que bash.
FOR syntaxe générale
Effectuer conditionnellement une commande sur plusieurs fichiers, dossiers ou sur un ensemble d'éléments.
Syntaxe :
FOR %%parametre IN (set) DO commande
set : Un ensemble d'un ou plusieurs fichiers, dossiers ou éléments, séparés par un
délimiteur standard.
Les Wildcards peuvent être utilisés.
commande : La commande à effectuer, y compris tous les paramètres.
Cela peut être une seule commande, ou si vous l'enfermez dans des parenthèses, plusieurs commandes, une par ligne.
%%paramètre : Un paramètre de substitution :
dans un fichier batch, utilisez une variable avec les majuscules de A à Z ou les minuscules de a à z.
⚠ La commande FOR est sensible à la casse
Ainsi une variable %%a est différente d'une variable %%A
🞜 Lister les fichiers BAT du répertoire courant
::EXEMPLE COMMANDE FOR ECHO LISTE LES FICHIERS BAT DU REPERTOIRE COURANT FOR %%f in (*.bat) DO ECHO %%f PAUSE
🞜 Faire une sauvegarde
ECHO FAIRE UNE SAUVEGARDE
FOR %%f in (*.bat) DO (
COPY /Y %%f "backup/%%f"
ECHO %%f a été sauvegardé dans backup/%%f
)
PAUSE
🞜 Boucle récursive FOR /R
Recherche récursive de fichiers
Synthaxe : FOR /R %%parametre IN (set) DO commande
FOR /R %%i IN (*.bat) DO (
ECHO %%i
)
PAUSE
🞜 Boucle récursive FOR /D /R
Recherche récursive de répertoires
Synthaxe : FOR /D /R %%parametre IN (set) DO commande
Cet exemple renvoie tous les sous répertoires de C:\AMD
CD C:\AMD
FOR /D /r %%i IN (*) DO (
ECHO %%i
)
PAUSE
Cet exemple renvoie uniquement les sous répertoires dont le non contient USB
CD C:\AMD
FOR /D /R %%i IN (USB) DO (
ECHO %%i
)
PAUSE
🞜 Dans une variable ou un ensemble
ECHO Dans un ensemble d'éléments FOR %%f in (Bonjour tout le monde) DO ECHO %%f ECHO Dans une variable SET CHAINE=Salut les amis FOR %%f in (%CHAINE%) DO ECHO %%f PAUSE
FOR pour effectuer des boucles sur des plages de nombres entiers
Syntaxe :
FOR /L %%parametre IN (start,step,end) DO command
💡 Expansion retardée (To be or not to be ?)
Dans cet exemple, nous allons introduire une notion clef relative à l'expansion retardée des variables.
Quand l’interpréteur cmd.exe lit un script batch, il analyse d’abord chaque bloc entre parenthèses en une seule fois avant de l’exécuter.
Pendant cette analyse, il remplace toutes les variables écrites avec %var% par leur valeur immédiate, c’est-à-dire celle qu’elles ont au moment de la lecture du bloc, pas pendant son exécution.
La variable est évaluée à la fin de l'exécution du bloc.
Ainsi, si une variable change à l’intérieur du bloc, cette nouvelle valeur n’est pas vue, car le remplacement a déjà eu lieu.
L'activation de l'expansion retardée modifie ce comportement : les variables entourées par ! (ex : !Result!) ne sont plus remplacées à la lecture du bloc, mais au moment de l’exécution réelle de chaque ligne.
Ce qui permet de voir les changements de valeur au fur et à mesure.
En exemple :
🞜 AVEC EXPANSION RETARDEE
::EXEMPLE COMMANDE FOR LOOP
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%f in (1,1,5) DO (
FOR /L %%g in (1,1,5) DO (
SET /A Result = "%%f*%%g"
ECHO %%f x %%g = !Result!
)
)
PAUSE
🞜 SANS EXPANSION RETARDEE
La variable est évaluée à la fin de l'exécution du bloc. Elle vaut 25 dans notre
exemple.
::EXEMPLE COMMANDE FOR LOOP
FOR /L %%f in (1,1,5) DO (
FOR /L %%g in (1,1,5) DO (
SET /A Result ="%%f*%%g"
ECHO %%f x %%g = %Result%
)
)
ECHO %Result%
PAUSE
FOR /F : Analyse la sortie des commandes, de fichiers ou de chaines
Synthaxe :
FOR /F "options" %%parametre IN ('commande à analyser') DO command
FOR /F "options" %%parametre IN (Fichier à analyser) DO command
FOR /F "options" %%parametre IN ("Chaine") DO command
Options:
skip=n
un certain nombre de lignes à sauter au début. Par défaut = 0.
eol=;
caractère au début de chaque ligne pour indiquer un commentaire
Par défaut un point-virgule;
tokens=n
Le nombre d'éléments à analyser pour chaque ligne. Ces éléments sont récupérès dans les paramètres associés aux tokens.
Exemple : On traite les 2 premiers tokens.
FOR /F "tokens=1,2 delims=;" %%a IN ("Element1;Element2;Element3") DO ECHO %%a %%b
%%a==Element1
%%b==Element2
Element3 est ignoré.
Exemple : On traite le premier et le troisième
FOR /F "tokens=1,3 delims=;" %%a IN ("Element1;Element2;Element3") DO ECHO %%a %%b
%%a==Element1
%%b==Element3
Exemple : On traite le premier token et le reste de la ligne est récupéré dans le 2eme tokens.
FOR /F "tokens=1,* delims=;" %%a IN ("Element1;Element2;Element3") DO ECHO %%a %%b
%%a==Element1
%%b==Element2;Element3
Par défaut = 1
usebackq : Change l'interprétation des caractères
💡 Par défaut :
① Les fichiers sont indiqués sans guillemets
for /f %%A in (fichier.txt) do echo %%A
② Les chaînes sont indiquées entre guillemets
for /f "tokens=1" %%A in ("une chaine de texte") do echo %%A
③ Les commandes sont indiquées entre apostrophes simples
for /f %%A in ('dir /b') do echo %%A
💡 Avec l'option usebackq
① Les fichiers doivent être entre guillemets :
for /f "usebackq" %%A in ("fichier.txt") do echo %%A
② Les chaînes sont encadrées par des backquotes inversés (`texte`) :
for /f "usebackq" %%A in (`une chaine de texte`) do echo %%A
③ Les commandes sont indiquées entre apostrophes simples
for /f "usebackq" %%A in ('dir /b') do echo %%A
En résumé :
╔══════════════════╦═══════════════╦═════════════════╗
║ Type de donnée ║ Sans usebackq ║ Avec usebackq ║
║══════════════════╬═══════════════╬═════════════════║
║ Fichier ║ (fichier.txt) ║ ("fichier.txt") ║
║ Chaîne littérale ║ ("texte") ║ (`texte`) ║
║ Commande ║ ('commande') ║ ('commande') ║
╚══════════════════╩═══════════════╩═════════════════╝
delims=xx
A positioner en dernier.
Le(s) caractère(s) délimiteur(s) par défaut: un espace, une tabulation.
Peut être tout autre caractère (: ,) ou plusieurs (xy par exemple).
⚠ Si le délimiteur est un guillemet ", le signe pourcent % ou tilde ~
Il faut echapper ces caractères en procédant comme suit :
① enlever les guillemets "double quotes" de la chaine option.
② prefixer par escape (^) tous les signes de ponctuation de la chaine option y compris le égal (=)
Voir plus bas, section OMG ! 😰
Le plus simple dans ce cas étant de changer le délimiteur par un caractère plus simple à traiter.
🞜 Cet exemple affiche les véhicules de marque Renault du fichier vehicule.txt
Fichier vehicule.txt :
Marque;Modèle;Prix
Peugeot;308;27500
Renault;Clio;18900
Citroen;Berlingo;26500
Peugeot;2008;25500
Renault;Captur;24500
Citroen;C3;17900
Renault;Megane;27500
Citroen;C4;23900
Peugeot;208;19900
::Affiche les véhicules de marque Renault
FOR /F "tokens=1,2,3 skip=1 delims=;" %%a IN (vehicule.txt) DO (
IF %%a==Renault ECHO %%a %%b %%c
)
PAUSE
OMG ! 😰
🞜 Cet exemple affiche les véhicules de marque Renault du fichier vehicule.txt avec séparateur "
Si le délimiteur est un guillemet (double quote "), la chaine option ne doit pas être encadrée par des guillemets (doubles quotes).
Enlever les guillemets "double quotes" de la chaine option.
Prefixer par escape (^) tous les signes de ponctuation de la chaine option y compris le égal (=)
Exemple Fichier vehicule.txt :
Marque"Modèle"Prix
Peugeot"308"27500
Renault"Clio"18900
Citroen"Berlingo"26500
Peugeot"2008"25500
Renault"Captur"24500
Citroen"C3"17900
Renault"Megane"27500
Citroen"C4"23900
Peugeot"208"19900
::Affiche les véhicules de marque Renault
FOR /F tokens^=1^,2^,3^ skip^=1^ delims^=^" %%a IN (vehicule.txt) DO (
IF %%a==Renault ECHO %%a %%b %%c
)
PAUSE
🞜 Cet exemple liste tous les sous répertoires de C:\ en analysant le résultat de la commande DIR
SET REP="C:\"
FOR /F %%i IN ('DIR /A:D /B %REP%') DO (
ECHO %%i
)
PAUSE
💡
La boucle FOR n'a pas d'effet sur ERROLEVEL.