Serge Nazarian a ᅵcrit le 04/05/2013 :
Je me rᅵponds ᅵ moi-mᅵme, pour avoir une rᅵfᅵrence dans mes archives et
aussi parce que cela peut en intᅵresser d'autres.
Origine : help FOR
******************
La commande FOR exᅵcute une commande donnᅵe pour chaque fichier d'un
ensemble de fichiers.
FOR %variable IN (ensemble) DO commande [paramᅵtres]
%variable Spᅵcifie un paramᅵtre remplaᅵable par une seule lettre.
(ensemble) Ensemble de fichiers. Caractᅵres gᅵnᅵriques autorisᅵs.
commande Commande ᅵ exᅵcuter pour chaque fichier.
paramᅵtres Liste des paramᅵtres ou des options pour la commande
spᅵcifiᅵe.
Pour utiliser la commande FOR dans un programme de commandes, spᅵcifiez
%%variable au lieu de %variable. Les noms de variables respectent la
casse, donc %i est diffᅵrent de %I.
Si les extensions de commandes sont activᅵes, les formes
supplᅵmentaires suivantes sont prises en charge pour la commande FOR :
FOR /D %variable IN (ensemble) DO commande [paramᅵtres]
Si ensemble contient des caractᅵres gᅵnᅵriques, alors la
correspondance se fait sur les noms de rᅵpertoires au lieu des noms de
fichiers.
FOR /R [[lecteur:]chemin] %variable IN (ensemble) DO commande
[paramᅵtres]
Parcourt l'arborescence de rᅵpertoires depuis la racine
[lecteur:]chemin, en exᅵcutant FOR dans chaque rᅵpertoire de
l'arborescence. Si aucun rᅵpertoire n'est spᅵcifiᅵ aprᅵs /R alors le
rᅵpertoire en cours est utilisᅵ. Si ensemble est seulement un point (.)
alors seule l'arborescence de rᅵpertoires sera ᅵnumᅵrᅵe.
FOR /L %variable IN (dᅵbut,pas,fin) DO commande [paramᅵtres]
L'ensemble est une sᅵquence de chiffres allant de dᅵbut ᅵ fin,
incrᅵmentᅵ de pas. Ainsi (1,1,5) gᅵnᅵre la sᅵquence 1 2 3 4 5 et
(5,-1,1) gᅵnᅵre la sᅵquence (5 4 3 2 1)
FOR /F ["options"] %variable IN (ensemble-fichiers) DO commande
[paramᅵtres]
FOR /F ["options"] %variable IN ("chaᅵne") DO commande [paramᅵtres]
FOR /F ["options"] %variable IN ('commande') DO commande [paramᅵtres]
ou, si l'option usebackq est utilisᅵe :
FOR /F ["options"] %variable IN (ensemble-fichiers) DO commande
[paramᅵtres]
FOR /F ["options"] %variable IN ('chaᅵne') DO commande [paramᅵtres]
FOR /F ["options"] %variable IN ((`commande`) DO commande [paramᅵtres]
ensemble-fichiers est un ou plusieurs noms de fichiers. Chaque
fichier est ouvert, lu et traitᅵ avant de passer au fichier suivant de
ensemble-fichiers. Le traitement consiste ᅵ lire dans le fichier, le
dᅵcouper en lignes individuelles de texte puis analyser chaque ligne en
zᅵro ou plusieurs jetons. Le corps de la boucle FOR est ensuite appelᅵ
avec la ou les valeurs de variables prenant la valeur de la ou des
chaᅵnes de jeton trouvᅵes. Par dᅵfaut, /F transmet le premier jeton
sᅵparᅵ par un blanc dans chaque ligne de chaque fichier. Les lignes
vides sont ignorᅵes.
Vous pouvez outrepasser le comportement d'analyse par dᅵfaut en
spᅵcifiant le paramᅵtre optionnel "options". Ceci est une chaᅵne entre
guillemets contenant un ou plusieurs mots-clᅵs spᅵcifiant diverses
options d'analyse.
Les mots-clᅵs sont :
eol=c - spᅵcifie un caractᅵre de commentaire de fin
de ligne
(un seul)
skip=n - spᅵcifie le nombre de lignes ᅵ ignorer en
dᅵbut
de fichier.
delims=xxx - spᅵcifie un ensemble de dᅵlimiteurs. Ceci
remplace
l'ensemble de dᅵlimiteurs par dᅵfaut qui sont
l'espace et la tabulation.
tokens=x,y,m-n - spᅵcifie les jetons de chaque ligne devant
ᅵtre
transmis au corps de FOR ᅵ chaque itᅵration.
Ceci provoquera l'allocation de noms de
variables
supplᅵmentaires. La forme m-n est une
ᅵtendue
spᅵcifiant les jetons allant de m ᅵ n. Si le
dernier caractᅵre de la chaᅵne tokens= est
une
astᅵrisque, alors une variable supplᅵmentaire
est
allouᅵe et reᅵoit le texte restant dans la
ligne
suivant le dernier jeton analysᅵ.
usebackq - spᅵcifie que la nouvelle sᅵmantique est en
place,
lorsqu'une chaᅵne entre guillemets inversᅵs
est
exᅵcutᅵe en tant que commande et une chaᅵne
entre
guillemets simples est une chaᅵne de commande
littᅵrale et permet l'utilisation de
guillemets
doubles pour citer des noms de fichiers.
Quelques exemples explicatifs :
FOR /F "eol=; tokens=2,3* delims=, " %i in (fichier.txt) do @echo %i %j
%k
analyse chaque ligne de monfichier.txt, en ignorant les lignes
commenᅵant par un point-virgule, en transmettant les deuxiᅵme et
troisiᅵme jetons de chaque ligne au corps de FOR, les jetons ᅵtant
dᅵlimitᅵs par des virgules et/ou espaces. Notez que le corps de FOR
rᅵfᅵrence %i pour l'obtention du deuxiᅵme jeton, %j pour l'obtention du
troisiᅵme jeton et %k pour l'obtention des jetons restants aprᅵs le
troisiᅵme. Pour les noms de fichiers contenant des espaces, placez les
noms de fichiers
entre guillemets doubles. Afin d'utiliser ainsi les guillemets
doubles, vous devez ᅵgalement utiliser l'option usebackq, faute de quoi
les guillemets doubles seraient interprᅵtᅵs comme dᅵfinissant une
chaᅵne littᅵrale ᅵ analyser.
%i est dᅵclarᅵe explicitement dans la dᅵclaration FOR et %j et %k
sont dᅵclarᅵes implicitement via l'option tokens=. Vous pouvez
spᅵcifier jusqu'ᅵ 26 jetons via la ligne tokens=, tant que cela ne
provoque pas de tentative de dᅵclaration de variable plus ᅵlevᅵe que la
lettre 'z' ou 'Z'. Souvenez-vous que les variables de FOR se composent
de lettres, tiennent compte de la casse, sont globales et que plus de
52 ne peuvent pas ᅵtre actives ᅵ la fois.
Vous pouvez aussi utiliser la logique d'analyse FOR /F sur une
chaᅵne en plaᅵant ensemble-fichiers entre guillemets entre les
parenthᅵses, en utilisant des guillemets simples. Elle sera traitᅵe
comme une ligne d'entrᅵe simple provenant d'un fichier puis analysᅵe.
Enfin, vous pouvez utiliser la commande FOR /F pour analyser la
sortie d'une commande. Faites ceci en plaᅵant des guillemets inversᅵs
autour de ensemble-fichiers entre les parenthᅵses. Elle sera traitᅵe
comme une ligne de commande transmise ᅵ un CMD.EXE enfant et la sortie
est gardᅵe en mᅵmoire et analysᅵe comme s'il s'agissait d'un fichier.
Ainsi l'exemple suivant :
FOR /F "usebackq delims==" %i IN (`ensemble`) DO @echo %i
ᅵnumᅵrerait les noms de variables d'environnement de
l'environnement en cours.
De plus, la substitution de rᅵfᅵrences de variables FOR a ᅵtᅵ
amᅵliorᅵe.
Vous pouvez maintenant utiliser la syntaxe optionnelle suivante :
%~I - ᅵtend %I en supprimant les guillemets (")
%~fI - ᅵtend %I en nom de chemin d'accᅵs reconnu
%~dI - ᅵtend %I en lettre de lecteur uniquement
%~pI - ᅵtend %I en chemin d'accᅵs uniquement
%~nI - ᅵtend %I en nom de fichier uniquement
%~xI - ᅵtend %I en extension de fichier uniquement
%~sI - chemin ᅵtendu contenant uniquement des noms courts
%~aI - ᅵtend %I en attributs du fichier
%~tI - ᅵtend %I en date/heure du fichier
%~zI - ᅵtend %I en taille du fichier
%~$PATH:I - parcourt les rᅵpertoires de la variable
d'environnement PATH et ᅵtend %I en nom du premier fichier reconnu
trouvᅵ. Si le nom de la variable d'environnement n'est pas dᅵfini ou
que le fichier n'est pas trouvᅵ par la recherche, alors ce modificateur
ᅵtend en chaᅵne vide
Vous pouvez combiner les modificateurs pour obtenir des rᅵsultats
composᅵs :
%~dpI - ᅵtend %I en lettre de lecteur et chemin d'accᅵs
uniquement
%~nxI - ᅵtend %I en nom de fichier et extension uniquement
%~fsI - ᅵtend %I en nom de chemin complet avec noms courts
uniquement
%~dp$PATH:i - parcourt les rᅵpertoires listᅵs dans la variable
d'environnement PATH ᅵ la recherche de %I et ᅵtend en lettre de lecteur
du premier trouvᅵ.
%~ftzaI - ᅵtend %I en DIR comme ligne en sortie
Dans les exemples ci-dessus %I et PATH peuvent ᅵtre remplacᅵs par
d'autres valeurs valides. La syntaxe %~ se termine par un nom de
variable FOR valide.
Le choix de noms de variables en majuscules comme %I facilite la
lecture et empᅵche toute confusion avec les modificateurs qui ne
tiennent pas compte de la casse.