2016-09-07 2 views
2

Я пытаюсь очистить общий каталог, поэтому, когда элемент старше 30 дней, его следует удалить. У меня есть настройка пакетного файла с помощью следующей команды:Используйте файлы для удаления папки и ее содержимого

forfiles /p "C:\PATH\USERS\PATH\" /s /m *.* /c "cmd /c Del @path /q" /d -30 

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

Пример: C:\PATH\USERS\PATH\HelloWorld\file.text более 30 дней. Но команда удаляет только file.text, а не папку.

Должен ли я проверить, пуста ли папка, а затем удалить папку с помощью другой команды?

+2

использования [е] (http://ss64.com/nt/rd.html), чтобы удалить папку. Он не удалит папку без emty, если вы не дадите ей '/ s/q' – Stephan

+0

. Хотите ли вы проверить, имеет ли папка 30 дней? Если это так, используйте переменную '@ isdir' для проверки только каталогов, а затем удалите каталог. – Squashman

ответ

2

командной строки вы используете довольно опасно (я просто скопировал его здесь и заказана переключатели):

forfiles /S /D -30 /P "C:\PATH\USERS\PATH\" /M "*.*" /C "cmd /C del /Q @path" 

forfiles, потому что возвращается к файлам и каталогам. Предположим, что существует каталог с именем container, который соответствует критериям поиска (последний раз был изменен 30 дней назад или ранее), выполненная командная строка del - del "C:\PATH\USERS\PATH\container" /Q, в которой все файлы, даже те, которые не соответствуют критериям поиска (обратите внимание, что del \folder ведет себя как del \folder\*).

Чтобы решить эту проблему, нужно фильтровать для файла или каталогов, например:

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==FALSE del @path" 

Я также изменил файл маски из *.* в *, потому что forfiles, в отличие от всех внутренних команд, не делает файлы совпадений без расширения в случае, если дано *.*. Кроме того, я удалил конечный \ с пути, потому что в противном случае forfiles вызывает ошибку: ERROR: The directory name is invalid..


Но теперь нечто совсем другое - ответ на ваш реальный вопрос:

С forfiles /S возвращает каталог перед тем она возвращает его подпунктов, это не имеет смысла делать проверить, является ли каталог пуст или нет в той же командной строке, вам нужно сделать это позже.

Для этой цели вы можете использовать второй forfiles цикл вроде этого (также проверка их последние даты изменения, если вы хотите, в противном случае, удалите /D -30 часть):

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==TRUE rd @path 2> nul" 

Или другой стороны, если каталог дата модификации не имеет значения, вы можете использовать for /D цикл, который также быстрее:

for /D %%I in ("C:\PATH\USERS\PATH\*") do rd "%%~fI" 2> nul 
Смежные вопросы