为什么我的设置命令没有存储任何内容?

23

我试图在之后访问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语句,但似乎没有起作用。在关闭echo的情况下,我可以看到这些变量被设置了,并且我似乎无法打印它们。

1个回答

38

你找到了bbb(批处理初学者bug),但问题并不是变量为空,而是扩展没有按预期工作。

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

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

嗯,它似乎只是打印了字面上的“!TOMCAT_VER!”你知道这是在哪个版本的Windows中添加的吗? - gregturn
啊,看起来在另一篇博客文章中提到,enabledeplayedexpansion只适用于XP及以上版本。对于XP系统,必须在注册表中进行设置。需要确定我们是否需要支持XP系统。 - gregturn
5
它在XP中也可以工作,但是你拼错了。应该是"delayed"而不是"deplayed"。 - jeb
也许你可以强调一下延迟扩展需要使用感叹号来进行变量扩展。仅仅设置EnableDelayedExclamation是不够的。花了我点时间才发现这个问题。;-) - Twonky
@Twonky,我为!var! vs %var%添加了一个解释。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接