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
	
	| 12
 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:
	
	| 12
 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:
	
	| 12
 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:
	
	| 12
 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:
	
	| 12
 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:
	
	| 12
 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:
	
	Niveau_Actuel=(Niveau_précédent*2)+1
 avec l'exemple précédent on aura  :
	
	| 12
 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é:
	
	| 12
 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
	
	| 12
 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
	
	| 12
 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:
	
	| 12
 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
	
	| 12
 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
...
						
					
Partager