【问题标题】:Batch file to merge file names into a string doesn't work将文件名合并为字符串的批处理文件不起作用
【发布时间】:2012-01-02 04:42:29
【问题描述】:

我想制作一个批处理文件,这会让我很开心目录中所有文件名的长字符串。

所以我有一个目录:

-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

为什么?怎样才能买到好的?

【问题讨论】:

    标签: file batch-file concatenation directory


    【解决方案1】:

    这是一个众所周知的批处理文件问题。简短的回答是批处理文件是通过在执行它们之前扩展一行中的变量来执行的。对于多行块(括号中的内容),将所有非循环变量展开一次,然后运行循环。你的循环体本质上是:

    IF NOT %%i==%~nx0 (
        echo %%i
        set "FILE_LIST=pre_%%i"
        echo pre_
    )
    

    他们沿途添加了一个名为delayed expansion 的功能(NT4 IIRC),您可以在注册表中或通过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 /? 显示的帮助。

    【讨论】:

    • 非常感谢您的评论。我认为这将解决问题。但是我的上帝,他们应该改变它很长一段时间。它并不简单,但我明白了。我会尽快回到这个项目进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多