далее к ответу Дэйвбенхема
выполнение echo% var% внутри блока, такого как FOR или IF, работает некорректно. Переменные% var% просто не обновляются. Вы должны использовать!вар! и получить!вар! чтобы работать, вы должны установить локальный EnableDelayedExpansion
объяснение этого существует в справке cmd, хотя не очевидно, какая справка команды объясняет это! Это set /?
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, которое является составным оператором. Таким образом, 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
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
Вы также можете проверить нотацию из командной строки с помощью
cmd /e:on
начиная со значения по умолчанию, cmd /v:off, затем переходя к cmd /v:on. Большинство используют cmd .v:off даже для экспертов (возможно, потому что другие вещи могут интерпретироваться по-разному), так что я просто использую это, чтобы показать Вы, что вы можете попробовать!вар! обозначения в CMD с ним.
C:\>set a=5
C:\>echo %a%
5
C:\>echo !a!
!a!
C:\>cmd /v:on
Microsoft Wind
Copyright (c)
C:\>echo !a!
5
C:\>
Кстати, если у вас был cmd /v:on или в командном файле, EnableDelayedExpansion включен, то, как показывает Дейв, вы должны знать! будучи специальным персонажем, так что у вас будет проблема, если! был в пределах% var%. Так что это может быть причиной того, что люди не просто включают режим на полный рабочий день, могут быть и другие причины.