Comment effacer les variables après chaque script batch exécuté?

Il semble que depuis que j’utilise SET pour déclarer mes variables dans un script batch, si je le lance plusieurs fois dans cmd, la valeur de la variable persiste à moins que je ne les réinitialise explicitement.

Dois-je utiliser setlocal et endlocal pour m’assurer que les variables d’une exécution ne se poursuivent pas sur une autre sans arrêter le CMD?

Oui, vous devez utiliser SETLOCAL. Cela localisera les modifications de sorte que l’ancien environnement sera restauré une fois ENDLOCAL émis.

Lorsque tous les traitements de script sont terminés et que vous revenez dans un contexte de ligne de commande, un ENDLOCAL implicite est émis pour chaque SETLOCAL actif. Il n’est pas nécessaire de publier explicitement ENDLOCAL.

De plus, si votre script (ou routine) est appelé, alors, lorsque l’appel est terminé, il y a un ENDLOCAL implicite pour chaque SETLOCAL actif émis dans la routine CALLed. Pas besoin de mettre ENDLOCAL à la fin d’une routine (même si cela ne fait pas mal)

Par exemple

@echo off set var=pre-CALL value echo var=%var% call :test echo var=%var% exit /b :test setlocal set var=within CALL value echo var=%var% exit /b 

sortie:

 var=pre-CALL value var=within CALL value var=pre-CALL value 

ENDLOCAL dans une routine CALLed n’annulera jamais un SETLOCAL émis avant l’appel. Par exemple.

 @echo off setlocal set var=VALUE 1 setlocal set var=VALUE 2 echo before call: var=%var% call :test echo after call: var=%var% endlocal echo after endlocal: var=%var% exit /b :test setlocal set var=VALUE 3 echo within local CALL context: var=%var% endlocal echo within CALL after 1st endlocal: var=%var% endlocal echo within CALL cannot endlocal to before CALL state: var=%var% exit /b 

Résultat:

 before call: var=VALUE 2 within local CALL context: var=VALUE 3 within CALL after 1st endlocal: var=VALUE 2 within CALL cannot endlocal to before CALL state: var=VALUE 2 after call: var=VALUE 2 after endlocal: var=VALUE 1