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

If statement 如何使用DOS批处理文件创建要传递给可执行文件的文件列表?,if-statement,for-loop,batch-file,dos,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

我想获得目录中所有.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\u 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%

问题在于百分比变量的扩展。
它们在解析时展开(也用于块)

最好使用延迟扩展,语法几乎相同,但使用
!变数而不是
%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
行,因此它们的计算结果不正确。如果只在每个名称后面加一个分号,并删除结尾处的最后一个分号,
for/f%%X in('dir…')do SET,则可以避免使用
IF
命令“输入文件=!输入_文件!%%X;“
设置输入文件=!输入文件:~0,-1!