Пакет Windows: викликайте більше однієї команди у циклі FOR?


124

Чи можливо в пакетному файлі Windows викликати більше однієї команди в одному FOR циклі? Скажімо, наприклад, що я хочу надрукувати ім'я файлу та після його видалення:

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

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

Відповіді:


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

2
Власне, я думаю, що дужки є непотрібними. for %i in (1 2 3) do echo %i & echo fooдрукує те, що я очікував: "1", "foo", "2", "foo", "3", "foo" (окремими рядками).
bk1e

Це не повинно бути , &&а не &?
jww

9
@jww &&не вдасться, якщо перша команда не вдасться, &виконає другу команду незалежно.
yyny

Якщо це рішення робить для вас синтаксичну помилку, перевірте, чи є у вас DOнеподібний батьківський параметр між -parens. Ви можете уникнути їх, додавши ^до них.
Константин Ван

199

Використовувати &чудово для коротких команд, але цей рядок може отримати дуже довго дуже швидко. Коли це станеться, перейдіть до багаторядкового синтаксису.

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

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

Детальніше if /?|find /V ""див.


12
Це рішення виглядає чистим і читабельним. Я також попередив би будь-якого програміста, який використовує це рішення, що кругла дужка після DOНЕ повинна бути розміщена в наступному рядку, інакше це гальмує пакетний файл. У коді, коли я пишу для циклу, я зазвичай розміщую фігурний кронштейн у {наступному рядку.
Марко Демайо

2
Також будьте обережні, якщо будь-яка з ваших вкладених команд має дужки (наприклад, щось на кшталт "ехо щось щось (щось інше)" EDIT: ах, дивіться відповідь bk1e :)
Tim Barrass

31

СільверСкін і Андерс - правильно. Ви можете використовувати дужки для виконання декількох команд. Однак ви повинні переконатися, що самі команди (та їх параметри) не містять дужки. 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

3
Поки ми говоримо про тему,% X ніколи не коректний при роботі з іменами, завжди використовуйте "% ~ X" (У вашому прикладі тут, можливо, ви могли б піти з використання% * у підфункції)
Андерс

1
Це дійсно вдалий момент. Хороший приклад шляху, який демонструє обидві проблеми, - це C:\Program Files (x86).
bk1e
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.