salut,
j'espère que ce HOWTO va aider à comprendre quelques notions fondamentales en batch (les boucles et les sous-programmes)
j'ai essayé de donner le maximum d'exemples..et le moins de théorie possibles
il est à noter aussi que je n'ai pas parler des options de la boucles FOR /F "delims - tokens"..ça sera peut être dans un autre HOWTO
LES SOUS-FONCTIONS
Types de fonctions:
==================================================================
1- Sans paramètres:
==================================================================
1 2 3 4 5 6 7
|
{1}SET VAR=Bonjour Maitre
{2}CALL :SFU
{3}GOTO :EOF
{4}
{5}:SFU
{6}ECHO.%VAR% |
Ligne 5: appel explicite de la fonction SFU
Ligne 6: début du corps de la fonction SFU, contient l'affichage de la variable %VAR%
==================================================================
2- Avec paramètres:
==================================================================
----------------------
A- chaîne de caractères
----------------------
1 2 3 4 5 6 7
|
{1}CALL :SFU "Bonjour Maitre"
{2}GOTO :EOF
{3}
{4}:SFU
{5}ECHO.%~1 |
----------------------
B- variable
----------------------
1 2 3 4 5 6 7
|
{1}SET VAR=Bonjour Maitre
{2}CALL :SFU "%VAR%"
{3}GOTO :EOF
{4}
{5}:SFU
{6}ECHO.%~1 |
Ligne 2: la variable %VAR% est déclarer entre guillemets
::- [CALL :SFU %VAR%] = [CALL :SFU Bonjour Maitre]
Ce qui se traduit par Bonjour=%1 et Maitre=%2
alors que:
::- [CALL :SFU "%VAR%"] = [CALL :SFU "Bonjour Maitre"]
ce qui se traduit par "Bonjour Maitre"=%1
Ligne 6: Il ne reste plus qu'enlever les guillemets
::- ECHO.%~1
On peut aussi utiliser le %* pour appeler les paramètres
1 2 3 4 5 6 7
|
{1}SET VAR=Bonjour Maitre
{2}CALL :SFU %VAR%
{3}GOTO :EOF
{4}
{5}:SFU
{6}ECHO.%* |
Ligne 6: le signe %* vaut tout le contenu de la variable %VAR%
%*=Bonjour Maitre
-----------------------
C- référence
-----------------------
1 2 3 4 5 6 7 8
|
{1}SET VAR=Bonjour Maitre
{2}CALL :SFU NEWVAR
{3}ECHO.%NEWVAR%
{4}GOTO :EOF
{5}
{6}:SFU
{7}SET %1=%VAR% 2 |
Ligne 2: le paramètre NEWVAR sera dans le corps de la fonction transformer en une variable %NEWVAR%
Ligne 7:
1 2 3
|
::- SET [NEWVAR]=[Bonjour Maitre] [2]
::- SET %1 = %VAR% 2 |
-----------------------
D- expansions retardées des variables:
-----------------------
)- expansion activée
1 2 3 4 5 6 7 8 9
|
{1}SETLOCAL ENABLEDELAYEDEXPANSION
{2}SET VAR=Bonjour Maitre
{3}CALL :SFU VAR
{4}GOTO :EOF
{5}
{6}:SFU
{7}ECHO.!%1%! |
Ligne 3: Le nom du paramètre doit être identique au nom
de la variable ici: VAR et %VAR%
)- expansion désactivée
1 2 3 4 5 6 7 8 9
|
{1}SETLOCAL DISABLEDELAYEDEXPANSION
{2}SET VAR=Bonjour Maitre
{3}CALL :SFU VAR
{4}GOTO :EOF
{5}
{6}:SFU
{7}CALL ECHO.%%%1%% |
Ligne 3: Le nom du paramètre doit être identique au nom
de la variable ici: VAR et %VAR%
-----------------------------------
E- Concaténation de paramètres
-----------------------------------
1 2 3 4 5 6 7 8 9
|
{1}SET VAR=Bonjour Maitre
{2}CALL :SFU "%VAR%" CONCAT
{3}ECHO.%CONCAT%
{4}GOTO :EOF
{5}
{6}:SFU
{7}SET CONCAT=%~1 2
{8}SET "%2=%CONCAT%" |
Voici un autre exemple:
1 2 3 4 5 6 7 8 9 10
|
{1}SET VAR1=Bonjour
{2}Set VAR2=Maitre
{3}CALL :SFU VAR1 VAR2 VAR3
{4}ECHO.%VAR1% + %VAR2% = %VAR3%
{5}GOTO :EOF
{6}
{7}:SFU
{8}CALL SET STR=%%%1%%-%%%2%%
{9}CALL SET "%3=%STR%" |
Utilisation de la commande SHIFT:
on peut utiliser la commande SHIFT pour exploiter un nombre éléver de paramètres:
Pour illustrer mes propos voici un exemple:
(Ce code permet de vérifier si les processus mis comme paramètre dans CALL
sont actifs ou pas)
1 2 3 4 5 6 7 8 9 10
|
{1}@ECHO OFF
{2}SET Process=CMD NOTEPAD REGEDIT EXPLORER IEXPLORE ALG WRITE VLC SUM FORMAT OSK
{3}CALL :PROC %Process%
{4}GOTO:EOF
{5}
{6}:PROC
{7}TASKLIST -NH|FIND /I "%1" >NUL &&ECHO: ACTIF %1||ECHO:INACTIF %1
{8}SHIFT
{9}IF NOT %1!==! GOTO PROC |
LES BOUCLES FOR
====================================================================
1-Boucle FOR
====================================================================
1 2 3 4
|
{1}For %%? In ("ceci est un exemple") Do Echo %%?
{2}For %%? In (ceci est un exemple) Do Echo %%?
{3}For %%? In (ceci est "un exemple") Do Echo %%? |
La boucle 1: va retourner: La boucle 2: va retourner:
1 2 3 4 5
|
ceci
est
un
exemple |
il ne sera pas question d'expression mais de mots
La boucle 3: va retourner:
1 2 3 4
|
ceci
est
"un exemple" |
==> l'utilisation des guillemets provoque un changement de l'affichage de %%?
====================================================================
2-Boucle FOR /D
====================================================================
On suppose qu'on a un répertoire "folder" ayant comme
contenu:
1 2 3 4 5 6 7 8 9 10 11
|
D:\folder\mon_batch.bat
D:\folder\test\log.txt
D:\folder\test\index.htm
D:\folder\key\files\stf.cmd
D:\folder\key\files\Xml_files
D:\folder\Logs_2008_11
D:\folder\test_1251_10
D:\folder\test_12_2002
D:\folder\Logs_2008_03
D:\folder\Logs_2 |
:=: On va exploiter cette structure du dossier
:=: tout au long du cours
1 2 3
|
{1}FOR /D %%a In (*) Do Echo %%a
{2}FOR /D %%a In (test_*_* logs_*_*) Do Echo %%a |
La Boucle 1: va retourner:
1 2 3 4 5 6 7 8
|
key
test
Logs_2008_11
test_1251_10
test_12_2002
Logs_2008_03
Logs_2 |
--> la boucle ne liste pas les sous-dossier.
-->On peut utiliser à la place de (*) un (*.) ou bien (*.*)
La Boucle 2: va retourner:
1 2 3 4 5
|
Logs_2008_11
test_1251_10
test_12_2002
Logs_2008_03 |
-->On peut chercher une structure spécial pour les noms des dossiers ici :
test_*_* et logs_*_*
=====================================================================
3-Boucle FOR /R
=====================================================================
1 2 3
|
{1}FOR /R "." %%a In (.) Do Echo %%a
{2}FOR /R "." %%a In (*) Do Echo %%a |
La Boucle 1: va retourner:
1 2 3 4 5 6 7 8 9 10 11
|
D:\folder\.
D:\folder\Test\.
D:\folder\key\.
D:\folder\key\files\.
D:\folder\key\files\Xml_files\.
D:\folder\Logs_2008_11\.
D:\folder\test_1251_10\.
D:\folder\test_12_2002\.
D:\folder\Logs_2008_03\.
D:\folder\Logs_2\. |
-->le repertoire parent du batch "D:\folder\." sera lui aussi listé
-->les répértoires seulement seront listés (pas les fichiers)
La Boucle 2: va retourner:
1 2 3 4 5
|
D:\folder\mon_batch.bat
D:\folder\test\log.txt
D:\folder\test\index.htm
D:\folder\key\files\stf.cmd |
--> (*.*) est synonyme de (*)
--> On peut choisir une/plusieurs extension(s) (*.cmd *.txt)
--> On peut même lister les répértoires et les fichiers ensembles avec (* .)
======================================================================
4-Boucle FOR /F
======================================================================
La Boucle FOR /F est la plus utiliser, car elle regroupe toutes
les fonctionnalités des autres boucle et + encore:
--------------
a) Expression
--------------
For /f "tokens=*" %%z In ("une autre expression") Do Echo %%z
Cette boucle equivaut:
For %%z In ("une autre expression") Do Echo %%z
La seule difference est que les guillemets dans FOR /F sont omis
au contraire de la boucle FOR
---------------------------
b) Lister fichiers/dossiers
--------------------------
1 2 3 4
|
{1}For /f "Tokens=*" %%a In ('dir /b /a-d "*.txt"
"*.bat"
"*.cmd"') Do Echo "%%~a" |
1 2 3 4
|
{2}For /f "Tokens=*" %%a In ('dir /b /a-d /S "*.txt"
"*.bat"
"*.cmd"') Do Echo "%%~a" |
La Boucle 1: va retourner:
La Boucle 2: va retourner:
1 2 3 4
|
"D:\folder\key\files\stf.cmd"
"D:\folder\mon_batch.bat"
"D:\folder\test\log.txt" |
--> avec le commutateur /S :
+ Les fichiers dans les sous-dossiers seront aussi lister
+ les chemins des fichiers seront absolus [D:\folder\mon_batch.bat] au lieu de [mon_batch.bat]
----------------------
c) Contenu des fichiers
----------------------
1 2 3 4
|
{1}For /f "delims=" %%z In (index.txt help.txt) Do Echo %%a
{2}For /f "delims=" %%z In (index.txt help.txt
"une autre expression") Do Echo %%z |
La Boucle 1: va afficher le contenu de index.txt + help.txt
c'est un genre de:
La Boucle 2: c'est la même chose que la première sauf que
l'expression "une autre expression" va aussi être
afficher
======================================================================
5-Boucle FOR /L
======================================================================
[CODE]
FOR /L est utiliser parfois à la place des branchements
GOTO, car elle est plus facile à gérer (mais pas tout le temps !!)
créer 3 fichier:file1.bat file2.bat file3.bat et executer les 2 codes ci-dessous:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
@ECHO OFF
Setlocal Enableextensions
::nombre de fichiers à traiter
Set nb_limit=3
Set /a loop=0
:boucle
Set /a loop+=1
Start "window %loop%" file%loop%.bat
If %loop% EQU %nb_limit% goto end
goto boucle
:end
Endlocal |
à la place de ceci on peut facilement faire:
1 2 3 4 5 6
|
@ECHO OFF
::nombre de fichiers à traiter
FOR /L %%a In (1,1,3) do (
Start "window %%a" file%%a.bat)
EXIT |
voilà,...il reste beaucoup de choses qui n'ont pas été citées ici...mais..l'essentiel et là..
Partager