Как я могу создать список файлов для передачи в исполняемый файл, используя пакетный файл DOS? - PullRequest
1 голос
/ 07 декабря 2011

Я хочу получить (разделенный точкой с запятой) список всех .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 Ответ

3 голосов
/ 07 декабря 2011

Проблема в расширении переменной процента.
Они расширяются в момент разбора (также для блоков).

Лучше использовать отложенное расширение, синтаксис почти такой же, но с !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!
...