看一个例子,在Windows下使用批处理来将一堆jar文件合成一个长串,作为Java 运行命令的classpath的值。
1、应用场景
将TOMCAT lib目录下所有的jar文件合成一个长串。
2、错误的写法
(1)示例
首先想到的做法是这样的:
@echo off
set var=
for /R D:\apache-tomcat-7.0.67\lib %%m in (*.jar) do (
set var=%var%;%%m
)
echo %var%
pause
但最后,执行后,你会发现结果并非你所想象:
E:\Work\test>test_delayed_expansion1.bat
;D:\apache-tomcat-7.0.67\lib\websocket-api.jar
循环过程并没有将所有的jar文件合在一起,只是加入了一个文件。
(2)原因分析
原因是什么呢?和批处理文件的解释机制有关。下面是延迟环境变量的由来恰好解释了这种现象发生的原因:
cmd在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输的命令格式是否正确。如果我们要在命令中引用一些变量,那么我们需要在变量的两边各加一个%号,使cmd在解释我们的命令的时候能够识别这个变量,例如%name%。当cmd读取我们的命令进行格式匹配的时候,就会发现name这个字符串两边各加了一个%,就不会把它当作普通字符串处理,而是把它当作一个变量处理,变量名就叫做name。然后cmd就会查找这个变量的值,用该值替换掉%name%,最后执行这个替换好的命令。这个替换的过程就叫做环境变量扩展。
3、正确的写法
所以,正确的做法是使用延迟环境变量扩展,使用延迟环境变量的前提条件是使用语句:
setlocal enabledlayedexpansion
其次,获取变量值时不使用%var%,而是使用!var!。
下面是能正确拼合jar文件的脚本代码:
@echo off
setlocal enabledelayedexpansion
set var=
for /R D:\apache-tomcat-7.0.67\lib %%m in (*.jar) do (
set var=!var!;%%m
)
echo !var!
pause
注意:
变量名后不能使用空格,否则,变量名可能获取不正确,变量值若非必要,也不要包含空格。