| Objet : | Répéter une commande pour plusieurs valeurs d'une variable |
| Format : | Mode fichier et chaîne de caractères |
FOR [range...] [/I"text"] [/A:[[-|+]rhsadecijopt /D /F ["options"] /H /Nj /O:[-]acdeginorstuz /R [path] [/T"delimiters"] /W ] %var IN ([@]set) DO command | (command ... [LEAVEFOR] )
Mode comptage
FOR /L %var IN (start, step, end) DO command | (command ... [LEAVEFOR] )
| options | Options d'analyse pour un "file parsing" FOR. |
| range | Une ou plusieurs spécifications de plage |
| path | Le répertoire de départ pour un FOR "récursif". |
| %var | La variable à utiliser dans la commande ("FOR variable"). |
| set | Un ensemble de valeurs pour la variable. |
| start | La valeur de départ pour un FOR "compté". |
| step | La valeur d'incrémentation pour un FOR "compté". |
| end | La valeur limite d'une FOR "comptée". |
| command | Une commande ou un groupe de commandes à exécuter pour chaque valeur de la variable. |
/N (valeurs par défaut) |
|
|
Sélection de fichiers
Prend en charge les commutateurs d'attributs, les caractères génériques étendus , les plages, les noms de fichiers multiples et les listes d'inclusion.
Les plages doivent apparaître immédiatement après le mot-clé FOR, après les extensions d'alias (le cas échéant), et n'affectent que la sélection des fichiers spécifiés à l'aide de caractères génériques.
Utilisez les caractères génériques avec précaution sur les volumes LFN ; voir Recherches de fichiers LFN pour plus de détails.
Utilisation :
FOR commence par créer un ensemble. Il exécute ensuite une commande pour chaque membre de l'ensemble. La commande peut être une commande interne, un alias, une commande externe ou un fichier batch. Les membres de l'ensemble peuvent être une liste de noms de fichiers, des chaînes de texte, un groupe de valeurs numériques ou du texte lu à partir d'une liste de fichiers.
Lorsque l'ensemble est constitué de texte ou de plusieurs noms de fichiers distincts (pas une liste d'inclusion), les éléments doivent être séparés par des espaces, des tabulations ou des virgules.
FOR comprend un grand nombre d'options, dont certaines reproduisent des fonctions disponibles dans d'autres commandes internes. Ilprend également en charge des conventions supplémentaires que l'on ne trouve pas dans nos autres commandes, et qui sont incluses pour des raisons de compatibilité avec CMD.
Les trois premières sections ci-dessous (Travailler avec des fichiers, Travailler avec du texte et Récupérer du texte dans des fichiers) décrivent la commande FOR et les améliorations qui lui ont été apportées et qui sont incluses dans TCC. Les sections consacrées à l'analyse de texte à partir de fichiers et aux boucles FOR dénombrées décrivent les fonctionnalités ajoutées pour des raisons de compatibilité avec CMD. Les sections Récursion de répertoire et Redirection de sortie mettent en garde contre des considérations particulières. La section intitulée Autres notes contient des informations dont vous pourriez avoir besoin si vous utilisez intensivement un aspect de la commande FOR.
FOR définit deux variables internes :
| %_for_files | Le nombre de fichiers traités |
| %_for_errors | Le nombre d'erreurs. |
Si l' option de configuration Duplicate CMD Bugs est activée , TCC émulera un comportement CMD non documenté lorsque les arguments de FOR set sont répartis sur plusieurs lignes. Par exemple :
for %a in (
one
two
three
) do (
echo %a
)
Normalement, set est une liste de fichiers spécifiée à l'aide de caractères génériques. Par exemple, si vous utilisez cette ligne dans un fichier batch :
for %x in (*.txt) list %x
LIST sera exécuté une fois pour chaque fichier du répertoire actuel portant l'extension .TXT. La variable FOR %x est définie comme étant égale à chacun des noms de fichier, puis la commande LIST est exécutée pour chaque fichier. (Vous pourriez faire la même chose plus facilement avec une simple commandeLIST *.TXT. Nous avons utilisé FOR ici pour que vous puissiez vous faire une idée de son fonctionnement, à l'aide d'un exemple simple. La plupart des exemples de cette section sont construits de la même manière).
Set peut inclure plusieurs fichiers et listes d'inclusion, comme ceci :
for %x in (d:\*.txt;*.doc;*.asc e:\test\*.txt;*.doc) type %x
FOR prend en charge les caractères génériques et les caractères génériquesétendus, ainsi que les noms de répertoires parents étendus, par exemple, ...\*.txt pour traiter tous les fichiers.TXT contenus dans le répertoire situé deux niveaux au-dessus du répertoire actuel.
Par défaut, les membres de set qui incluent des caractères génériques ne correspondent qu'aux fichiers, et non aux répertoires.
Lorsque vous utilisez FOR sur un lecteur LFN, vous devez mettre entre guillemets tous les noms de fichiers de l'ensemble qui contiennent des espaces blancs ou des caractères spéciaux. La même restriction peut s'appliquer aux noms renvoyés dans la variable FOR, si vous les transmettez à des commandes internes ou à d'autres commandes. TCC ou à d'autres commandes nécessitant la mise entre guillemets des noms de fichiers contenant des espaces blancs. FOR ne met pas automatiquement les noms renvoyés entre guillemets, même si vous avez inclus des guillemets dans set.
Si set inclut des noms de fichiers, la liste des fichiers peut être affinée en utilisant des plages dedates, d'heures, de tailles, de descriptions et d'exclusions de fichiers . La ou les plages doivent être placées immédiatement après le mot FOR. Les plages n'affectent que les membres de l'ensemble qui contiennent des caractères génériques. Par exemple, la commande FOR ci-dessous traitera tous les fichiers*.TXT créés ou mis à jour le 4 décembre 2018, ainsi que le fichier ABC.LST, quel que soit son horodatage:
for /[d12-4-2018,+0] %x in (*.txt abc.lst) ...
Si la commande est une commande interne qui prend en charge les plages, une plage indépendante peut également être utilisée dans la commande elle-même.
Vous pouvez également affiner la liste en la limitant à l'aide de l' option /A : pour ne sélectionner que les fichiers ayant des attributs spécifiques.
Lorsque vous utilisez des caractères génériques pour spécifier un ensemble, FOR analyse le répertoire et trouve chaque fichier correspondant au(x) caractère(s) générique(s) spécifié( s). Si, au cours du traitement de la commande FOR, vous créez un nouveau fichier qui pourrait être inclus dans l'ensemble, il peut ou non apparaître dans une itération ultérieure de la même commande FOR. L'apparition ou non du nouveau fichier dépend de son emplacement physique dans la structure du répertoire. Par exemple, si vous utilisez FOR pour exécuter une commande pour tous les fichiers.TXT et que la commande crée également un ou plusieurs nouveaux fichiers .TXT, ces nouveaux fichiers peuvent être traités ou non pendant la commande FOR en cours, en fonction de leur emplacement dans la structure physique du répertoire. Il s'agit d'une contrainte Windows sur laquelle TCC n'a aucun contrôle. Par conséquent, pour obtenir des résultats cohérents, vous devez élaborer des commandes FOR qui ne créent pas de fichiers susceptibles de faire partie de l'ensemble de la commande en cours.
Lesensembles peuvent également être constitués de texte au lieu de noms de fichiers. Par exemple, pour créer trois fichiers nommés file1, file2 et file3, chacun contenant une ligne vide :
for %suffix in (1 2 3) echo. > file%suffix
Vous pouvez également utiliser les noms des variables d'environnement comme texte. Cet exemple affiche le nom et le contenu de plusieurs variables d'environnement (voir la discussion générale sur l'environnement pour plus de détails sur l'utilisation des crochets lors de l'expansion des variables d'environnement):
for %var in (path prompt comspec) echo %var=%[%var]
Récupération de texte dans les fichiers
Si le nom d'un fichier dans l'ensemble est préfixé par @ (signe "at"), il est considéré comme une liste @fichier. FOR extrait chaque ligne du fichier et la place dans la variable FOR.
Attention: si la ligne contient des caractères syntaxiquement significatifs pour TCCpar exemple, un des caractères <"[]|>, cela peut avoir des effets indésirables. Vous pouvez utiliser l'option /X de SETDOS pour les atténuer.
Si vous utilisez @CON comme nom de fichier, FOR lira à partir de l'entrée standard (typiquement un fichier d'entrée redirigé) ou à partir d'un tuyau. Si vous utilisez@CLIP : (ou @CLIP0 : - @CLIP9 :) comme nom de fichier, FOR lira n'importe quel texte disponible dans le presse-papiers de Windows. Voir Redirection et Piping pour plus d'informations sur ces fonctionnalités.
Voir la liste @fichier pour plus de détails.
Analyse de texte à partir de fichiers
Une autre méthode pour travailler avec du texte provenant de fichiers consiste à demander à FOR d'analyser chaque ligne de chaque fichier pour vous. Pour lancer un FOR d'analyse de fichiers, vous devez utiliser l' option /F et inclure un ou plusieurs noms de fichiers dans l'ensemble. Lorsque vous utilisez cette forme de FOR, le nom de la variable doit être composé d'une seule lettre, par exemple,%a.
Cette méthode d'analyse, incluse pour des raisons de compatibilité avec CMD, peut s'avérer lourde et peu flexible. Pour une méthode plus puissante, utilisez FOR avec @filename comme ensemble pour extraire chaque ligne du fichier, comme décrit dans la section précédente, et utilisez des fonctions variables comme @FIELD, @INSTR, @LEFT, @RIGHT et @WORD pour analyser la ligne (voir Fonctions variables pour plus d'informations sur les fonctions variables).
Par défaut, FOR extrait le premier mot ou le premier élément de chaque ligne et le renvoie dans la variable. Par exemple,pour afficher le premier mot de chaque ligne du fichier FLIST.TXT:
for /f %a in (flist.txt) echo %a
Vous pouvez contrôler la manière dont FOR /F analyse chaque ligne en spécifiant une ou plusieurs options d'analyse dans une chaîne de caractères entre guillemets, immédiatement après le /F. Les options disponibles sont les suivantes :
skip=n: FOR /F sautera n lignes au début de chaque fichier avant d'analyser le reste du fichier.
tokens=n, m, ... : Par défaut, FOR /F renvoie uniquement le premier mot ou token de chaque ligne analysée dans la variable que vous avez nommée. Cette option permet de renvoyer plus d'un mot dans la variable, ou de renvoyer des mots dans plusieurs variables.
Cette option est suivie d'une liste de nombres séparés par des virgules. Le premier nombre indique à FOR /F quel élément doit être renvoyé dans la première variable, le deuxième nombre indique quel élément doit être renvoyé dans la deuxième variable, etc. Les variables se suivent dans l'ordre alphabétique, en commençant par la variable que vous nommez sur la ligne de commande FOR. Cet exemple renvoie le premier mot de chaque ligne de TEST.TXT en %d, le deuxième en %e et le troisième en %f:
for /f "tokens=1,2,3" %d in (test.txt) ...
Vous pouvez également indiquer une plage de jetons en séparant les nombres par un trait d'union -.
eol=c: Si FOR /F trouve le caractère c dans la ligne, il considérera que ce caractère et tout texte qui le suit font partie d'un commentaire et ignorera le reste de la ligne.
delims=xxx..: Par défaut, FOR /F considère les espaces, les tabulations et les virgules comme des délimiteurs de mots ou d'éléments. Cette option remplace ces délimiteurs par tous les caractères suivant le signe égal jusqu'à la fin de la chaîne. Cette option doit donc être la dernière utilisée dans la chaîne d'options citée.
usebackq: Duplique la syntaxe maladroite de CMD. Une chaîne entre guillemets arrière est exécutée comme une commande ; une chaîne entre guillemets simples est une chaîne littérale ; et les guillemets doubles citent les noms de fichiers dans le jeu de fichiers. Nous ne recommandons pas l' utilisation deusebackq pour les fichiers batch écrits pour TCCcar TCC a des moyens beaucoup plus élégants de faire les mêmes choses.
Vous pouvez également utiliser FOR /F pour analyser une seule chaîne au lieu de chaque ligne d'un fichier en utilisant la chaîne, entre guillemets, comme ensemble. Par exemple, cette commande affectera la variable A à la chaîne this, B à is, etc., puis affichera ceci:
for /f "tokens=1,2,3,4" %a in ("this is a test") echo %a
La boucle FOR"comptée" est incluse pour des raisons de compatibilité avec CMD. Dans la plupart des cas, vous trouverez la commande DO plus utile pour effectuer des boucles comptées.
Dans une commande FOR comptée, l'ensemble est constitué de valeurs numériques au lieu de textes ou de noms de fichiers. Pour lancer une commande FOR comptée, vous devez utiliser l' option /L et inclure trois valeurs, séparées par des virgules, dans l'ensemble. Il s'agit des valeurs de début, d'étape et de fin. Lors de la première itération de la boucle FOR, la variable est définie comme étant égale à la valeur de départ. Avant chaque itération, la variable est augmentée de la valeur du pas. La boucle se termine lorsque la variable dépasse la valeur defin. Cet exemple imprimera les nombres de 1 à 10 :
for /l %val in (1,1,10) echo %val
Cet exemple imprimera les nombres impairs de 1 à 10 (1, 3, 5, 7 et 9) :
for /l %val in (1,2,10) echo %val
La valeur du pas peut être négative. Si c'est le cas, la boucle se terminera lorsque la variable sera inférieure à la valeurfinale.
Numeric input may be entered in either decimal format (a sequence of 0-9 digits) or in hexadecimal format ("0x" followed by a sequence of 0-F hex digits).
ATTENTION ! Ilne doit pas y avoir d'espace blanc entrestart et la virgule suivante, ni entre step et sa virgule suivante. Les espaces blancs après la virgule sont acceptés.
Par défaut, FOR ne travaille qu'avec les fichiers du répertoire actuel ou d'un répertoire spécifié. Le commutateur d'option /R spécifie que la recherche doit traiter les sous-répertoires de manière récursive. Si vous spécifiez un nom de répertoire immédiatement après /R, FOR commencera dans ce répertoire et cherchera ensuite dans chacun de ses sous-répertoires . Si aucun répertoire n'est spécifié après le /R, la recherche commence dans le répertoire courant par défaut. Si vous spécifiez un répertoire et que son nom contient des caractères spéciaux, il doit être placé entre guillemets . Par exemple, il doit être mis entre guillemets s'il est spécifié à l'aide d'une variable d'environnement, comme%windir\command.
Ilexiste deux différences dans l'invocation de la commande causée par la récursivité des répertoires:
•la variable de contrôle de la boucle contient le nom complet du fichier correspondant
•lacommande est exécutée avec le répertoire par défaut défini sur le répertoire dans lequel le fichier a été trouvé.
Cet exempletraite tous les fichiers.TXT du répertoire actuel et de ses sous-répertoires:
for /r %x in (*.txt) ...
Cet exemple traitetous les fichiers .BAK du lecteur D :
for /r d:\ %x in (*.bak) ...
La redirection de sortie par défaut (c 'est-à-dire pour ... > nom de fichier) crée un nouveau fichier de sortie à chaque itération. Si le nom de fichier ne contient pas de chemin d'accès absolu, le fichier sera créé par rapport au répertoire par défaut actuel. Si vous utilisez la récursivité des répertoires, ce chemin changera pour chaque répertoire traité. La manière la plus simple de forcer un seul fichier cible est de mettre toute la commande entre parenthèses, par exemple, :
(for %x in (set) command) > filename
•Vous pouvez utiliser % ou %% devant le nom de la variable (var) dans la commande. L'une ou l'autre forme fonctionnera, que la commande FOR soit tapée à partir de la ligne de commande ou qu'elle fasse partie d'un alias ou d'un fichier batch.(CMD qui requiert un seul % si FOR est utilisé sur la ligne de commande, mais qui requiert %% si FOR est utilisé dans un fichier batch). Notez qu'au moins un signe% doit être présent.
•Le nom de la variable peut comporter jusqu'à 80 caractères.
•Si la commande FOR est un alias, par exemple, alias for=*for /h, les spécifications de plage seront ignorées.
•Le mot DO n'est pas nécessaire, mais il est accepté. Ne le confondez pas avec la commandeDO, qui n'a rien à voir .
•Si le nom de la variable FOR var est un caractère unique, pour des raisons de compatibilité avec CMD, elle est créée dans l'environnement d'une manière spéciale qui n'écrase pas une variable d'environnement existante portant le même nom. Chaque fois que la commande contient le signe % immédiatement suivi du caractère qui est le nom de la variable FOR, il est remplacé par sa valeur, quels que soient les caractères qui le suivent . Par exemple, la commande suivante tente d'ajouter a : et b : à la fin de PATH, mais ne fonctionne pas comme prévu :
for %p in (a: b:) path %path;%p
path
b:ath;b:
Le %p dans %path a été interprété comme la variable FOR %p suivie du texte ath, ce qui n'est pas le cas. Pour contourner ce problème, utilisez une lettre différente ou un nom plus long pour la variable FOR, ou utilisez des crochets autour du nom de la variable, comme le montrent les exemples ci-dessous, qui permettent tous d'atteindre l'objectif initial :
for %p in (a: b:) path %[path];%p
for %x in (a: b:) path %path;%x
for %px in (a: b:) path %path;%px
•Si le nom de la variable FOR contient plus d'un caractère, elle est créée dans l'environnement et effacée à la fin de FOR, qu'une variable de ce nom ait existé ou non avant FOR. Ellene peut pas être modifiée par les commandes SET, ESET ou UNSET. Si vous aviez déjà une variable portant ce nom, elle ne sera plus accessible. Par exemple, une commande commençant par
pour %chemin dans ...
écrira sur votre paramètre PATH actuel , puis effacera complètement la variable PATH à la fin de la commande FOR.
•Lacommande peut également utiliser la variable FOR avec la syntaxe spéciale de CMD décrite dans Syntaxe spéciale pour la compatibilité CMD.
•L'exemple suivant utilise FOR avec des fonctions variables pour supprimer les fichiers .BAK pour lesquels il existe un fichier.TXT correspondant dans le répertoire actuel (à saisir sur une seule ligne):
for %file in (*.txt) del %@name[%file].bak
Lacommande ci-dessus peut ne pas fonctionner correctement sur un lecteur LFN, car la variable FILErenvoyée peut contenir des espaces blancs. Pour corriger ce problème, vous avez besoin de deux jeux de guillemets, l'un pour DEL et l'autre pour %@NAME:
for %file in (*.txt) del "%@name["%file"].bak"
•Vous pouvez utiliser le regroupement de commandes pour exécuter plusieurs commandes pour chaque élément de l'ensemble. Par exemple, la commande suivante copie chaque fichier .WKQ du répertoire actuel dans le répertoire D:\WKSAVE, puis modifie l'extension de chaque fichier du répertoire actuel en .SAV:
for %file in (*.wkq) (copy %file d:\wksave\ & ren %file *.sav)
ou (dans un fichier batch) :
for %file in (*.wkq) (
copy %file d:\wksave\
ren %file *.sav
)
•Dans un fichier batch, vous pouvez utiliser GOSUB pour exécuter un sous-programme pour chaque élément de l'ensemble. Dans le sous-programme, la variable FOR peut être utilisée comme une variable d'environnement. Il s'agit d'un moyen pratique d'exécuter une séquence complexe de commandes pour chaque élément de l'ensemble sans appeler un autre fichier batch.
•Une utilisation inhabituelle de FOR consiste à exécuter une collection de fichiers batch ou d'autres commandes avec le même paramètre. Par exemple, vous pouvez demander à trois fichiers batch d'opérer sur le même fichier de données. La commande FOR pourrait ressembler à ceci :
for %cmd in (filetest fileform fileprnt) %cmd datafile
Cette ligne se développera en trois commandes distinctes :
filetest datafile
fileform datafile
fileprnt datafile
•Les instructions FOR peuvent être imbriquées.
LEAVEFOR
Le mot-clé spécial LEAVEFOR peut être utilisé à l'intérieur d'un groupe de commandes FOR. LEAVEFOR met fin au traitement FOR en cours et continue à la ligne qui suit la commande FOR, de la même manière que le mot-clé LEAVE dans une commande DO.
for %i in (*) (
...
if "%i" == "xyz.abc" leavefor
...
)
Options :
| /A : | Ne traite que les fichiers ayant les attributs spécifiés. /A : n'est utilisé que lors du traitement des noms de fichiers génériques dans l'ensemble. Il sera ignoré pour les noms de fichiers sans caractères génériques ou pour les autres éléments de l'ensemble. Voir Commutateurs d'attributs pour plus d'informations sur les attributs qui peuvent suivre /A :. |
Par exemple, pour traiter uniquement les fichiers dont l'attribut archive est défini :
for /a:a %f in (*) echo %f needs a backup!
Défaut: /A:-D-H-S, c'est-à-dire n'inclure que les fichiers sans les attributs cachés et système.
Vous pouvez spécifier /A:= pour afficher une boîte de dialogue qui vous aidera à définir des attributs individuels.
| /F | Renvoie un ou plusieurs mots ou éléments de chaque ligne de chaque fichier de l'ensemble. L' option /F peut être suivie d'une ou plusieurs options dans une chaîne de caractères entre guillemets qui contrôlent la manière dont l'analyse est effectuée. Voir Analyse de texte à partir de fichiers. |
| /H | Supprime l'affectation des répertoires "." et "..." à la variable FOR lorsque les répertoires sont explicitement inclus à l'aide de l' option /A :. |
| /I "text" | Sélectionne les noms de fichiers en fonction du texte contenu dans leur description. Voir les plages de description. |
| /L | Interpréter les trois valeurs de l'ensemble comme les valeurs de début, de pas et de fin d'une boucle comptée. Voir Boucles FOR comptées. |
| /Nj | Ne pas rechercher dans les liens symboliques ou les jonctions (voir /R). |
Vous pouvez utiliser n'importe quelle combinaison des options de tri ci-dessous. Si plusieurs options sont utilisées, la liste sera triée avec la première option de tri comme clé primaire, la suivante comme clé secondaire, et ainsi de suite :
| n | Trier par nom de fichier et extension, sauf si e est explicitement inclus. |
| - | Inverse l'ordre de tri pour la clé de tri suivante. |
| a | Trier les noms et les extensions dans l'ordre ASCII standard, plutôt que numériquement lorsque des sous-chaînes numériques sont incluses dans le nom ou l'extension. |
| c | Trier par taux de compression |
| d | Tri par date et heure (la plus ancienne en premier) ; voir aussi /T:acw |
| e | Tri par extension |
| g | Regroupement des sous-répertoires d'abord, puis des fichiers |
| i | Tri par description |
| o | Trier par propriétaire |
| r | Inverser l'ordre de tri pour toutes les options |
| s | Trier par taille |
| t | Identique à d |
| u | Non trié |
| z | Identique à s |
L'option /O :... enregistre tous les noms de fichiers correspondants, puis effectue l'opération demandée. Cela permet d'éviter le problème potentiel de traiter les fichiers plus d'une fois.
| /R [path] | Recherche dans le répertoire actuel et tous ses sous-répertoires les fichiers du jeu. Si le /R est suivi d'un nom de répertoire, il recherche les fichiers dans ce répertoire et tous ses sous-répertoires .Attention : si le nom du répertoire contient des caractères spéciaux, notamment "%" pour indiquer une variable d'environnement, il doit être placé entre guillemets ("). /R prend en charge les noms de dossiers de l'interpréteur de commandes Windows ; voir CDD pour plus de détails. |