Я видел SETLOCAL ENABLEDELAYEDEXPANSION
и SETLOCAL DISABLEDELAYEDEXPANSION
во многих пакетных файлах, но что делают на самом деле команды?
Включить и отключить Delayed Expansion, что он делает?
Ответ 1
enabledelayeexpansion
инструктирует cmd
распознавать синтаксис !var!
, который обращается к значению current
var
. disabledelayedexpansion
отключает этот объект, поэтому !var!
становится просто тем, что в качестве строки.
В блочном выражении (a parenthesised series of statements)
выполняется синтаксический анализ целого и , затем. Любой %var%
внутри блока будет заменен значением переменной в момент анализа блока - до того, как будет выполнен блок - то же самое относится к FOR ... DO (block)
.
С помощью !var!
вместо %var%
открывается измененное значение var
.
Ответ 2
Скопировано из Как вы используете SETLOCAL в пакетном файле? (как указал dbenham в своем первом комментарии).
Предположим, что этот код:
If "%getOption%" equ "yes" (
set /P option=Enter option:
echo Option read: %option%
)
Предыдущий код НЕ будет работать, потому что значение% option% заменяется только один раз, когда команда IF обрабатывается (до ее выполнения). Вам нужно "задержать" расширение переменной до тех пор, пока команда SET/P не изменит значение переменной:
setlocal EnableDelayedExpansion
If "%getOption%" equ "yes" (
set /P option=Enter option:
echo Option read: !option!
)
Проверьте это:
set var=Before
set var=After & echo Normal: %var% Delayed: !var!
Выход: Normal: Before Delayed: After