2017-04-04 122 views
0

我定义变量,如:行情在变量 - 比较和替代

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

注意,我包裹%CATALINA_HOME%\在双引号CONF \ logback.xml,因为路径可能包含空格。在执行步骤中,这个变量将替代java程序。

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

下一个代码,我不能改变:(从catalina.bat中文件的距离的Apache Tomcat)

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

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

在那里,我有2个问题之一:

  1. if语句失败(出错)。
  2. 没有引号时,替换为java程序有问题(空格是分隔符)。

如何更改变量定义,使路径可能包含空格,如果语句正常工作?

+4

'如果定义LOGGING_MANAGER'? –

+0

我不能更改该代码:( 我想更改变量defenition – learp

+0

@MCND忘记提及你 – learp

回答

1

note:未经测试,但在阅读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如果它尚未被用户初始化(代码从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%变量的第二次迭代。

+0

非常感谢你!我发现了EnableDelayedExpansion参数,可能它会有帮助,而且会很容易吗?我稍后尝试一下。 – learp

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

+0

我认为这个解决方案的两个问题(很好的一点,好点)可能是:** a **)没有短名称(可以配置)** b **) OS决定某个中间文件夹不需要生成短名称,但它包含一个特殊字符。 –

+0

@Magoo感谢您的答案,但它不工作:(行为就像我将定义的变量设置为LOGGING_MANAGER = ...%CATALINA_HOME%\ conf \ logback.xml(不含引号) – learp

+0

@Magoo在您的定义打印后回显 - Djuli-logback.configurationFile = file:C:\ xyz \ Tomcat \ tomcat \ conf \ logback.xml(不含引号或任何内容) – learp