Почему мои заданные команды ничего не сохраняют?

Позже я пытаюсь получить доступ к значению TOMCAT_VER, но оно отображается как пустая строка.

if exist "%_REALPATH%\tomcat-%TOMCAT_VER2%" (
  set CATALINA_HOME=%_REALPATH%\tomcat-%TOMCAT_VER2%
  set TOMCAT_VER=%TOMCAT_VER2%
  echo "%TOMCAT_VER%"
) else if exist "%TOMCAT_VER2%" (
  set CATALINA_HOME="%TOMCAT_VER2%"
  set TOMCAT_VER="%TOMCAT_VER2%"
  echo "%TOMCAT_VER%"
)

Для дальнейшей отладки я вставил оператор echo прямо под тем местом, где он был установлен, но, похоже, он не работает. Когда эхо отключено, я вижу оператор, показывающий, что эти переменные устанавливаются, но все же я не могу их распечатать.


person gregturn    schedule 15.01.2013    source источник


Ответы (1)


Вы обнаружили bbb (ошибка для начинающих), но переменная не пуста, это расширение работает не так, как ожидалось.

Процентное расширение выполняется, когда строка или весь блок круглых скобок анализируется до того, как код будет выполнен.
Но для решения этой проблемы вы можете использовать отложенное расширение, это не расширяется при синтаксическом анализе время, он расширяется только во время выполнения.

EnableDelayedExpansion добавляет дополнительный синтаксис для раскрытия переменных: !var!.
Процентное расширение %var% по-прежнему доступно и не изменяется из-за отложенного раскрытия.
Задержанное раскрытие !var! выполнено когда выражение выполняется, несмотря на %var%, оно будет развернуто в момент синтаксического анализа (полные блоки кода) перед выполнением любой из команд в блоках.

setlocal EnableDelayedExpansion

if exist "!_REALPATH!\tomcat-!TOMCAT_VER2!" (
  set "CATALINA_HOME=!_REALPATH!\tomcat-!TOMCAT_VER2!"
  set "TOMCAT_VER=!TOMCAT_VER2!"
  echo !TOMCAT_VER!
) else if exist "!TOMCAT_VER2!" (
  set "CATALINA_HOME=!TOMCAT_VER2!"
  set "TOMCAT_VER=!TOMCAT_VER2!"
  echo !TOMCAT_VER!
)
person jeb    schedule 15.01.2013
comment
Хм. Это только кажется, буквально печатает! TOMCAT_VER !. Вы случайно не знаете, какая версия окон была добавлена? - person gregturn; 16.01.2013
comment
Ахх, в другой записи блога говорится, что enabledeplayedexpansion доступен только после XP. Для XP его необходимо установить в реестре. Нужно посмотреть, должны ли мы поддерживать XP или нет. - person gregturn; 16.01.2013
comment
Нет, это работает и в XP, но вы пишете неправильно. ... разыграли ... вместо ... отложили ... - person jeb; 16.01.2013
comment
Возможно, вы могли бы подчеркнуть, что отложенное раскрытие требует восклицательного знака для расширения переменной. Просто установить EnableDelayedExclamation недостаточно. Мне потребовалось время, чтобы узнать. ;-) - person Twonky; 16.01.2020
comment
@Twonky Я добавил объяснение для !var! vs %var% - person jeb; 16.01.2020