【问题标题】:How can I create a list of files to pass to an executable using a DOS batch file?如何使用 DOS 批处理文件创建要传递给可执行文件的文件列表?
【发布时间】:2011-12-07 14:29:27
【问题描述】:

我想获取目录中所有 .dll 和 .exe 的(分号分隔的)列表作为变量,以作为参数传递给可执行文件。我已经尝试了一些东西,但它从来没有像预期的那样工作。我已经完成了一部分 - 以下打印出我所追求的文件列表:

CLS
@ECHO OFF
SET INPUT_FILES=
for /f %%x in ('dir /b E:\Builds\MyProgram\Release\*.exe E:\Builds\MyProgram\Release\*.dll') do ECHO %%x

...但是下一步不太正确,我正在努力找出我做错了什么:

CLS
@ECHO OFF
SET INPUT_FILES=
for /f %%x in ('dir /b E:\Builds\MyProgram\Release\*.exe E:\Builds\MyProgram\Release\*.dll') do IF DEFINED INPUT_FILES SET INPUT_FILES=INPUT_FILES;%%X ELSE SET INPUT_FILES=%%X
ECHO %INPUT_FILES%

如果我可以在这里解决问题,我会将%INPUT_FILES% 作为输入传递给另一个可执行文件。

编辑

如果我执行以下命令,我可以更新 INPUT_FILES 变量:

IF "%INPUT_FILES%"=="" (SET INPUT_FILES=Test1) ELSE (SET INPUT_FILES=Test1a)
IF "%INPUT_FILES%"=="" (SET INPUT_FILES=Test2) ELSE (SET INPUT_FILES=%INPUT_FILES%;Test2a)
ECHO %INPUT_FILES%

..输出:

Test1;Test2a

..但如果我尝试将其添加到 FOR 循环中,我什么也得不到:

CLS
REM @ECHO OFF
SET INPUT_FILES=
for /f %%X in ('dir /b E:\Builds\MyProgram\Release\*.exe E:\Builds\MyProgram\Release\*.dll') do (IF "%INPUT_FILES%"=="" (SET INPUT_FILES=%%X) ELSE (SET INPUT_FILES=%INPUT_FILES%;%%X))
ECHO %INPUT_FILES%

【问题讨论】:

    标签: if-statement for-loop batch-file dos


    【解决方案1】:

    问题是百分比变量的扩展。
    这些在解析时被扩展(也适用于块)。

    最好使用延迟扩展,语法几乎相同,但使用!variable! 而不是%variable%
    区别在于:扩展发生在执行时而不是解析时。

    @ECHO OFF
    CLS
    setlocal EnableDelayedExpansion
    SET "INPUT_FILES="
    for /f %%X in ('dir /b E:\Builds\*.exe E:\Builds\*.dll') do (
      IF "!INPUT_FILES!"=="" (
        SET "INPUT_FILES=%%X"
      ) ELSE (
        SET "INPUT_FILES=!INPUT_FILES!;%%X"
      )
    )
    ECHO !INPUT_FILES!
    

    【讨论】:

    • 太棒了 - 我之前在示例中看到过感叹号,但没有 setlocal EnableDelayedExpansion 行,因此它们没有正确评估。
    • 你可以避免IF命令,如果只是添加每个名称后跟一个分号,并删除最后一个分号:for /f %%X in ('dir ...') do SET "INPUT_FILES=!INPUT_FILES!%%X;"SET INPUT_FILES=!INPUT_FILES:~0,-1!
    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多