Windows批处理或命令行循环变量不能设值--采用延迟环境变量扩展

    看一个例子,在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

注意:

变量名后不能使用空格,否则,变量名可能获取不正确,变量值若非必要,也不要包含空格。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值