DOS/For
Introduction.
Cette commande permet de faire une boucle. Celle-ci peut répéter une liste de valeurs, les lignes d'un ou plusieurs fichiers, ou encore un ensemble de nombres entiers. Le type de boucle est choisi par le commutateur indiqué au FOR (aucun, /D, /R, /L ou /F).
La commande FOR utilise une ou plusieurs variables locales pour effectuer la boucle. Dans le cas d'une commande entrée directement sous DOS, il faut les utiliser avec un simple codice_1, alors que si la commande est utilisée dans un fichier batch .bat, il faudra l'utiliser avec codice_2. Dans la suite, les descriptions d'utilisation utiliseront un simple codice_1, et les exemples, généralement destinés à être intégrés dans un fichier de commandes, auront les variables notées avec codice_2
Boucle sur des fichiers.
Ces boucles s'utilisent pour appliquer une commande à plusieurs fichiers. Au lieu de copier plusieurs fois la même commande pour un fichier, le FOR permet de n'écrire cette commande qu'une seule fois. Ceci est surtout utile si la commande est complexe.
Utilisation.
 FOR %"variable" IN ("ensemble de fichiers") DO "commande"
Pour ce cas, le FOR s'utilise sans commutateur. Il est généralement utilisé pour boucler sur un ensemble de noms de fichier, d'autant qu'il est utilisé avec les expressions du type *."extension" ou utilisant les caractères génériques '*' et '?' autrement. Il peut être utilisé avec de simples chaînes de caractères, mais ceci est déconseillé à cause de l'interprétation de certains caractères.
Exemples.
Exemple sur de simples chaînes.
 FOR %%i IN (chaine1 chaine2) do @ECHO %%i
Cet exemple est équivalent à l’exécution des commandes suivantes :
 @ECHO chaine1
 @ECHO chaine2
Exemple sur un ensemble de fichiers sans caractère générique.
 FOR %%i IN (fichier1.txt fichier2.txt) do @TYPE %%i
Cet exemple est équivalent à l’exécution des commandes suivantes :
 @TYPE fichier1.txt
 @TYPE fichier2.txt
Exemple sur un ensemble de fichiers utilisant les caractères génériques.
 FOR %%i IN (*.txt) do @TYPE "%%i"
En supposant que le répertoire courant contienne les fichiers fich1.txt, fich2.txt et fich3.txt, cet exemple est équivalent à l’exécution des commandes suivantes :
 @TYPE "fich1.txt"
 @TYPE "fich2.txt"
 @TYPE "fich3.txt"
Variante :
 FOR %%i IN (*.txt *.doc install.log) do @TYPE "%%i"
En supposant que le répertoire courant contienne les fichiers fich1.txt, fich2.txt, fich3.txt, readme.doc, lisezmoi.doc, cet exemple est équivalent à l’exécution des commandes suivantes :
 @TYPE "fich1.txt"
 @TYPE "fich2.txt"
 @TYPE "fich3.txt"
 @TYPE "readme.doc"
 @TYPE "lisezmoi.doc"
 @TYPE "install.log"
Boucle de répétition de commandes.
Ces boucles s'utilisent pour exécuter une commande plusieurs fois, au lieu de faire beaucoup de copies de la commande, la boucle FOR permet de n'écrire cette commande qu'une fois. ceci est surtout utile si le nombre de répétition est grand.
Utilisation.
Le commutateur /L permet de faire une boucle FOR classique, c'est-à-dire qu'elle permet de boucler sur des commandes un certain nombre de fois.
 FOR /L %"variable" IN ("index de début", "pas", "index de fin") DO "commande"
La première boucle mettra dans "variable" la valeur "index de début", puis, à chaque boucle, la valeur affectée à "variable" sera incrémentée de la valeur "pas". Enfin, lorsque la valeur affectée à "variable" dépasse la valeur "index de fin", la boucle s'arrête.
Exemple.
 FOR /L %i IN (1,2,10) DO @ECHO Message %i
