变量中的引号 - 比较和替换

Quotes in variable - comparison and substitution

我这样定义变量:

set LOGGING_MANAGER=-Djuli-logback.configurationFile=file:"%CATALINA_HOME%\conf\logback.xml"

注意,我用双引号将 %CATALINA_HOME%\conf\logback.xml 括起来,因为路径可能包含 spaces。在执行步骤中,这个变量将替换为 java 程序。

Example of substitution:
path_to_jre/java.exe %LOGGING_MANAGER%

我无法更改的下一个代码:(它来自 Apache Tomcat 的 catalina.bat 文件)

if not "%LOGGING_MANAGER%" == "" ...

这个 if 语句将失败,因为变量包含引号。

我有两个问题之一:

  1. if 语句失败(发生错误)。
  2. 替换java程序时没有引号有问题(space是定界符)。

如何更改变量定义以使路径可以包含 spaces 并且 if 语句可以正常工作?

for %%a in ("%CATALINA_HOME%\conf\logback.xml") do set "LOGGING_MANAGER=-Djuli-logback.configurationFile=file:%%~sa"

应该适当地设置 logging_manager 这样你就不必 "quote the filename"


for %%a in ("%CATALINA_HOME%\conf") do net use o: "\%userdomain%\sharenameforthedrivewherecatalina_homeisresident%%~pa"

set "LOGGING_MANAGER=-Djuli-logback.configurationFile=file:o:\conf\logback.xml"

也可能有效 - 如果您知道 catalina_home 所在驱动器的共享名称并假设 o: 是一个未使用的驱动器。

注意:未测试,但阅读catalina.bat后,这是一种处理问题的方法。

如果你是运行这个批处理文件,你可以使用

set LOGGING_MANAGER_FILE="%CATALINA_HOME%\conf\logback.xml"
set LOGGING_MANAGER=-Djuli-logback.configurationFile=file:%%LOGGING_MANAGER_FILE%%
set _RUNJAVA=CALL "%JRE_HOME%\bin\java.exe"

call catalina.bat

它的作用是

  • 将带引号的文件名保存在单独的变量中
  • 使用前一个变量的转义引用设置 LOGGING_MANAGER 变量。由于不会展开,所以LOGGING_MANAGER变量的最终内容为-Djuli-logback.configurationFile=file:%LOGGING_MANAGER_FILE%

这样,在执行if "%LOGGING_MANAGER%"=="" ...时,就不会出现任何有问题的引用了。

现在是 set _RUNJAVA 行。在 catalina.bat 中,_RUNJAVA 的内容用于初始化将启动服务器的 _EXECJAVA 变量。 _RUNJAVAsetclasspath.bat IF 中初始化它还没有被用户初始化(代码来自 setclasspath.bat ).

rem Don't override _RUNJAVA if the user has set it previously
if not "%_RUNJAVA%" == "" goto gotRunJava
rem Set standard command for invoking Java.
rem Also note the quoting as JRE_HOME may contain spaces.
set _RUNJAVA="%JRE_HOME%\bin\java.exe"

默认值为"%JRE_HOME%\bin\java.exe",我们只是在之前添加一个CALL批处理命令来强制批处理解析器的第二次迭代,这将在最终扩展引用的%LOGGING_MANAGER_FILE%变量命令行。