变量中的报价 - 比较和替换



我定义变量如下:

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

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

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

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

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

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

我有以下两个问题之一:

  1. 如果语句失败(发生错误)。
  2. 没有引号时替代Java程序有问题(空格是分隔符)。

如何更改变量定义,以便路径可能包含空格以及语句是否可以正常工作?

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

如果从批处理文件运行此文件,则可以使用

set LOGGING_MANAGER_FILE="%CATALINA_HOME%conflogback.xml"
set LOGGING_MANAGER=-Djuli-logback.configurationFile=file:%%LOGGING_MANAGER_FILE%%
set _RUNJAVA=CALL "%JRE_HOME%binjava.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初始化(来自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%binjava.exe"

默认值为"%JRE_HOME%binjava.exe",我们只需在之前添加一个CALL批处理命令即可强制批处理解析器的第二次迭代,这将在最终命令行中扩展带引号的%LOGGING_MANAGER_FILE%变量。

for %%a in ("%CATALINA_HOME%conflogback.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:conflogback.xml"

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

相关内容

  • 没有找到相关文章

最新更新