Ici, la variable %i commence à 1, augmentera de 2 à chaque boucle. La boucle se terminera lorsque %i vaudra plus de 10 (c'est-à-dire que %i = 9 sera la dernière boucle). Cet exemple est donc équivalent à l’exécution des commandes suivantes :
 Message 1
 Message 3
 Message 5
 Message 7
 Message 9
Boucle sur des répertoires.
Le principe est le même que pour les boucles sur des fichiers, mais s'applique sur les répertoires lorsque l'ensemble est une chaine contenant des caractères génériques.
Utilisation.
Le commutateur /D permet de rechercher des répertoires au lieu de fichiers.
 FOR /D %"variable" IN ("ensemble de répertoires") DO "commande"
Exemples.
Exemple sur un ensemble de répertoires sans interprétation.
 FOR /D %i IN (repertoire1 repertoire2) do ECHO %%i
Cet exemple est équivalent à l'exécution des commandes suivantes :
 ECHO repertoire1
 ECHO repertoire2
Cet exemple est aussi équivalent à l'exécution des commandes suivantes :
 FOR %i IN (repertoire1 repertoire2) do ECHO %i
En effet, ici, aucune interprétation d'expression n'est effectuée, c'est comme si la boucle s'effectuait sur des fichiers ou des chaînes de caractères.
Exemple sur un ensemble de répertoires utilisant des caractères génériques.
 FOR /D %i IN (Doc*) do DIR "%i"
Si le répertoire courant contient les répertoires "Documents and Settings" et "Docs", cet exemple est équivalent à l'exécution des commandes suivantes :
 DIR "Documents and Settings"
 DIR "Docs"
Boucle récursive sur des fichiers ou des répertoires.
Le principe est le même que les boucles sur des répertoires ou fichiers, mais les recherches se poursuivent dans les sous-répertoires lorsque l'ensemble contient des caractères génériques.
Utilisation.
L'ajout du commutateur /R permet de faire cette boucle récursive sur les sous-répertoires.
 FOR /R "["/D"]" %"variable" IN ("ensemble de répertoires") DO "commande"
Si le commutateur /R est le seul présent, la recherche récursive s'effectuera sur des noms de fichiers.
Si les commutateur /R et /D sont présents, la recherche récursive s'effectuera sur des noms de répertoires.
Exemples.
Exemple sur un ensemble de répertoires sans caractère générique.
Comme dans le paragraphe précédent, sans caractère générique le commutateur /R est inutile.
Exemple sur un ensemble de répertoires utilisant des caractères génériques.
 FOR /D /R %%i IN (Doc*) do DIR "%%i"
Si le répertoire courant contient les répertoires "Documents and Settings" et "Docs", ainsi que "temp" contenant le sous-répertoire "Documentation", alors cet exemple est équivalent à l'exécution des commandes suivantes :
 DIR "C:\Documents and Settings"
 DIR "C:\Docs"
 DIR "C:\temp\Documentation"
Exemple sur un ensemble de fichiers utilisant des caractères génériques.
 FOR /R %%i IN (Doc*) do ECHO "%%i"
équivalent possible à l'exécution des commandes suivantes :
 ECHO "C:\document.txt"
 ECHO "C:\doc.odf"
Boucle sur le contenu d'un fichier.
Ces boucles s'utilisent pour appliquer une commande à plusieurs lignes d'un fichier. Contrairement aux autres boucles FOR qui se contentent de noms de fichiers, ces boucles ouvrent tous les fichiers indiqués, et les lisent ligne par ligne. À chaque itération de boucle correspond une ligne d'un fichier.
Utilisation.
Le commutateur /F permet d'effectuer une boucle sur le contenu de fichiers.
 FOR /F "["options"]" %"variable" IN ("ensemble de fichiers") DO "commande"
Avec ce commutateur on peut mettre des options qui vont indiquer comment découper le ou les fichiers, pour savoir quelles parties seront retenues pour l'exécution de la commande. Cela permet, par exemple, le découpage mot par mot.
Il faut bien garder à l'esprit que toutes les options définies ci-après se feront sur une ligne donnée d'un fichier, et sont cumulatives.
Découpage de mots ou blocs.
Pour un découpage poussé, il faut indiquer le ou les caractères qui délimitent les zones. Par exemple, pour les mots, ce seront les caractères espace, mais on peut également découper selon plusieurs caractères différents.
 "delims="ensemble de caractères""
Pour les mots séparés par des espaces, il suffira d'ajouter l'option :
 "delims= "
Par défaut, les caractères espace et tabulation servent de séparateur.
Exclusion de fin de ligne.
Pour découper et ne pas prendre en compte tout ce qui se situe à droite d'un caractère, il existe l'option suivante ("end of line") :
 "eol="caractère""
Par exemple, si le caractère codice_5 est un caractère de début de commentaire, et si l'on ne veut pas lire les commentaires, il suffit d'ajouter l'option :
 "eol=#"
Exclusion des premières lignes.
Certains fichiers peuvent contenir des entêtes inexploitables. Il est possible de les supprimer en indiquant le nombre de lignes à exclure lors de la lecture ligne par ligne du fichier. Cette option est globale au fichier, ce n'est pas un traitement de ligne.
 "skip="nombre de lignes""
Par exemple, pour exclure systématiquement les quatre premières lignes des fichiers, il suffit d'ajouter :
 "skip=4"
Découpe dans les variables.
La commande FOR ne prend qu'un seul nom de variable. Or, pour chaque ligne, il est possible de faire un découpage, mais un système est mis en place pour permettre de remplir plusieurs variables. Pour l'utiliser, il faut remplir l'option suivante :
 "tokens="chiffres séparés par virgules""["*"]""
Par exemple, pour un découpage par mots, pour traiter, le premier et le deuxième mots, il faudra utiliser l'option :
 "tokens=1,2"
Pour récupérer le reste de la ligne (sans séparer les mots), il suffit d'ajouter le caractère codice_6 :
 "tokens=1,2*"
Dans la commande, pour utiliser ces différentes zones, il faut utiliser le nom de la variable avec un seul caractère, et de nouvelles variables seront automatiquement créées avec les zones suivantes en incrémentant alphabétiquement le nom de la précédente. Par exemple, si la commande FOR est déclarée avec la variable %%i, la première zone sera mémorisée dans %%i, la deuxième dans %%j, la troisième dans %%k (et ainsi de suite si d'autres zones sont définies). Utiliser la commande FOR en passant le nom de variable %%a permet d'avoir une marge généralement suffisante (26 caractères).
Exemple 1.
Soit un fichier "monFich.txt" contient les deux lignes suivantes :
 sfqsdf1, zarzera2, xvwcvw3, vcnvbn4, rtyutr5, fdgh6
 ssfgqsfdf1, zaerera2, zrezw3, veeenvbn4 ; ppppppp
Un commande FOR lisant ce fichier pourrait être :
 FOR /F "eol=; tokens=2,3* delims=, " %%a IN (monfich.txt) DO @ECHO %%a %%b %%c
Dans cet exemple, le fichier "monFich.txt" va être lu ligne par ligne, aucune ligne de début n'est exclue. Les lignes contenant un caractère codice_7 ne seront lues que partiellement : du début jusqu'à ce caractère exclu. Chaque ligne sera découpée en zones selon les caractères virgule (codice_8) et espace. La zone 2 sera mémorisée dans %%a, la zone 3 dans %%b, et toutes les zones suivantes dans %%c
L'exécution de cette commande est donc équivalente à :
 @ECHO zarzera2 xvwcvw3 vcnvbn4, rtyutr5, fdgh6
 @ECHO zaerera2 zrezw3 veeenvbn4
Exemple 2.
 FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
Cet exemple énumère les noms de variables d'environnement de l'environnement en cours.
Boucle sur le retour d'une commande.
On pourrait lire de la même façon les lignes de retour d'une commande en redirigeant la sortie d'affichage sur un fichier via l'opérateur codice_9, mais la commande FOR permet de lire directement le retour d'une commande sans passer par un fichier.
Le principe est le même que les boucles sur les contenus de fichiers, y compris pour les options, seul l'ensemble donné change.
Utilisation.
 FOR /F %%i IN (` "commande" `) do "commande"
À la place de l'ensemble de fichiers, il suffit de mettre une commande entre quotes inversées. Les opérations s'effectueront alors sur les lignes du retour d'affichage (qui n'est donc plus affiché).
Exemple.
L'exemple suivant permet de rechercher tous les fichiers .txt et compte le nombre de fichiers trouvés. Pour cela, la commande codice_10 liste tous les fichiers .txt sans information supplémentaire. Ainsi, il suffit de compter le nombre de lignes normalement affichées en utilisant un simple compteur.
 @ECHO off
 SET /A count=0
 FOR /F %%A IN ('DIR /B *.txt 2^>NUL') DO SET /A count+=1
 IF %count% GTR 1 (
 ECHO Trouvé %count% fois !
 ) ELSE (
 ECHO Aucun fichier trouvé
Boucle avec plusieurs commandes.
Dans tous les exemples précédents, une seule commande était exécutée, mais la commande FOR offre la possibilité d'exécuter, pour chaque itération, une succession d'instructions écrite sur plusieurs lignes via des parenthèses.
Ceci fonctionne pour tous les cas précédemment définis.
Utilisation.
 FOR "commutateurs, options et variable" IN ("ensemble") DO (
 "Commande"
 "Commande"
La parenthèse ouvrante doit se situer sur la même ligne que le FOR pour être valide.
Exemple.
L'exemple suivant permet de rechercher tous les fichiers .txt contenant la chaîne de caractères codice_11. La commande codice_12 est utilisée pour faire la recherche. Cette commande retourne :
 --------- "nom du fichier lu": "nombre d’occurrences trouvées"
Même si la chaîne de caractères n'est pas trouvée, FIND retourne une ligne avec 0 pour le nombre d’occurrences (voir DOS/Find). L'exemple suivant traite donc, chaque ligne retournée par le FIND afin de récupérer le nom des fichiers trouvés.
 @ECHO OFF
 FOR /F "tokens=1,2* delims=: " %%A IN ('FIND /C "VAR" *.txt') DO (
 IF %%C GTR 0 (
 ECHO Fichier: %%B
 ECHO Nombre d’occurrences : %%C
 )
Le nombre d’occurrences est mis dans %%C, c'est pourquoi cet exemple teste si %%C est strictement supérieur à 0 (pour n'afficher que les fichiers trouvés).
Noter que la casse est importante dans les boucles DOS FOR. En effet, %%C est différent de %%c. Ce qui surprend contrairement à shell bash par exemple où l'on l'habitude de ce comportement. Il y a donc 52 variables globales disponibles.