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

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

看一个例子,在Windows下使用批处理来将一堆jar文件合成一个长串,作为Java 运行命令的classpath的值。1、场景:将TOMCAT lib目录下所有的jar文件合成一个长串。2、错误的写法(1)示例首先想到的做法是这样的:@echo offset var=for /R D:\apache-tomcat-7.0.67\lib %%m in (*.j
例如:想利用bat脚本查询出Git_commit号, 赋值 变量 ,下面的pipeline语句用到此 变量 ,通过直接 赋值 的方式,下一条语句是无法获取到 变量 值的。 此种写法: //从项目readme中读取Git_Commit号 Git_Commit =bat label: '', script: 'compile_scripts\\git_commit.bat %svn_project% %svn_branch%' //编译源码,其中Git_commit 获取不到值
1、bat 批处理 命令执行机制:bat命令是按照一行一行执行.如for,if等命令,即使我们用括号也是按照一行来执行。因此,在用for 循环 的时候,总是得不到想要的结果。“ 那是因为 变量 赋值 没有成功,而是一个空值。 解决方法:利用 变量 延迟 扩展 即可 。即 setlocal enabledelayedexpansion 2、用了 变量 延迟 ,还是不行,可能是 变量 的写法不正确 (1) 通常 变量 我们的格式 ...
延迟 环境变量 在bat里是重中之重,虽然前面说过,熟练应用for才算会写 批处理 ,但如果不懂 延迟 环境变量 的话,那么你就只能写出简单的 批处理 ,而for语句也 不能 发挥最大的作用。 延迟 环境变量 cmd 下默认是关闭的,如果要使用 延迟 环境变量 ,可以用以下两种方法开启: 1. cmd 下开启/关闭 延迟 环境变量 cmd 下开启或 延迟 环境变量 用/v
基本上很少使用 批处理 文件,一是因为对它了解的少,二是似乎没有完整的资料说明。 昨天,又有同事说要弄个小工具,对目录改名,首先想到了 批处理 ,然后上网上搜索,找到一段代码,拿过来少做修改,结果发现老是有问题,没办法,花了一天的时间,仔细研究了一下有关的问题,最后终于问题解决了 一、我的任务目标 先说明我的目标,然后为了达成这个目标,中间遇到了哪些困难,然后再逐个问题分析 在一个目录中有很多子目...
需求描述: 循环 读取一个文件夹中每个文件的绝对地址,打印文件绝对路径,并使bianli。 解决方法:开启 变量 延迟 ,并且 变量 要用一对叹号“!!”括起来。 @echo off setlocal enabledelayedexpansion set /a v=0 for %%i in (d:\MyProject\pythonProjects\data\*.txt) do ( echo %%i
如果你已经配置了Redis 环境变量 ,但仍然显示'redis-cli'不是内部或外部命令,则可能是因为你的 环境变量 配置不正确或者还没有重启 命令行 窗口。你可以尝试以下步骤来解决这个问题: 1. 确认 环境变量 配置正确:打开 命令行 窗口,输入“redis-cli -v”命令,如果显示了Redis的版本信息,则说明 环境变量 配置正确;如果没有显示,则需要检查 环境变量 配置是否正确。 2. 重启 命令行 窗口:在安装完Redis后,需要重新启动 命令行 窗口才能使 环境变量 生效。 3. 尝试手动添加 环境变量 :如果以上两个方法都无法解决问题,可以尝试手动添加 环境变量 。打开 命令行 窗口,输入“set PATH=%PATH%;redis安装路径”命令,其中“redis安装路径”为Redis的安装路径。例如,如果Redis安装在C盘的Redis目录下,则可以输入“set PATH=%PATH%;C:\Redis”命令。 如果以上方法都无法解决问题,则可能是Redis安装出了问题,需要重新安装Redis。
MySQL workbench问题:SSL connection error: SSL is required but the server doesn‘t support it. Katherine999899: 嘎嘎有效,就喜欢这样的 表情包 试了几个别人的方案都没有那玩意儿 (什么Require选项,改为1....),纯粹扯淡。