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 contenu

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Set A=Hello
Set B=%A%
Set C=%B%

Echo %B%
donc ici:

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
les variables B,C et D ne sont pas déclarer explicitement "%B%,%C%,%D%"

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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
ou bien:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Remarques:
- 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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Niveau_Actuel=(Niveau_précédent*2)+1
avec l'exemple précédent on aura :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:\>
pourquoi ?
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ENABLEDELAYEDEXPANSION

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

...