我正在尝试做一个批处理,它搜索所有包含log4j-core的文件,并将所有路径存储到一个文本文件中,这样我就可以将一个新的更新文件复制到找到的所有路径中。这是我目前所拥有的。
SetLocal EnableDelayedExpansion
cd \
ECHO SEARCHING FOR log4j-core THIS MAY TAKE SOME TIME...
dir /s /b log4j-core*.jar >%tmp%\path.txt
echo delims
for /f "delims=" %%a in (%tmp%\path.txt) do (set path=%%~dpa && copy /b /y "c:\Temp\Script\patch.jar" "%path%\log4j-core-2.17.2.jar")
pause
1条答案
按热度按时间xyhw6mcr1#
虽然您实际上并没有提出问题,但您的程式码有问题。
默认情况下,
%temp%
包含空格,因此无论在何处使用%tmp%\path.txt
,都需要将其引起来,因此:"%tmp%\path.txt"
这意味着您的
for /f
中需要"usebackq delims="
,否则for
将分析 * 字符串 *"%tmp%\path.txt"
,而不是预期的 * 文件 *"%tmp%\path.txt"
。下一个问题是
set
语句。批处理对普通字符串SET
语句中的空格敏感。SET FLAG = N
将名为“FLAGSpace”的变量设置为值“SpaceN”。使用set "var1=value"
设置STRING值-这避免了尾部空格引起的问题。不要使用
path
作为变量名--它是批处理中的保留字,意味着搜索目录以查找不在当前目录中的可执行文件的顺序。接下来是
delayedexpansion
的小问题。您正在调用delayedexpansion
,但没有使用它。请阅读Stephan's DELAYEDEXPANSION link一旦我们解决了所有这些问题,我们就可以简化了。
无论您使用什么变量名,
%~dp?
都会返回包含终止反斜杠的路径名,因此您不需要在copy
的目标文件名中再次插入它。你不需要使用中间变量--只有在你操作字符串的时候。
"%%~dpaog4j-core-2.17.2.jar"
对于你的复制目标来说已经足够了,记住%%~dpa
将被解析为一个带有终止反斜杠的字符串。echo
语句只会显示字符串delims
,看起来毫无意义。这可能是学术性的,但是
dir
命令应该包含/a-d
,以排除任何与该模式匹配的目录名,尽管这可能不太可能。我还建议
where /r \ log4j-core*.jar
应该产生与dir
命令相同的结果。注意,where /r
有两个参数-一个目录名和一个要匹配的文件名模式。如果文件名模式没有扩展名,它需要一个终端.
,否则假定为.*
。最后,
for /f
可以处理由命令产生的列表,参见for /?
的提示符或SO上的数千个例子。所以,总而言之,您的代码可以简化为
在应用于真实的数据之前,始终根据测试目录进行验证。
明智的做法是将
echo
命令简化为copy
进行验证我再说一遍,在应用于真实的数据之前,总是要对测试目录进行验证。