Пакет Windows: вызов более одной команды в цикле FOR?

Возможно ли в пакетном файле Windows вызывать более одной команды в цикле одиночный FOR? Скажем, например, я хочу напечатать имя файла и после удаления его:

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

Я знаю, что в этом случае я мог бы решить это, выполнив два разных цикла FOR: один для отображения имени и один для удаления файла, но возможно ли это сделать только в одном цикле?

Ответ 1

FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

Ответ 2

Использование & подходит для коротких команд, но эта одиночная строка может очень быстро работать очень быстро. Когда это произойдет, переключитесь на многострочный синтаксис.

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

Значение ( и ) имеет значение. Круглые скобки после DO должны быть помещены в одну строку, иначе командный файл будет некорректным.

Подробнее см. if /?|find /V "".

Ответ 3

SilverSkin и Anders оба правильны. Вы можете использовать круглые скобки для выполнения нескольких команд. Однако вы должны убедиться, что сами команды (и их параметры) не содержат круглых скобок. cmd жадно ищет первую закрывающую скобку, вместо того, чтобы грамотно обрабатывать вложенные наборы круглых скобок. Это может привести к тому, что остальная часть командной строки не сможет выполнить синтаксический анализ или может привести к тому, что некоторые из скобок будут переданы командам (например, DEL myfile.txt)).

Обходной путь для этого состоит в том, чтобы разделить тело цикла на отдельную функцию. Обратите внимание, что вам, вероятно, нужно прыгать вокруг тела функции, чтобы избежать "падения" в нее.

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF

:loopbody
ECHO %1
DEL %1
GOTO :EOF