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

时间:2017-04-04 08:29:43

标签: windows batch-file compare substitution

我将变量定义为:

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

请注意,我将%CATALINA_HOME%\ conf \ logback.xml包装在双引号中,因为path可能包含空格。在执行步骤中,此变量将替换为java程序。

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

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

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

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

我有两个问题之一:

  1. 如果语句失败(发生错误)。
  2. 在没有引号时替换java程序有问题(空格是分隔符)。
  3. 如何更改变量定义以使路径可以包含空格,if语句可以正常工作?

2 个答案:

答案 0 :(得分:1)

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

应适当设置logging_manager,以便您不必“引用文件名”

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:是未使用的驱动器。

答案 1 :(得分:1)

注意:未经过测试,但在阅读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变量。 _RUNJAVA初始化setclasspath.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%变量