17

我稍后尝试访问 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 语句,但它似乎不起作用。禁用回显后,我可以看到显示这些变量的语句已设置,但我似乎无法将它们打印出来。

4

1 回答 1

30

您找到了 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!
)
于 2013-01-15T21:19:35.877 回答