Objectif :Répéter une commande pour plusieurs valeurs d'une variable

 

Format:Mode fichier et chaîne

POUR [gamme...] [/I"texte"] [/A:[[-|+]rhsadecijopt /D /F ["Options"] /H /Nj /O:[-]acdeginorstuz /R [chemin] [/T"délimiteurs"] /W ] %var IN (@[@]set) FAIRE commander | (commander ... [PARTIR POUR] )

 

Mode compté

FOR /L %var IN (début, étape, fin) Commande DO | (commande ... [QUITTER] )

 

OptionsOptions d'analyse pour une "analyse de fichier" POUR.
gammeUn ou plus gamme caractéristiques
chemin Le répertoire de départ d'un FOR "récursif".
%var La variable à utiliser dans la commande ("Variable FOR").
set Un ensemble de valeurs pour la variable.
Commencer La valeur de départ pour un FOR « compté ».
étape La valeur d'incrément pour un FOR "compté".
fin La valeur limite pour un FOR "compté".
commanderUne commande ou un groupe de commandes à exécuter pour chaque valeur de la variable.

 

/A : (Sélection d'attribut)

/N (par défaut)

/D(répertoires uniquement)

/O :... (Ordre)

/F(analyse de fichier)

/R(écursif)

/H(points ide)

/T (liste de délimiteurs)

/I plage de description

/W(cartes vides)

/L (boucle comptée)

 

 

Sélection de fichier

 

Les soutiens commutateurs d'attribut, élargi caractères génériques, gammes, plusieurs noms de fichierset inclure des listes.

 

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 de fichiers spécifiés à l'aide de caractères génériques.

 

Utilisez les caractères génériques avec prudence sur les volumes LFN ; voir Recherches de fichiers LFN pour en savoir plus.

 

Usage:

 

FOR commence par créer un set. Il exécute ensuite une commande pour chaque membre de set. La commande peut être une commande interne, un alias, une commande externe ou un fichier batch. Les membres de set peut ê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.

 

Quand set est composé de texte ou de plusieurs noms de fichiers distincts (pas d'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 dupliquent des fonctions disponibles dans d'autres commandes internes. Il prend également en charge des conventions supplémentaires introuvables dans nos autres commandes, incluses pour la compatibilité avec CMD.

 

Les trois premières sections ci-dessous (Travailler avec des fichiers, Travailler avec du texteet Récupérer du texte à partir de fichiers) décrivent la commande FOR et les améliorations apportées à celle-ci qui sont incluses dans TCC. Les rubriques sur Analyser le texte des fichiers et Boucles FOR comptées décrire les fonctionnalités ajoutées pour la compatibilité avec CMD. Les rubriques Récursion de répertoire et Redirection de sortie avertir de 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 :

 

%_pour_fichiersLe nombre de dossiers traités
%_pour_erreursLe nombre d'erreurs

 

Si la Bogues CMD en double l'option de configuration est définie, TCC émulera le comportement CMD non documenté lorsque POUR set les arguments sont répartis sur plusieurs lignes. Par exemple:

 

pour %a dans (

UN

deux

trois

) faire (

écho %a

)

 

Travailler avec des fichiers

 

Normalement, set est une liste de fichiers spécifiés avec des caractères génériques. Par exemple, si vous utilisez cette ligne dans un fichier batch :

 

pour %x dans la liste (*.txt) %x

 

Ensuite LISTE sera exécuté une fois pour chaque fichier du répertoire courant avec l'extension .TXT. La variable FOR %x est définie à tour de rôle comme étant égale à chacun des noms de fichiers, puis la commande LIST est exécutée pour chaque fichier. (Vous pourriez faire la même chose plus facilement avec un simple LISTE *.TXT. Nous avons utilisé FOR ici pour que vous puissiez avoir une idée de son fonctionnement, à l'aide d'un exemple simple. De nombreux exemples de cette section sont construits de la même manière.)

 

Ensemble peut inclure plusieurs fichiers et inclure des listes, comme ceci :

 

pour %x dans (d:\*.txt;*.doc;*.asc e:\test\*.txt;*.doc) tapez %x

 

POUR les supports caractères génériques et caractères génériques étendus, aussi bien que répertoire parent étendu noms, par exemple, ...\*.SMS pour traiter tous les .TXT fichiers contenus dans le répertoire 2 niveaux au-dessus du répertoire actuel.

 

Par défaut, les membres de set qui incluent des caractères génériques correspondent uniquement aux fichiers, pas aux répertoires.

 

Lorsque vous utilisez FOR sur un lecteur LFN, vous devez citer tous les noms de fichiers de l'ensemble contenant 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 à TCC commandes internes ou autres commandes qui nécessitent de citer les noms de fichiers avec des espaces. FOR ne cite pas automatiquement les noms renvoyés, même si vous avez inclus des guillemets dans l'ensemble.

 

Si l'ensemble inclut des noms de fichiers, la liste des fichiers peut être affinée davantage en utilisant la date, l'heure, la taille, la description et l'exclusion de fichiers. gammes. La ou les plages doivent être placées immédiatement après le mot POUR. Les plages affectent uniquement les membres de l'ensemble qui contiennent des caractères génériques. Par exemple, le FOR ci-dessous traitera tous les *.SMS fichiers créés ou mis à jour le 4 décembre 2018 et du fichier ABC.LST quel que soit son horodatage :

 

pour /[d12-4-2018,+0] %x dans (*.txt abc.lst) ...

 

If commander est une commande interne qui prend en charge les plages, une plage indépendante peut également être utilisée dans commander elle-même.

 

Vous pouvez également affiner la liste en la limitant avec le /UN: option pour sélectionner uniquement les fichiers qui ont des attributs spécifiques.

 

Lorsque vous utilisez des caractères génériques pour spécifier set, FOR analyse le répertoire et trouve chaque fichier qui correspond au(x) nom(s) générique(s) que vous avez spécifié. Si, lors du traitement de la commande FOR, vous créez un nouveau fichier qui pourra être inclus dans set, il peut apparaître ou non 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 des répertoires. Par exemple, si vous utilisez FOR pour exécuter une commande pour all .TXT fichiers, et la commande crée également un ou plusieurs nouveaux fichiers .TXT fichiers, ces nouveaux fichiers peuvent ou non être traités pendant la commande FOR en cours, selon l'endroit où ils sont placés 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, afin d'obtenir des résultats cohérents, vous devez construire des commandes FOR qui ne créent pas de fichiers susceptibles de faire partie de l'ensemble de la commande actuelle.

 

Travailler avec du texte

 

Ensemble peut également être constitué de texte au lieu de noms de fichiers. Par exemple, pour créer trois fichiers nommés file1, file2et file3, chacun contenant une ligne vide :

 

pour %suffixe dans (1 2 3) echo. > fichier%suffixe

 

Vous pouvez également utiliser les noms des variables d'environnement comme texte. Cet exemple affiche le nom et le contenu de plusieurs variables de l'environnement (voir la discussion générale du Environment pour plus de détails sur l'utilisation des crochets lors du développement des variables d'environnement) :

 

pour %var dans (invite de chemin comspec) echo %var=%[%var]

 

Récupérer du texte à partir de fichiers

 

Si le nom d'un fichier dans set est préfixé par @ (signe "arobase"), il est considéré comme un @liste de fichiers. FOR extrait chaque ligne du fichier et la place dans la variable FOR.

 

: si la ligne contient des caractères syntaxiquement significatifs pour TCC, par exemple, l'un des caractères , cela peut avoir des effets indésirables. Vous pouvez utiliser l'option /X de RÉGLAGES pour les atténuer.

 

Si vous utilisez @ESCROQUER comme nom de fichier, FOR lira à partir d'une entrée standard (généralement un fichier d'entrée redirigé) ou à partir d'un tube. Si tu utilises @AGRAFE: (ou @CLIP0 : - @CLIP9 :) comme nom de fichier, FOR lira tout texte disponible dans le presse-papiers de Windows. Voir Redirection et tuyauterie pour plus d’informations sur ces fonctionnalités.

 

See @liste de fichiers pour plus de détails.

 

Analyser le texte des fichiers

 

Une autre méthode pour travailler avec du texte à partir de fichiers consiste à demander à FOR d'analyser chaque ligne de chaque fichier pour vous. Pour commencer une analyse de fichier FOR, vous devez utiliser le /F option et incluez un ou plusieurs noms de fichiers dans l’ensemble. Lorsque vous utilisez cette forme de FOR, le nom de la variable doit être une seule lettre, par exemple : %a.

 

Cette méthode d'analyse, incluse pour des raisons de compatibilité avec CMD, peut être lourd et peu flexible. Pour une méthode plus puissante, utilisez FOR avec @nom de fichier car set pour récupérer chaque ligne du fichier, comme décrit dans la section précédente, et utiliser des fonctions variables comme @CHAMP, @INSTR, @GAUCHE, @DROITEet @MOT pour analyser la ligne (voir Fonctions variables pour plus d'informations sur les fonctions variables).

 

Par défaut, FOR extraira le premier mot ou jeton de chaque ligne et le renverra dans la variable. Par exemple, pour afficher le premier mot sur chaque ligne du fichier FLISTE.TXT:

 

pour /f %a dans (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 entre guillemets immédiatement après le /F. Les options disponibles sont :

 

sauter=n :  FOR /F sera ignoré n lignes au début de chaque fichier avant d’analyser le reste du fichier.

 

jetons =n, m, ... : Par défaut, FOR /F renvoie uniquement le premier mot ou jeton à partir de chaque ligne analysée dans la variable que vous avez nommée. Vous pouvez lui faire renvoyer plus d'un jeton dans la variable, ou renvoyer des jetons dans plusieurs variables, avec cette option.

 

Cette option est suivie d'une liste de nombres séparés par des virgules. Le premier nombre indique FOR /F quel jeton renvoyer dans la première variable, le deuxième nombre lui indique lequel renvoyer dans la deuxième variable, etc. Les variables se suivent par 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 dans %d, le deuxième dans %e, et le troisième dans %f:

 

pour /f "tokens=1,2,3" %d dans (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 supposera que le caractère et tout texte qui le suit font partie d'un commentaire et ignorera le reste de la ligne.

 

délimitations =xxx..: Par défaut, FOR /F considère les espaces, les tabulations et les virgules comme délimiteurs de mots ou de jetons. 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.

 

utiliserbackq  : Duplique ce qui est gênant CMD syntaxe. Une chaîne entre guillemets est exécutée en tant que commande ; une chaîne entre guillemets simples est une chaîne littérale ; et les guillemets doubles citent les noms de fichiers dans l'ensemble de fichiers. Nous ne recommandons pas utiliserbackq pour les fichiers batch écrits pour TCC, comme TCC a des manières beaucoup plus élégantes 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 défini. Par exemple, cette commande attribuera une variable A à la chaîne this, B à is, etc., puis affichez this:

 

pour /f "jetons=1,2,3,4" %a dans ("ceci est un test") echo %a

 

Boucle FOR "comptée"

 

Le "compté POUR" La boucle est incluse pour des raisons de compatibilité avec CMD. Dans la plupart des cas, vous trouverez le DO commande plus utile pour effectuer des boucles comptées.

 

Dans une commande FOR comptée, le set est composé de valeurs numériques au lieu de texte ou de noms de fichiers. Pour commencer une commande FOR comptée, vous devez utiliser le /L option, puis incluez trois valeurs, séparées par des virgules, dans set. Voici les Commencer, étapeet fin valeurs. Lors de la première itération de la boucle FOR, la variable est définie égale à la Commencer valeur. Avant chaque itération, la variable est augmentée du étape valeur. La boucle se termine lorsque la variable dépasse le fin valeur. Cet exemple imprimera les nombres de 1 à 10 :

 

pour /l %val dans (1,1,10) echo %val

 

Cet exemple imprimera les nombres impairs de 1 à 10 (1, 3, 5, 7et 9):

 

pour /l %val dans (1,2,10) echo %val

 

Le étape la valeur peut être négative. Si c'est le cas, la boucle se terminera lorsque la variable sera inférieure à la fin valeur.

 

La saisie numérique peut être saisie au format décimal (une séquence de 0 à 9 chiffres) ou au format hexadécimal ("0x" suivi d'une séquence de chiffres hexadécimaux de 0 à F).

 

AVERTISSEMENT! Vous ne devez pas avoir d'espace blanc entre Commencer et la virgule suivante, ni entre étape et sa virgule suivante. L'espace blanc après la virgule est accepté.

 

Récursion de répertoire

 

Par défaut, FOR fonctionne uniquement avec les fichiers du répertoire actuel ou d'un répertoire spécifié. Commutateur d'options /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 démarrera dans ce répertoire puis recherchera chacun de ses sous-répertoires. Si aucun répertoire n'est spécifié après le /R, la recherche démarre dans le répertoire par défaut actuel. Si vous spécifiez un répertoire, et son nom contient des caractères spéciaux, il doit être placé entre guillemets. Par exemple, il doit être cité s'il est spécifié à l'aide d'une variable d'environnement, par exemple : %windir\commande.

 

Il y a deux différences dans l'invocation de commander causée par récursion de répertoire:

 

La variable de contrôle de boucle contient le nom complet du fichier correspondant

commander est exécuté avec le répertoire par défaut défini sur le répertoire dans lequel le fichier a été trouvé

 

Cet exemple traite tout .TXT fichiers dans le répertoire courant et ses sous-répertoires :

 

pour /r %x dans (*.txt) ...

 

Cet exemple fonctionne avec tous les .BAK fichiers sur le lecteur D:

 

pour /r d:\ %x dans (*.bak) ...

 

Redirection de sortie

 

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 nom de fichier n'inclut pas de chemin de fichier absolu, il sera créé par rapport au répertoire par défaut alors actuel. Si vous utilisez la récursion de répertoire, ce chemin changera pour chaque répertoire traité. Le moyen le plus simple de forcer un seul fichier cible est de mettre la commande entière entre parenthèses, par exemple :

 

(pour %x dans la commande (set)) > nom de fichier

 

Autres notes

 

Vous pouvez utiliser soit % or %% devant le nom de la variable (var) dans la commande. L'un ou l'autre formulaire fonctionnera, que la commande FOR soit saisie à partir de la ligne de commande ou qu'elle fasse partie d'un alias ou d'un fichier batch. (CMD ce qui nécessite un seul % si FOR est utilisé sur la ligne de commande, mais nécessite %% si FOR est utilisé dans un fichier batch.) Notez que vous devez avoir au moins un % signe présent.

Le nom de la variable peut contenir jusqu'à 80 caractères.

Si la commande FOR est un alias, par exemple : alias pour=*pour /h, gamme les spécifications seront ignorées.

Le mot DO est inutile mais accepté. Ne le confondez pas avec le tout à fait indépendant DO commander.

Si le nom de la variable FOR var est un seul caractère, pour des raisons de compatibilité avec CMD, il est créé dans l'environnement d'une manière spéciale qui n'écrase pas une variable d'environnement existante portant le même nom. Partout où commander 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 la suivent. Par exemple, la commande suivante tente d'ajouter a: et b: à la fin de PATH, mais ne fonctionnera pas comme prévu :

 

pour %p dans (a: b:) chemin %path;%p

chemin

b:ath;b:

 

Le %p in %chemin a été interprété comme la variable FOR %p suivi du texte ath, pas ce qui était prévu. 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 indiqué dans les exemples ci-dessous, chacun d'entre eux atteignant l'objectif initial :

 

pour %p dans (a: b:) chemin %[chemin];%p

pour %x dans (a: b:) chemin %path;%x

pour %px dans (a: b:) chemin %path;%px

 

Si le nom de la variable FOR contient plus d'un caractère, il est créé dans l'environnement et effacé lorsque FOR est terminé, qu'une variable de ce nom ait existé ou non avant le FOR. Il ne peut pas être modifié avec le SET, ESETou UNSET commandes. Si vous aviez déjà une variable portant ce nom, elle ne sera plus accessible. Par exemple, une commande qui commence

 

pour %chemin dans...

 

écrira sur votre courant PATH réglage, puis effacez le PATH variable complètement lorsque FOR est terminé.

 

Command peut également utiliser la variable FOR avec la syntaxe spéciale de CMD décrit dans Syntaxe spéciale pour la compatibilité CMD.

 

L'exemple suivant utilise FOR avec des fonctions variables pour supprimer le .POUBELLE fichiers pour lesquels un correspondant . TXT le fichier existe dans le répertoire courant (il doit être saisi sur une seule ligne) :

 

pour %file dans (*.txt) del %@name[%file].bak

 

La commande ci-dessus peut ne pas fonctionner correctement sur un lecteur LFN, car le retour DOSSIER La variable peut contenir des espaces blancs. Pour corriger ce problème, vous avez besoin de deux séries de guillemets, une pour DEL et une pour %@NOM:

 

pour %file dans (*.txt) del "%@name["%file"].bak"

 

Vous pouvez utiliser regroupement de commandes pour exécuter plusieurs commandes pour chaque élément de set. Par exemple, la commande suivante copie chaque .WKQ fichier dans le répertoire courant vers le D:\WKSAVE répertoire, puis modifie l'extension de chaque fichier du répertoire actuel en .SAV:

 

[pour %file dans (*.wkq) (copier %file d:\wksave\ & ren %file *.sav)

 

ou (dans un fichier batch):

 

pour %fichier dans (*.wkq) (

 copier %fichier d:\wksave\

 ren %fichier *.sav

)

 

Dans un fichier batch, vous pouvez utiliser GOSUB pour exécuter un sous-programme pour chaque élément de set. Au sein du sous-programme, la variable FOR peut être utilisée comme une variable d'environnement. C'est un moyen pratique d'exécuter une séquence complexe de commandes pour chaque élément de set sans compromis. NOUS CONTACTEZing un autre fichier de commandes.

 

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 souhaiterez peut-être que trois fichiers de commandes fonctionnent tous sur le même fichier de données. La commande FOR pourrait ressembler à ceci :

 

pour %cmd dans (filetest fileform fileprnt) %cmd fichier de données

 

Cette ligne s'étendra à trois commandes distinctes :

 

fichier de données de test de fichier

fichier de données de forme de fichier

fichier de données fileprnt

 

Les instructions FOR peuvent être imbriquées.

 

PARTIR POUR

 

Le mot clé spécial LEAVEFOR peut être utilisé dans un groupe de commandes FOR. LEAVEFOR termine le traitement FOR en cours et continue avec la ligne suivant la commande FOR, d'une manière similaire à celle du mot-clé LEAVE dans un DO commander.

 

pour %i dans (*) (

si "%i" == "xyz.abc" partir pour

 

)

 

options:

 

/UN:Traitez uniquement les fichiers qui possèdent le(s) attribut(s) spécifié(s). /UN: sera utilisé uniquement lors du traitement des noms de fichiers génériques dans set. Il sera ignoré pour les noms de fichiers sans caractères génériques ou autres éléments dans set. Voir Commutateurs d'attribut pour plus d'informations sur les attributs qui peuvent suivre /UN:.

 

Par exemple, pour traiter uniquement les fichiers dont l'attribut archive est défini :

 

pour /a:a %f dans (*) echo %f a besoin d'une sauvegarde !

 

Réglage par défaut: /A:-DHS, c'est-à-dire inclure uniquement fichiers sans caché et système iSun attributs.

 

Vous pouvez spécifier /A:= pour afficher une boîte de dialogue pour vous aider à définir des attributs individuels.

 

/DRenvoie uniquement les sous-répertoires, à l'exclusion de "." et "..".

 

/FRenvoie un ou plusieurs mots ou jetons de chaque ligne de chaque fichier dans setL’ /F L'option peut être suivie d'une ou plusieurs options dans une chaîne entre guillemets qui contrôlent la manière dont l'analyse est effectuée. Voir Analyser le texte des fichiers.

 

/HSupprime l'affectation du "." et ".." répertoires vers la variable FOR lorsque les répertoires sont explicitement inclus utilisant l' /UN: option.

 

/JE"texte"Sélectionnez les noms de fichiers en faisant correspondre le texte dans leurs descriptions. Voir Description Gammes.

 

/LInterprétez les trois valeurs dans set car Commencer, étapeet fin valeurs d’une boucle comptée. Voir Boucles FOR comptées.

 

/New JerseyNe récurez pas dans les liens symboliques ou les jonctions (voir /R).

 

/O :...Trier les fichiers avant de les traiter.

 

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 :

 

nTrier par nom de fichier et extension, sauf si e est explicitement inclus.
-Inverser l'ordre de tri pour la clé de tri suivante
aTriez 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.
cTrier par taux de compression
dTrier par date et heure (la plus ancienne en premier) ; regarde aussi /T:acw
eTrier par extension
gRegroupez d'abord les sous-répertoires, puis les fichiers
iTrier par description
oTrier par propriétaire
rInverser l'ordre de tri pour toutes les options
sClasser par taille
tPareil que d
uNon trié
zPareil que s

 

L'option /O:... enregistre tous les noms de fichiers correspondants, puis effectue l'opération demandée. Cela évite le problème potentiel du traitement des fichiers plus d'une fois.

 

/R[chemin]Recherchez dans le répertoire courant et tous ses sous-répertoires les fichiers dans set. Si l' /R est suivi d'un nom de répertoire, recherchez les fichiers dans ce répertoire et tous ses sous-répertoires. Mise en garde: si le nom du répertoire comprend des caractères spéciaux, notamment « % » pour indiquer une variable d'environnement, il doit être placé entre guillemets doubles ("). /R prend en charge les noms de dossiers du shell Windows ; voir CDD pour en savoir plus.

 

/T"texte"Spécifiez les délimiteurs à utiliser lors de l'analyse d'un ensemble de chaînes.

 

/WL'ensemble FOR doit être traité comme des noms de fichiers, même si aucun caractère générique n'est détecté. (Ceci est utile si vous souhaitez utiliser des expressions régulières avec FOR.)