devstory

Boucles dans le langage de script Batch

  1. Vue d'ensemble des boucles dans le langage Batch
  2. La boucle for (Par défaut)
  3. For /R
  4. For /D
  5. For /L
  6. For /F

1. Vue d'ensemble des boucles dans le langage Batch

Des délimiteurs standards (Standard Delimiter).
  • Espace (space)
  • Virgule ( , )
  • Point virgule ( ; )
  • TAB

2. La boucle for (Par défaut)

La boucle For (par défaut) du langage Batch sert à répéter la liste des fichiers.
Syntaxe :
@rem set_of_files -  Set of Files
@rem Files separated by standard delimiters.
@rem The parameter name 'variable' must be 1 character
FOR %%variable IN ( set_of_files ) DO command

@rem Hoặc:
FOR %%parameter IN ( set_of_files ) DO  (
     command
)
Par exemple : copiez certaines fichiers dans un répertoire (Remarque : Les fichiers doivent être copiés et le répertoire principale doit mettre dans le même disque).
copyFiles.bat
@echo off
@rem Copy to same Disk

FOR %%f IN (E:\test\file1.data  E:\test\file2.txt) DO  (
   echo Copying %%f
   copy  %%f E:\backup
)
pause
D'autres exemples :
@rem The delimiter is a semicolon (;)
FOR %%f IN ("E:\my dir\file1.data" ; E:\test\file2.txt) DO copy %%f E:\backup

@rem The delimiter is a comma ( , )
FOR %%f IN ("E:\my dir\file1.data" , E:\test\file2.txt) DO copy %%f E:\backup

@rem The delimiter is a space.
FOR %%f IN ("E:\my dir\file1.data" E:\test\file2.txt) DO copy %%f E:\backup

3. For /R

La boucle FOR /R sert à répéter la liste des fichiers, comprenant des fichiers dans sous-répertoires, das petits- enfants... Ils sont appelés la boucle récursive (Recurse).
Syntaxe :
FOR /R [path] %%variable IN ( set_of_file_filters ) DO command

@rem Or:
FOR /R [path] %%variable IN ( set_of_file_filters ) DO (
   command
)
  • [path] : Ce paramètre est un repertoire principal. S'il n'est pas ce paramètre"le dossier comprenant le fichier scénario exécutable" ou "le dossier courant" sera considéré comme le répertoire principal.
  • set_of_file_filters : La liste des filtres de fichier. Par exemple *.txt , *.bat, ... ou le point ( . ) signifie tous.
  • variable: Est le nom de variable et doit have un seul caractère.
L'exemple ci-dessous imprime la liste de tous les fichiers *.txt ou *.log dans le répertoire C:/Windows/System32 (Inclut également la recherche dans des sous répertoires, petits- enfants,..)
forR_example1.bat
@echo off
FOR /R "C:\Windows\System32" %%f IN (*.txt *.log) DO  (
   echo %%f
)
pause
L'exemple de la liste tous les fichiers dans le répertoir C:/Windows/System32 (Inclut également la recherche dans des sous répertoires, petits- enfants,..)
forR_example2.bat
@echo off 
FOR /R "C:\Windows\System32" %%f IN ( . ) DO  ( 
   echo %%f
)
pause

4. For /D

La boucle FOR /D sert à répéter la liste des répertoires qui sont des sous- répertoires du répertoire courant.
Syntaxe :
FOR /D [/r] %%variable IN ( set_of_directory_filters ) DO command

@rem Or:
FOR /D [/r] %%parameter IN ( set_of_directory_filters ) DO  (
    command
)
  • set_of_directory_filters : La liste des filtres de répertoire (directory filter) par exemple : en*, fr*,.. séparés par un délimiteur standard (Standard Delimiter).
  • [/r]: Est un paramètre récursif (Recurse) et n'est pas obligatoire, si ce paramètre est disponible, des sous répertoires, des petits-enfants ... seront impliqués dans la boucle.
  • variable: Est le nom de variable et doit avoir un seul caratère.
Par exemple : La liste des sous répertoires du répertoire C:/Windows.
forD_example1.bat
@echo off
C:
cd C:/Windows

FOR /D %%d IN ( * ) DO  (
   echo %%d
)
pause
Par exemple : Listez des sous répertoires dans le répertoire C:/Windows dont le nom est commencé par "en" ou "fr"
forD_example2.bat
@echo off
C:
cd C:/Windows

FOR /D /r %%d IN (en* fr*) DO  (
   echo %%d
)
pause

5. For /L

La boucle For /L sert à répéter une portée de numéros (range of numbers).
Syntaxe :
FOR /L %%variable IN (start, step, end) DO command

