Salut,
dans la première partie j'ai essayé de faire une brêve intro sur les variables, maintenant on essayera de voir deux techniques qui nous permetteront d'avancé un peu:
1- référencer "textuellement" des variables (ou double-expansion)
2- substitution double de varibales
REMARQUE
"En manque de temps/motivation ces jours-ci" la section traitant "les substitutions doubles de varibale" serait quant à elle ajouter par la suite ...
tous ces exemples sont testés sous un XPSP2
1- référencer "textuellement" des variables:
comme on a vu dans l'intro, On défini une variable de cette manière:
On peux par la suite créer un nombre indéterminer de variable qui portent tous le même contenuCode:
1
2 Set Variable=Contenu
donc ici:Code:
1
2
3
4
5
6 Set A=Hello Set B=%A% Set C=%B% Echo %B%
la variable %A% = la variable %B% = la variable %C%
comme vous pouvez le voir, c'est tout simple, on utilise notre variable avec des "%" cette méthode ne s'appelle pas référencer textuellement une variable, mais plutôt affectation de variable par d'autres variables
dans le cas de "Set /A" la chose devient plus intéressant:
Code:
1
2
3
4
5
6
7
8
9
10 > cat test.bat Set /A A=12 Set /A B=A Set /A C=B Set /A D=c Echo %A% %B% %C% %D% >test.bat 12 12 12 12
Ou plus simple:
les variables B,C et D ne sont pas déclarer explicitement "%B%,%C%,%D%"Code:
1
2
3
4
5
6
7 > cat test.bat Set /A A=12,B=A,C=B,D=B Echo %A% %B% %C% %D% > test.bat 12 12 12 12
Cette technique pratique n'est disponible qu'avec les "expressions numériques"
si on essaye la même méthode avec une expression non-numérique le resultat ne sera pas satisfaisant:
ou bien:Code:
1
2
3
4
5
6
7
8
9
10 > cat test.bat Set A=Hello Set B=A Set C=B Set D=C Echo %A% %B% %C% %D% >test.bat Hello A B C
Code:
1
2
3
4
5
6
7 > cat test.bat Set A=Hello,B=A,C=B,D=B Echo %A% %B% %C% %D% >test.bat Hello,B=A,C=B,D=B A B C
On a deux solution pour utiliser le réferencement des variables:
A- en Déactivant l'ERV:
Remarques:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Setlocal Disabledelayedexpansion SET A=HELLO SET B=A SET C=B SET D=C SET E=D SET F=E SET G=F ECHO %A% CALL ECHO %%%B%%% CALL CALL ECHO %%%%%%%C%%%%%%% CALL CALL CALL ECHO %%%%%%%%%%%%%%%D%%%%%%%%%%%%%%% CALL CALL CALL CALL ECHO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%E%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CALL CALL CALL CALL CALL ECHO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%F%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CALL CALL CALL CALL CALL CALL ECHO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%G%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Endlocal
- Pour utiliser cette technique dans un fichier de commandes et pour chaque "expansion-doubles" activée il faut mettre le nombre adéquate de "%" dans chaque côté de la variable:
avec l'exemple précédent on aura :Code:Niveau_Actuel=(Niveau_précédent*2)+1
Code:
1
2
3
4
5
6
7
8
9
10
11 LEVELS VARIABLES NOMBRE DE % -------------------------------------------------------------------------------- LEVEL1 ECHO %A% 1 --------------------------------------------------------------------------------- LEVEL2 CALL ECHO %%%B%%% 3 --------------------------------------------------------------------------------- LEVEL3 CALL CALL ECHO %%%%%%%C%%%%%%% 7 --------------------------------------------------------------------------------- LEVEL4 CALL CALL CALL ECHO %%%%%%%%%%%%%%%D%%%%%%%%%%%%%%% 15 ---------------------------------------------------------------------------------
- si on utilise cette méthode directement dans le prompt,on va trouver que c'est plus simple et plus concis
pour chaque niveau activée on ajoutera un "%" des deux côté:
pourquoi ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 D:\>Set a=Hello D:\>Set b=a D:\>Set c=b D:\>echo %a% Hello D:\>call echo %%b%% Hello D:\>call call echo %%%c%%% Hello D:\>
tout simplement parceque dans l'invite de commandes l'intérprétation des "%" n'est pas la même que dans un fichier de commandes
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 D:\> type test.bat set test= echo %test% D:\> test.bat Commande ECHO désactivée. D:\> Set test= D:\> echo %test% %test% D:\>
c'est pour cette raison, que les variables spéciales de boucles FOR %%a %%b %%c ..etc doivent être utilisé directement dans le prompt en %a %b %c
Code:
1
2
3
4
5
6
7 D:\> for %%a in (*) do @echo %%a %%a était inattendu. D:\> for %a in (*) do @echo %a myconfig.ini test.txt
B- En Activant l'ERV:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Setlocal Enabledelayedexpansion SET A=HELLO SET B=A SET C=B SET D=C SET E=D SET F=E Echo %A% Echo !%B%! Endlocal
avec la declaration ENABLEDELAYEDEXPANSION on peux remonter de 1 niveau seulement.
pour monter d'un niveau superieur on doit ouvir d'autres sous-shell en plus on doit désactivé d'ERV déclarer par SETLOCAL ENABLEDELAYEDEXPANSIONCode:
1
2 Niveau1: Echo !%B%!
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 SET A=HELLO SET B=A SET C=B SET D=C SET E=D SET F=E SETLOCAL ENABLEDELAYEDEXPANSION Echo !A! Echo !%B%! ENDLOCAL CMD /V:ON /C ECHO !%%%C%%%! CMD /C CMD /V:ON /C ECHO !%%%%%D%%%%%! CMD /C CMD /V:ON /C CMD /V:ON /C ECHO !%%%%%%%E%%%%%%%! CMD /C CMD /V:ON /C CMD /V:ON /C CMD /V:ON /C ECHO !%%%%%%%%%F%%%%%%%%%!
si on dépasse le premier niveau, il faut forcer la lecture des variables en ouvrant des sous-shell
...