Или для получения дополнительной информации см. Это объяснение «отложенного расширения переменной среды» из SET /?
справочного текста:
Наконец, поддержка отложенного расширения переменной среды была
добавлено. Эта поддержка всегда отключена по умолчанию, но может быть
включается / отключается с помощью командной строки /V
и переключается на CMD.EXE. Смотри CMD /?
Задержка расширения переменной среды полезна для обхода
ограничения текущего расширения, которое происходит, когда линия
текст читается, а не когда он выполняется. Следующий пример
демонстрирует проблему с немедленным расширением переменной:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
никогда не будет отображать сообщение, так как %VAR%
в обоих операторах IF
подставляется при чтении первого оператора IF, так как он логически
включает в себя тело IF, которое является составным оператором. Итак, ЕСЛИ
внутри составного оператора действительно сравнивает «до» с
«после», которое никогда не будет равным. Аналогично, следующий пример
не будет работать должным образом:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
в том смысле, что он НЕ будет создавать список файлов в текущем каталоге,
но вместо этого просто установите переменную LIST для последнего найденного файла.
Опять же, это потому, что% LIST% раскрывается только один раз, когда FOR
оператор читается, и в это время переменная LIST пуста. Итак
фактический цикл FOR, который мы выполняем:
for %i in (*) do set LIST= %i
, который просто устанавливает LIST для последнего найденного файла.
Задержка расширения переменной среды позволяет использовать другой
символ (восклицательный знак), чтобы раскрыть переменные среды в
время исполнения. Если включено замедленное расширение переменной, выше
примеры могут быть написаны следующим образом, чтобы работать как задумано:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
Опять же, это потому, что% LIST% раскрывается только один раз, когда FOR
оператор читается, и в это время переменная LIST пуста. Итак
фактический цикл FOR, который мы выполняем:
for %i in (*) do set LIST= %i
, который просто устанавливает LIST для последнего найденного файла.
Задержка расширения переменной среды позволяет использовать другой
символ (восклицательный знак), чтобы раскрыть переменные среды в
время исполнения. Если включено замедленное расширение переменной, выше
Примеры могут быть написаны следующим образом, чтобы работать как задумано:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%