变量中的引号 - 比较和替换
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 语句将失败,因为变量包含引号。
我有两个问题之一:
- if 语句失败(发生错误)。
- 替换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
变量。 _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%
变量命令行。
我这样定义变量:
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 语句将失败,因为变量包含引号。
我有两个问题之一:
- if 语句失败(发生错误)。
- 替换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
变量。 _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%
变量命令行。