Пакетный файл для рекурсивного удаления файлов в папке старше N числа дней

Теперь я использую командный файл, чтобы удалить все файлы, заканчивающиеся на .snp, которые старше 180 дней. Код ниже работает для удаления всех файлов, заканчивающихся на .snp в корневой папке

C:\Program Files\Snapshots

Но я недавно обнаружил, что в папке Snapshots есть папки, организованные по дате

"1-10-2014, 12-20-2014, 10-15-2014 и т.д."

и что приведенная ниже строка кода не работает для рекурсивного поиска по каждой директории и поэтому не удаляет.

Какие изменения следует внести в этот код, чтобы он рекурсивно просматривал папки в корневой папке и удалял файлы, превышающие 180 дней?

forfiles /M *.snp /P "C:\Program Files\Snapshots" /S /D -180 /C "cmd /c del /F /Q @path"
2 ответа

Самый лучший вариант для максимальной надежности - объединить силы команды For с командами FORFILES, чтобы каждый из них мог делать то, что они делают лучше всего.

Set str_Ext=*.snp
Set int_Age=-180
For /R "%~dp0" %%D IN (.) DO (
 For /F "usebackq tokens=*" %%F IN (`FORFILES /P "%%~D" /m %str_Ext% /D %int_Age% 2^>nul`) DO (
 Call :s_Del_File "%%~D" "%%~F"
 )
)
Goto :EOF
:s_Del_File
Set "str_DIR=%~1"
Set "str_FIL=%~2"
Set "str_DIR=%str_DIR:~0,-1%"
DEL /F/Q/A "%str_DIR%%str_FIL%"
Goto :EOF

Во второй команде FOR команда backquote (~) содержит команду FORFILES и использует вывод консоли для вызова пакетной подпрограммы для удаления указанного файла.

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


Без/D (Дата) он работает для подпапок

forfiles /M *.txt /P "C:\hlpme" /S /C "cmd /c del /f /q @path

но вы, очевидно, хотите, чтобы дата была там затем в CMD

forfiles /D -180 /M *.txt /P "C:\hlpme" /S /C "cmd /c del /f /q @path

Параметр/D перед именем пути выбирает все файлы, которые были изменены более 180 дней назад

licensed under cc by-sa 3.0 with attribution.