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

标签 windows batch-file cmd delayedvariableexpansion

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

最佳答案

您发现了 bbb(批量初学者错误),但不是变量为空,而是扩展没有按预期工作。

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

EnableDelayedExpansion 添加了一个额外的语法来扩展变量:!var!
扩展百分比 %var% 仍然可用,并且不会因延迟扩展而改变。
!var! 的延迟扩展是在执行表达式时完成的,尽管 %var% 将被扩展在解析(完整的代码块)时,在执行 block 中的任何命令之前。

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

关于windows - 为什么我的设置命令没有存储任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347038/

相关文章:

linux - Bash脚本用动态名称重命名文件夹并替换它里面的字符串

c++ - windows 8 IShellIconOverlayIdentifier 外壳扩展无法正常工作

linux - 在 Windows 上托管 docker 虚拟机时,是否可以配置 docker-nvidia 以与 tensorflow-serving 一起使用?

c++ - 如何从注册表中读取REG_BINARY值的关联值?

windows - 如何从Windows批处理脚本中的文件路径获取父目录名称?

windows - 处理 nmake 错误级别/返回码

windows - CMD: Bat to Exe Converter - 临时目录问题

Windows:获取正在运行的进程的版本

batch-file - 将 Curl 输出写入批处理文件变量

cmd - 如何仅使用cmd更改默认的chocolatey安装目录?