@rem Or:
FOR /L %%variable IN (start, step, end) DO  (
     command
)
  • start: La première valeur de variable
  • step: Après chaque répétition (iteration) la valeur de variable sera ajoutée 'step'.
  • end: La dernière valeur.
Exemple :
forL_example1.bat
@echo off 
FOR /L %%d IN (1 2 8 ) DO  (
   echo %%d
)
pause
forL_example2.bat
@echo off 
FOR /L %%d IN (20 -2 5 ) DO  (
   echo %%d
)
pause

6. For /F

La boucle For /F est une boucle compliqué mais puissante. Elle lit un fichier ou quelques fichiers puis analyse les contenus des fichiers. Le contenu d'un fichier est un texte, il est séparé en plusieurs petites pièces de texte qui sont nommé Token. La règle par défaut de la séparation d'un texte est basée sur une espace vide (white space). Pourtant vous pouvez personnaliser la règle délimiteur par paramètre ["delims=xxx"].
La boucle For /F sert également à analyser les contenus d'une chaine (string), ou à exécuter un ensemble des instructions.
Syntaxe :
FOR /F ["options"] %%variable IN ( set_of_filenames ) DO command

FOR /F ["options"] %%variable IN ( set_of_filenames ) DO (
     command
)
FOR /F ["options"] %%variable IN ("Text string to process") DO command
FOR /F ["options"] %%variable IN ("Text string to process") DO ( 
     command
)
  • set_of_filenames: La liste d'un ou plusieurs fichiers.
  • options: Des options, par exemple : "delims=, tokens=1,2,4"
Option
Description
delims=xxx
Des caractères délimiteur (delimiter character(s)). Par défaut ils sont une espace (space)
skip=n
Le premier numéro sera ignoré dans les contenus du fichier. Par défaut skip=0
eol=;
eol (End of Line): Spécifie un caractère particulier qui est mis au début d'une ligne pour marquer cette ligne comme une ligne de commentaire. Des lignes de commentaires seront ignorées par le programme et par défaut est le caractère point virgule ( ; )
tokens=n1,n2,n3
Définit les positions concernées (n1, n2, n3, ..), par défaut est tokens=1
usebackq
(Voir plus des explications dans des exemples)
Pour rendre facile à comprendre, analysons le fichier suivant :
eol (End of Line)
eol: Sert à spécifier un caractère spécial. Par défaut il est un caractère point-virgule ( ; ). Il est mis au début d'une ligne afin de marquer un commentaire (comment), le programme va ignorer cette ligne.
skip=n
skip: Déclare le numéro des premières lignes du fichier qui sera ignoré, le programme n'analysera pas ces lignes. Par défaut skip=0
delims (Delimiter character(s))
delims: Définit des caractères délimiteur (delimiter characters), aidant le programme à délimiter chaque ligne de texte dans des sous paragraphes, chaque extrait de texte est appellé comme Token. Des Token sont numérotés 1, 2, 3, ...
tokens=n1,n2,n3
tokens: Déclare la liste des indices qui se sont intéressées, séparées par la virgule. Par exemple tokens=1,2,4. Par défaut : tokens=1
Tokens
Description
tokens=1,2,4
Les indices telles que 1, 2, 4 sont intéressées.
tokens=2-8
Les indices de 2 à 8 sont intéressées
tokens=3,*
Les indices telles que 3, 4,5, ... sont intéressées
tokens=*
Tous les indices sont intéressées
Par exemple "tokens=1,2,4", signifie que les Token à la position 1, 2, 4 sont intéressées, d'autres Token seront ignorées (Ignore).
Exemple de l'analyse de fichier:
L'exemple de l'utilisation la boucle FOR /F pour lire le fichier persons.txt:
persons.txt
List of celebrities
Creation date: 2017/09/11

; (Comment) Male List
Bill,Gates,1955/10/28,Male
Steve,Jobs,1955/02/24,Male
Mark,Zuckerberg,1984/05/16,Male
Sundar,Pichai,1972/07/12,Male
; (Comment) Female List
Hillary,Clinton,1947/10/26,Female
forF_example1.bat
@echo off 
FOR /F "delims=, skip=3 eol=; tokens=1,2,4" %%i IN ( persons.txt ) DO  (
   echo Full Name: %%i %%j   Gender: %%k
)
pause
Remarque : Le nom des variables dans la boucle a seulement un caractère.
La variable %%i est déclaré explitement dans la boucle. Les variables %%j, %%k sont des variables déclarées implicitement (Le nom des variables implicitessont des caractères suivant des noms de variable explicites).
Exemple d'analyse la String:
  • TODO