Пакет Windows: вызвать более одной команды в цикле FOR? - PullRequest
110 голосов
/ 12 февраля 2010

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

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

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

Ответы [ 3 ]

185 голосов
/ 13 февраля 2010

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

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

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

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

104 голосов
/ 12 февраля 2010
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)
30 голосов
/ 13 февраля 2010

SilverSkin и Андерс оба верны. Вы можете использовать скобки для выполнения нескольких команд. Однако вы должны убедиться, что сами команды (и их параметры) не содержат скобок. 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...