Как очистить переменные после запуска каждой партии script?

Кажется, что, поскольку я использую SET для объявления своих переменных в пакетном script, если я запускаю его несколько раз в cmd, значение переменной сохраняется, если я явно не укажу reset их.

Нужно ли мне использовать setlocal и endlocal, чтобы убедиться, что переменные из одного запуска не переходят к другому, не закрывая CMD?

Ответ 1

Да, вы должны использовать SETLOCAL. Это позволит локализовать любые изменения, так что старая среда будет восстановлена ​​после выпуска ENDLOCAL.

Когда обработка script завершается, и вы возвращаетесь в контекст командной строки, для каждого активного SETLOCAL выдается неявный ENDLOCAL. Нет необходимости явно выдавать ENDLOCAL.

Кроме того, если ваш script (или подпрограмма) является CALLed, тогда, когда CALL завершается, существует неявный ENDLOCAL для каждого активного SETLOCAL, который был выпущен в подпрограмме CALLed. Не нужно вводить ENDLOCAL в конце процедуры (хотя это не больно)

Например

@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

выход:

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

ENDLOCAL в процедуре CALLed никогда не откат SETLOCAL, который был выпущен до CALL. Например.

@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

Результат:

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