Действительно ли возможно в пакетном файле Windows назвать больше чем одну команду на сингле FOR
цикл? Скажем, например, я хочу распечатать имя файла и после того, как удалят его:
@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.
Я знаю в этом случае, что я мог решить его путем выполнения двух отличных ДЛЯ циклов: один для показа имени и один для удаления файла, но действительно ли возможно сделать это в одном цикле только?
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
Использование и
подходит для коротких команд, но эта единственная строка может очень быстро стать очень длинной. Когда это произойдет, переключитесь на многострочный синтаксис.
FOR /r %%X IN (*.txt) DO (
ECHO %%X
DEL %%X
)
Размещение (
и )
имеет значение. Круглые скобки после DO
должны быть помещены в одну строку, иначе командный файл будет некорректным.
Подробнее см. if /? | Find / V ""
.