J'ai deux exemples de fichiers de commandes très simples:
Assigner une valeur à une variable:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Ce qui, comme prévu, aboutit à:
FOO: 1
Press any key to continue . . .
Cependant, si je place les deux mêmes lignes dans un bloc IF NOT DEFINED:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Cela a pour résultat inattendu :
FOO:
Press any key to continue . . .
Cela ne devrait avoir rien à voir avec le SI, il est clair que le bloc est en cours d'exécution. Si je définis BAR au-dessus du if, seul le texte de la commande PAUSE est affiché, comme prévu.
Ce qui donne?
Question de suivi: Existe-t-il un moyen d'activer l'expansion retardée sans setlocal?
Si je devais appeler cet exemple de fichier de commandes depuis un autre, l’exemple définit FOO, mais uniquement LOCAL.
Par exemple:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Cela affiche:
FOO: 1
FOO:
Press any key to continue . . .
Dans ce cas, il apparaît que je dois activer l’extension retardée dans l’appelant, ce qui peut être fastidieux.
!
, utilisez^^^!
(évitez-le deux fois). Sinon, la fonction "expansion retardée" le mangera.