Ошибка forfiles при удалении папок

Я пытаюсь написать сценарий, который удаляет элементы в папке (папках) TEMP в Windows 7. Я хочу, чтобы он удалял только файлы старше 30 дней. Я делаю тестирование в папке, которую я настроил в системных переменных среды как TESTTEMP.

У меня есть сценарий следующим образом:

forfiles /p %TESTTEMP% /s /d -30 /c "cmd /c IF @ISDIR==FALSE del @FILE /q"
forfiles /p %TESTTEMP% /s /c "cmd /c IF @ISDIR==TRUE rmdir @FILE"

Моя логика заключается в том, что процесс должен сначала удалить все файлы в каталоге TESTTEMP, если файл старше 30 дней, и проверить все подкаталоги. Затем я проверяю оставшиеся файлы и, если это пустой каталог, удаляю его.

Этот скрипт работает отлично - все файлы, которые я хочу удалить, удалены, а те, которые должны остаться, остаются. Тем не менее, я заметил, что когда я запускаю этот пакетный файл, я получаю сообщение об ошибке The system cannot find the file specified. Я считаю, что у него есть проблемы с rmdir команда и не может найти каталог, который он только что удалил...

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

Спасибо за любую помощь!

(Для справки, вот структура папок до и после запуска пакетного файла, при условии, что все файлы старше 30 дней:)

До:

-TestTemp
    -More Test
        testfile1.txt
        testfile2.txt
        testfile3.txt
    testfile1.txt
    testfile2.txt
    testfile3.txt

После:

-TestTemp

2 ответа

Решение

Вы можете отображать файлы и папки:

forfiles /p "%TESTTEMP%" /s /c "cmd /c IF @ISDIR==TRUE echo rmdir @FILE"
forfiles /p "%TESTTEMP%" /s /d -30 /c "cmd /c IF @ISDIR==FALSE echo del @FILE /q"

Если папка не пуста, она выдаст безопасное сообщение об ошибке. 2>nul удалит сообщение об ошибке.

forfiles /p %TESTTEMP% /s /c "cmd /c IF @ISDIR==TRUE rmdir @FILE 2>nul"

Я получал сообщение об ошибке "Система не может найти указанный файл", но оно исчезло, когда я удалил "/s" из вызова ForFiles. Мне на самом деле не нужны /s, но похоже, что постер здесь. Если вам нужно рекурсивное удаление и вы не можете смириться с ошибкой (или не хотите глотать ее с помощью 2>nul), возможно, вы могли бы вложить нерекурсивный ForFiles в рекурсивный? Просто мысль.

Другие вопросы по тегам