我想创建一个批处理文件,这将使 me happy 在目录中包含所有文件名的长字符串。
所以我有一个目录:
-docA.pdf
-docB.pdf
-docC.pdf
我想要一个像这样的字符串:
docA.pdf docB.pdf docC.pdf
简而言之: http://bit.ly/u1eAHO
很长的路: 我写了一个剧本
@echo off
pushd "%~dp0"
set "FILE_LIST=pre_"
FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
IF NOT %%i==%~nx0 (
echo %%i
set "FILE_LIST=%FILE_LIST%%%i"
echo %FILE_LIST%
)
)
echo %FILE_LIST%
pause
获得此输出:
docA.pdf
pre_
docB.pdf
pre_
docC.pdf
pre_
pre_docC.pdf
为什么呢?我怎样才能得到好的?
答案 0 :(得分:2)
这是批处理文件的一个众所周知的问题。简短的回答是批处理文件是通过在执行它们之前扩展一行中的变量来执行的。对于多行块(括号中的内容),将所有非循环变量展开一次,然后运行循环。你的循环体本质上是:
IF NOT %%i==%~nx0 (
echo %%i
set "FILE_LIST=pre_%%i"
echo pre_
)
他们在整个过程中(NT4 IIRC)添加了一个名为delayed expansion的功能,您可以在注册表中或通过SETLOCAL
语句启用它。将脚本更改为:
@echo off
setlocal EnableDelayedExpansion EnableExtensions
pushd "%~dp0"
FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
IF NOT %%i==%~nx0 (
set "FILE_LIST=!FILE_LIST!%%i"
)
)
echo %FILE_LIST%
endlocal
pause
它应该有效。我要在星期一之前离开我的Windows机箱,但这应该足够接近了。如果遇到任何问题,请在命令提示符下键入FOR /?
和SETLOCAL /?
,阅读显示的帮助。