🏠 Home
⏎ Back

⏹ 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
En image

🞜 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
En image

🞜 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
En image

🞜 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
En image

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
En image

🞜 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
En image

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
En image

🞜 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
En image

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
En image

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
En image

🞜 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
En image

💡

La boucle FOR n'a pas d'effet sur ERROLEVEL.