DOS批处理:为什么我的设置命令导致没有得到存储?

我想稍后访问TOMCAT_VER的值,但它显示为空string。

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%" ) 

为了进一步debugging,我在下面的地方插入了一个echo语句,但是它似乎不起作用。 回声closures禁用,我可以看到显示这些variables设置的声明,但我似乎无法打印出来。

你找到了bbb(批量初学者bug),但不是变量是空的,这是扩展不能按预期工作。

在执行代码之前,分析一行或一个完整的括号块,完成百分比展开。
但是为了解决这个问题,你可以使用延迟扩展 ,这在解析时不扩展,只是在执行时扩展。

 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!" )