将文件名合并为字符串的批处理文件不起作用

时间:2011-11-20 02:28:54

标签: file batch-file concatenation directory

我想创建一个批处理文件,这将使 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

为什么呢?我怎样才能得到好的?

1 个答案:

答案 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 /?,阅读显示的帮助。