3

У меня проблемы с корректной работой этого синтаксиса. Я хотел бы удалить все файлы tmp и bak из указанного каталога и всех подкаталогов, если дата изменения старше 7 дней.

for %G in (.tmp, .bak) do forfiles -p "C:\test\cad projects" -s -m *%G -d -7 -c "cmd /c del @path"

Мой синтаксис был получен из этого вопроса StackOverflow.

Если я изменю свою маску поиска, чтобы включить только одно желаемое расширение, я получу правильные результаты.

forfiles -p "c:\test\cad projects" -s -m *.bak -d -7 -c "cmd /c del @path"

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

2 ответа2

5

Если вы запускаете это с консоли, это должно работать. Если вы сохраняете это в файл .bat , то формат для переменных немного отличается. Вы должны использовать два процента для обозначения переменной. Итак, ваша команда стала бы ...

for %%G in (.tmp, .bak) do forfiles -p "C:\test\cad projects" -s -m *%%G -d -7 -c "cmd /c del @path"

В статье Microsoft KB75634 объясняется, почему это так.

Если между двумя знаками процента нет символов, один знак процента удаляется, а другой остается. Вот почему команда FOR, которая отображает имя каждого файла с.Расширение COM будет

FOR %V IN (*.COM) DO ECHO %V

но если та же команда помещена в командный файл, требуется следующее:

FOR %%V IN (*.COM) DO ECHO %%V
0

Ну, я недостаточно внимательно прочитал синтаксис FOR /R. Мне не хватало%. Мой код выше работал бы в командной строке. Однако из пакета это не удалось из-за отсутствия%.

for %%G in (.tmp, .bak) do forfiles -p "C:\test\cad projects" -s -m
*%%G -d -7 -c "cmd /c del @path"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .