如何使用DOS批处理文件创建要传递给可执行文件的文件列表?

时间:2011-12-07 14:29:27

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

我希望将目录中所有.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%

1 个答案:

答案 0 :(得分:3)

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

最好使用延迟扩展,语法几乎相同,但使用!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!