Objet :Créer des boucles dans les fichiers batch

 

Format :DO loop_control

commands

[ITERATE]

commands

[LEAVE [n]]

commands

ENDDO

 

Formats de contrôle de boucle

 

DO count

DO FOREVER

DO varname = start TO end [BY step] [(command)]

DO WHILE condition [(command)]

DO UNTIL condition [(command)]

DO UNTIL DATETIME date time [(command)]

DO FOR n [SECONDS | MINUTES | HOURS] [(command)]

DO varname IN [range...] /D"directory" [/I:"text" /S[[+]n] /A:[[-|+]rhsadecijopt /O:[-]acdeginorstuz fileset [(command)]

DO varname IN [/T"delimiters"] /L stringset [(command)]

DO varname IN /C stringset [(command)]

DO varname IN /L stringset [(command)]

DO varname in /P command ... [(command)]

DO varname IN /Q stringset [(command)]

DO varname IN /Y arrayname [(command)]

DO varname IN @file [(command)]

 

count

Entier dans l'intervalle [0,  9223372036854775807], ou une variable interne ou une fonction variable qui s'évalue à une telle valeur, spécifiant le nombre de fois que la boucle est exécutée.

varname

Variable d'environnement contenant la valeur actuelle de l'index de la boucle, ou le nom de fichier ou la chaîne de caractères actuelle, ou la ligne actuelle d'un fichier. Ne pas faire précéder le nom de la variable de %.

start, end, step

Desentiers compris dans l'intervalle [-9223372036854775807,  9223372036854775807] ou des variables internes ou des fonctions variables qui évaluent ces valeurs, contrôlant le nombre de fois que la boucle est exécutée.

condition

Une expression conditionnelle pour déterminer si la boucle doit être exécutée ou non.

fileset

Un nom de fichier ou une liste de noms de fichiers, en utilisant éventuellement des caractères génériques.

stringset

un ensemble arbitraire de chaînes de caractères. Les caractères génériques ne sont pas interprétés.

file

un fichier dont chaque ligne contient une chaîne pour laquelle la boucle doit être exécutée

une plage

Une date, une heure, une taille ou une plage d'exclusion. Au plus une chaîne de chaque type, dans n'importe quel ordre.

commands

Une ou plusieurs commandes à exécuter à chaque passage dans la boucle. Si vous utilisez plusieurs commandes, elles doivent être séparées par des séparateurs de commandes ou être placées sur des lignes distinctes.

date

La date de fin de la boucle au format ISO 8601

time

L'heure de fin de la boucle au format 24-h hh:mm:ss

/A :

Sélection d'attributs

/C

Boucle sur chaque caractère de l'expression

/D "répertoire"

Démarrer le répertoire

/I "texte"

(Correspondance avec la description) Plage de description.

/L(itéral)

Lesmembres de l'ensemble sont des chaînes de caractères, pas des noms de fichiers.

/O :... (Ordre)

Ordre de tri

/P

Analyse la sortie de la commande, en enregistrant la ligne de sortie suivante dans le nom de fichier àchaque fois que la boucle est exécutée.

/Q

Comme /L, mais traite les arguments entre guillemets doubles (avec espacement intégré) comme un seul argument.

/S

Exécute la boucle dans le répertoire courant et tous ses sous-répertoires.

 

Prend en charge les caractères génériquesétendus , les plages et les listes d'inclusion pour l'ensemble. 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

 

DO peut être utilisé dans des fichiers batch, des alias ou à l'invite de commande. Pour les utiliser dans des alias ou à l'invite, vous devez définir l'expression DO sur une seule ligne et placer le corps de la boucle DO dans un groupe de commandes à la suite de l'expression DO. (Il n'y a pas d'instruction ENDDO dans un DO sur une seule ligne). Par exemple, si le dernier argument de la ligne est

 

do count=1 to 10 by 1 (echo count=%count)

 

Si le dernier argument de la ligne est un simple (, , il est interprété comme le début d'un groupe de commandes. DO ajoutera les lignes suivantes (dans un fichier batch) ou vous invitera à saisir d'autres données (sur la ligne de commande) jusqu'à ce qu'il obtienne un )final .

 

Lorsque vous utilisez DO sur un lecteur LFN, vous devez mettre entre guillemets tout nom de fichier contenant des espaces blancs ou des caractères spéciaux. La même restriction peut s'appliquer aux noms renvoyés dans la variable DO, si vous les transmettez à des commandes internes ou à d'autres commandes. TCC ou à d'autres commandes qui nécessitent de citer les noms de fichiers avec des espaces blancs. DO ne met pas automatiquement les noms renvoyés entre guillemets, même si vous avez inclus des guillemets dans l'argument initial.

 

DO définit quatre variables internes :

 

%_do_dirsLe nombre de répertoires parcourus (avec /S) pour la boucle DO en cours. (Les boucles DO imbriquées ont chacune leurs propres _do_dirs, _do_files, _do_errors et _do_loop).
%_do_filesNombre d'entrées de répertoire (fichiers ou sous-répertoires) traitées pour la boucle DO en cours.
%_do_errorsNombre d'erreurs pour la boucle DO en cours.
%_do_loopNombre d'exécutions de la boucle DO en cours.

 

Types de boucles DO

 

DO peut être utilisé pour créer différents types de boucles.

 

•DO count, est une boucle comptée. Les lignes du fichier batch entre DO et ENDDO sont répétées un certain nombre de fois.

 

•DO FOREVER crée une boucle sans fin. Vous devez utiliser LEAVE ou GOTO pour sortir d'une telle boucle.

 

•DO varname= start TO end [BY step] est similaire à une "boucle pour" dans les langages de programmation tels que BASIC. DO crée une variable d'environnement, varname, et lui attribue la valeurstart. Si varname existe déjà dans l'environnement, ilsera écrasé. DO commence alors le processus de boucle en comparant la valeur devarname avec la valeur deend. Si step est positif ou non spécifié, et que varname est inférieur ou égal à end, DO exécute les lignes du fichier batch jusqu'à ENDDO. Ensuite, DO ajoute à la valeur devarname soit la valeur de step si BY step est spécifié, soit 1, et répète le processus de comparaison et d'exécution jusqu'à ce que varname soit supérieur à end. Cet exemple affiche les nombres pairs de 2 à 20 :

 

do i = 2 to 20 by 2

  echo %i

enddo

 

DO peut également compter à la baisse plutôt qu'à la hausse. Si lepas est négatif, le nom de famille sera diminué de la valeur absolue du pas à chaque boucle, et la boucle s'arrêtera lorsque lenom de famille sera inférieur à la fin. Par exemple, pour afficher les nombres pairs de 2 à 20 dans l'ordre inverse, remplacez la première ligne de l'exemple ci-dessus par :

 

do i = 20 to 2 by -2

 

•DO WHILE condition évalue la condition à chaque passage dans la boucle en tant qu'expression conditionnelle avant d'exécuter la boucle, et ne l'exécute que si elle est vraie. Si lacondition est FAUX lorsque le DO est exécuté pour la première fois, la boucle ne sera jamais exécutée.

 

•DO UNTIL condition évalue la condition en tant qu'expression conditionnelle à chaque fois après l' exécution de la boucle, et ne répète la boucle que si elle est FAUSSE. Par conséquent, les instructions contenues dans la boucle seront toujours exécutées au moins une fois.

 

•DO UNTIL DATETIME date time exécute la boucle jusqu'à ce que la date et l'heure actuelles soient égales ou supérieures à la date (format ISO) et à l'heure (format 24 heures) spécifiées. La date et l'heure peuvent être au format AAAA-MM-JJ HH:MM:SS ou AAAAMMJJHMMSS. (La date et/ou l'heure peuvent être des variables).

 

•DO FOR n SECONDES | MINUTES | HEURES exécute la boucle pendant la durée spécifiée.

 

•DO varname IN fileset exécute les commandes entre DO et ENDDO en créant une variable d'environnement, varname, et en la définissant comme étant égale à chaque nom de fichier dans le jeu de fichiers, en ignorant les éléments qui ne correspondent pas aux noms de fichiers ou de répertoires. Cet ensemble est similaire à celui  utilisé dans la  commande FOR, mais il ne peut inclure que des noms de fichiers et de répertoires, et non des chaînes de texte arbitraires. Si varname existe déjà dans l'environnement, il sera écrasé (contrairement à la variable de contrôle de FOR). Par exemple :

 

do x in *.txt

...

enddo

 

exécute la boucle une fois pour chaque  fichier .TXT dans le répertoire actuel ; à chaque passage dans la boucle, la variable x est remplacée par le nom du fichier suivant qui correspond à la spécification du fichier. L'ordre des correspondances dépend du système de fichiers et n'est absolument pas lié aux caractéristiques des noms de fichiers correspondants.

 

Si, entre DO et ENDDO, vous créez un nouveau fichier qui pourrait être inclus dans la liste des fichiers, il peut ou non apparaître dans une itération de la boucle DO. L'apparition du nouveau fichier dépend de son emplacement physique dans la structure du répertoire, une condition sur laquelle TCC n'a aucun contrôle.

 

Pour utiliser la date, l'heure, la taille, la description ou les plages d'exclusion de fichiers  pour l'ensemble, placez-les juste avant le(s) nom(s) de fichier, par exemple :

 

do x in /[d9-1-2018,9-31-2018] *.txt

 

•DO varname IN /L stringset exécute les commandes entre DO et ENDDO une fois pour chaque chaîne littérale dans stringset, en attribuant un nom à chacune d'entre elles.

 

•DO varname IN /C stringset exécute les commandes entre DO et ENDDO une fois pour chaque caractère du stringset (y compris les espaces et les caractères spéciaux), en attribuant unnom à chacun d'entre eux.

 

•DO varname IN @file exécute les commandes entre DO et ENDDO une fois pour chaque ligne du fichier, en attrib uant lenom de famille au contenu de chacune d'elles à tour de rôle.Attention aux caractères ayant une signification spéciale pour TCCtels que les symboles de redirection et de tuyauterie, dans le fichier (utilisez SETDOS /X si nécessaire).

 

Pour exécuter la boucle une fois pour chaque ligne de texte dans le presse-papiers, utilisez CLIP : (ou CLIP0 : - CLIP9 :) comme nom de fichier (par exemple DO X IN @CLIP :). CLIP : ne renvoie aucune donnée si le presse-papiers ne contient pas de texte. Voir Redirection pour plus d'informations sur CLIP :.

 

Mots clés DO spéciaux : ITERATE et LEAVE

 

Deux mots-clés spéciaux, ITERATE et LEAVE, peuvent être utilisés à l'intérieur d'une boucle DO / ENDDO. ITERATE ignore les commandes restantes dans la boucle et retourne au début de la boucle pour une nouvelle itération, à moins que DO ne détermine que la boucle est terminée. LEAVE quitte la boucle DO en cours et continue avec la commande qui suit son ENDDO. Les deux mots-clés peuvent être répétés autant de fois que souhaité. ITERATE et LEAVE sont le plus souvent utilisés dans une  commande IF ou IFF (groupe) :

 

do while "%var" != "%val1"

 ...

 if "%var" == "%val2" leave

enddo

 

LEAVE accepte un argument numérique facultatif (>=1) qui spécifie le niveau d'imbrication DO que vous souhaitez quitter. Par exemple, "LEAVE 2" permet de quitter deux boucles DO imbriquées. Vous pouvez éventuellement passer une variable comme argument de LEAVE.

 

Notes d'utilisation

 

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).

 

Les boucles DO peuvent être imbriquées, c'est-à-dire que vous pouvez avoir une boucle DO / ENDDO à l'intérieur d'une autre boucle DO / ENDDO.

 

Vous pouvez sortir de toutes les boucles DO / ENDDO d'un fichier batch en utilisant GOTO jusqu'à une ligne après l'ENDDO correspondant. Toutefois, veillezà lire les mises en garde concernant GOTO et DO sous la  commande GOTO avant d'utiliser GOTO de toute autre manière à l'intérieur d'une boucle DO.

 

Vous ne pouvez pas utiliser RETURN pour revenir d'un GOSUB à l'intérieur d'une boucle DO.

 

Remarque : ne confondez pas la commande DO avec le  mot-clé  facultatif do de la  commande FOR, qui n'a aucun rapport avec elle .

 

Options :

 

/A :Sélectionner les fichiers dans un DO x IN... en fonction de leur(s) attribut(s) spécifié(s). Voir Commutateurs d'attributs pour plus d'informations sur les attributs qui peuvent suivre /A :.

 

Vouspouvez spécifier /A:= pour afficher une boîte de dialogue qui vous aidera à définir les attributs individuels.

 

/CPour chaque boucle, affectez le caractère suivant (y compris les espaces et les caractères spéciaux) de l'expression à la variable DO.

 

/D "répertoire"Définit le répertoire de départ (à utiliser avec /S). /D prend en charge les noms de dossiers de l'interpréteur de commandes Windows ; voir CDD pour plus de détails.

 

/I "text"Sélectionner des fichiers dans un DO x IN ... en faisant correspondre le texte de leur description . Pour plus d'informations, voir la rubrique Plages de description.

 

/LLes paramètres qui suivent DO x IN /L sont des chaînes de caractères et non des noms de fichiers. Chaque paramètre sera affecté dans l'ordre, de gauche à droite, à la variable de contrôle de la boucle lors des passages consécutifs dans la boucle. /L ne traite pas les guillemets doubles comme des délimiteurs ; utilisez /Q si vous voulez passer des arguments avec des espaces blancs intégrés.

 

/NDésactiver les options :

 

dSauter les répertoires cachés (utilisé avec /S)
jSauter les jonctions (utilisé avec /S)

 

/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é principale, la suivante comme clé secondaire, et ainsi de suite :

 

nTrier par nom de fichier et extension, sauf si e est explicitement inclus.
-Inverse l'ordre de tri pour la clé de tri suivante.
aTrier 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
dTri par date et heure (la plus ancienne en premier) ; voir aussi /T:acw
eTri par extension
gRegroupement des sous-répertoires d'abord, puis des fichiers
iTri par description
oTrier par propriétaire
rInverser l'ordre de tri pour toutes les options
sTrier par taille
tIdentique à d
uNon trié
zIdentique à s

 

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

 

/PPour chaque boucle, la ligne de sortie suivante de la commande estaffectée à la variable DO.

 

/QLes paramètres qui suivent DO x IN /Q sont des chaînes de caractères et non des noms de fichiers. Chaque paramètre sera affecté dans l'ordre, de gauche à droite, à la variable de contrôle de la boucle lors des passages consécutifs dans la boucle. Contrairement à /L, /Q traite les arguments entre guillemets doubles avec espacement intégré comme un seul argument.

 

/SExécuter la boucle DO dans le répertoire actuel, puis dans tous ses sous-répertoires. (DO supporte également /R comme synonyme, pour des raisons de compatibilité avec FOR).

 

Si vous spécifiez un nombre après le /S, DO limitera la récursivité des sous-répertoires à ce nombre. Par exemple, si vous avez une arborescence de répertoires "a", "b" et "c", /S2 n'affectera que les répertoires "a", "b" et "c".

 

Si vous spécifiez un + suivi d 'un nombre après le /S, DO n'exécutera pas la commande avant d'avoir atteint cette profondeur dans l'arborescence des sous-répertoires . Par exemple, si vous avez une arborescence de répertoires \a\b\c\d\e, /S+2 n'exécutera pas la commande dans \a ou \a\b.

 

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

 

/YLire un tableau à une dimension et affecter chaque valeur à la variable DO. Par exemple :

 

do x in /Y MyArray

echo x = %x

enddo