Я понимаю, что ваш вопрос в основном касается команды SETLOCAL
и ее эффектов, независимо от используемой опции (1001) * (100) *.
Мой краткий ответ: Нет , при условии, что переменные не существовали до входа в область действия SETLOCAL
.
Мой более длинный ответ следующий:
Все изменения, внесенные в переменную в области действия SETLOCAL
, отбрасываются при выходе из области действия (то есть при достижении ENDLOCAL
). Это включает в себя:
определение ранее неопределенной переменной:
@ECHO OFF
<nul SET /P q=1.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
SETLOCAL
SET ttt=
<nul SET /P q=2.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
ENDLOCAL
<nul SET /P q=3.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
Это выводит:
1.undefined
2.defined
3.undefined
отмена определения ранее определенной переменной:
@ECHO OFF
SET ttt=1
<nul SET /P q=1.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
SETLOCAL
SET ttt=
<nul SET /P q=2.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
ENDLOCAL
<nul SET /P q=3.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
Вывод:
1.defined
2.undefined
3.defined
изменение значения переменной:
@ECHO OFF
SET ttt=1
ECHO 1.ttt=%ttt%
SETLOCAL
SET ttt=2
ECHO 2.ttt=%ttt%
ENDLOCAL
ECHO 3.ttt=%ttt%
И это дает следующий вывод:
1.ttt=1
2.ttt=2
3.ttt=1
Как я сказал в начале, вышеизложенное относится к SETLOCAL
независимо от того, используете ли вы его с дополнительными опциями или нет.
В заключение я хотел бы сказать, что можно сохранить результат, вычисленный в пределах SETLOCAL
, для использования после ENDLOCAL
. Вот небольшой трюк, который делает это возможным:
…
ENDLOCAL & SET var=%var%
…
Во время синтаксического анализа этой строки команда SETLOCAL
все еще действует, поэтому %var%
оценивается в значение, которое вы сохранили в var
в последнее время. Когда строка выполняется , переменная var
теряет свое значение сразу после ENDLOCAL
, но команда SET уже содержит свое значение, только что подставленное, поэтому var
получает его обратно, к всеобщему удовлетворению.
Согласно комментарию @Jeremy Murray, вы также можете получить доступ к измененному значению после ENDLOCAL
, если вы включите ENDLOCAL
и команду (команды) чтения переменной в одном блоке, заключенном в скобки:
…
(
ENDLOCAL
SET var=%var%
<i>anything else</i>
)
…
Эффект будет таким же, потому что команды в квадратных скобках и анализируются, и выполняются как одно целое: сначала они все анализируются, , а затем они все выполняются.