Удалить подкаталоги старше 30 дней - PullRequest
4 голосов
/ 06 августа 2010

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

Мне удалось найти скрипт, который удаляет все подкаталоги в указанном месте.

@for /f "tokens=*" %%a in ('dir /s /b "C:/temp/test" 2^>NUL') do rd /s /q "%%a"

Может кто-нибудь настроить этот скрипт, чтобы он удалял только каталоги, которым 30 дней?

Ответы [ 7 ]

9 голосов
/ 06 августа 2010

Я думаю, что FORFILES собирается это сделать ...

FORFILES -D 30 будет повторять все файлы, которые были последний раз изменены более 30 дней назад

Итак, что-то вроде ...

FORFILES /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path"

Если (не проверено) рекурсивно удалить все папки старше 30 дней:)

Кстати - проверьте http://ss64.com/nt/, чтобы узнать больше о командной строке

1 голос
/ 14 ноября 2018

Это нормально работает для меня:

Автор: Мэтт Робертс -> FORFILES /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path"

Будьте осторожны, когда запускаете файл «.bat» с «Запуск от имени администратора», он не использует текущее местоположение файла, он занимает это местоположение -> "C:\Windows\system32"

Из соображений безопасности добавьте /P "C:\temp"

FORFILES /P C:\temp /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path"
1 голос
/ 17 февраля 2017

Я знаю, что это старая тема; однако, я недавно искал это сделать и смог, основываясь на том, что предложил Мэтт Робертс. Я использовал следующий синтаксис FORFILES:

FORFILES /P \path\to\dir /S /C "cmd /c IF @isdir == TRUE rmdir /S @path /Q" -D -30

Вам нужно будет заменить \path\to\dir на путь (включая букву диска) к каталогу (/ P), в котором вы хотите его запустить. Затем он будет рекурсивно (/S) искать в каталоге и запускать (/C) rmdir (снова рекурсивно). Без /Q вас спросят, хотите ли вы удалить каждый каталог / файл, поэтому, если вы планируете выполнить это в сценарии без вывода сообщений, вам понадобится это сделать. Вы можете изменить количество дней (-D), изменив -30 на другое.

Затем я использовал планировщик заданий, чтобы автоматизировать это раз в неделю (подтвержденная работа). Чтобы убедиться, что это работает, поставьте задачу «запускать с наивысшими привилегиями»

Примечание. Эта установка безвозвратно удалит файлы. Они не появятся в вашей корзине. Поэтому, когда они ушли, они ушли (если у вас нет резервных копий).

1 голос
/ 06 августа 2010

У вас есть powershell в вашей системе?

dir | ? { $_.LastWriteTime -lt [DateTime]::Now.AddDays(-30) } | % { rm $_.FullName }

1 голос
/ 06 августа 2010

Если вы ограничены пакетными файлами ... отметьте это - но если вы можете использовать VBScript, я думаю, вы можете сделать немного лучше .


Теперь, когда вы выяснили свою реальную проблему, пожалуйста, поймите, что если вы намеревались использовать System.exec (), вам придется столкнуться с множеством недостатков.

В качестве альтернативы, если вы действительно хотите использовать JNDI (вы упоминаете «нативный», но не понимаете, что вы имеете в виду), возможно, это поможет: http://mindprod.com/products1.html#FILETIMES

0 голосов
/ 06 августа 2010

Это не будет простой настройкой. В его нынешнем виде нет простого способа (о котором я знаю) выполнить операцию date-diff в интерпретаторе cmd.

Сначала вам нужно проанализировать текущую дату:

C:\>date /T
Thu 08/05/2010

Когда у вас есть день, месяц, год, вы должны получить дату для каждого элемента в списке каталогов, что можно сделать, удалив параметр /b в команде dir и изменив строку токенов: дать вам токены 1 и 4, т. е. tokens=1,4, а затем самим делать математику даты, что будет болезненно, потому что вам придется обрабатывать разные месяцы длины, переходы декабрь -> январь (новые годы) и т. д. почти наверняка ошибся.

Также добавьте параметр /ad, чтобы получить только каталоги.

Я бы порекомендовал использовать PowerShell или другую технологию сценариев, которая дает вам инструменты, необходимые для манипулирования датами.

0 голосов
/ 06 августа 2010

Возможно, вы захотите использовать Windows Script Host, в котором вы можете запустить VBScript, чтобы сделать это. Думайте об этом как о пакетном файле с большей гибкостью и мощностью.

См. http://www.computing.net/answers/programming/wsh-delete-files-in-folder-by-date/16255.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...