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