Консультация № 185374
07.02.2012, 18:56
0.00 руб.
0 31 2
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
В нашей организации эксплуатируется довольно много программных комплексов, на вход которых поступают файлы с данными, которые после обработки помещаются в архивные директории. Архивировать их и хранить спустя несколько дней не имеет никакого смысла. Однако в папках тысячами накапливаются эти ненужные файлы, которые приходится удалять вручную, за исключением файлов за несколько последних дней. Итак, что бы мне хотелось:
Создать скрипт (bat, vbs - мне всё равно) который бы в нескольких указанных папках удалял бы файлы старше указанного числа дней (кол-во дней для каждой папки должно быть своё)

Обсуждение

Неизвестный
07.02.2012, 20:10
общий
ForFiles - это внешняя программа? Во встроенных командах её нет.
Неизвестный
07.02.2012, 20:30
общий
07.02.2012, 20:31
Начиная с Windows Server 2003/Windows Vista - встроенная.
На Windows XP возможно использование утилиты forfiles из Windows Server 2003 Resource Kit
Неизвестный
08.02.2012, 00:14
общий
только недавно был похожий вопрос. одним из экспертов был решен вопрос для bat файла, а я ответ сделал на vbs. там нужно заменить условие отбора и все.
Неизвестный
08.02.2012, 00:28
общий
08.02.2012, 13:58
нашел. консультация # 185290. подкорректировал для этого вопроса. даже проще код.



option explicit
dim fso
dim dso

dim tekkatalog

dim tempfile

'это константа текущего пути
tekkatalog="I:\Jiteli\Mail\2"

'создаем список файлов в текущем каталоге
Set fso = CreateObject("Scripting.FileSystemObject")
set dso=fso.getfolder(tekkatalog)


for each tempfile in dso.files
if tempfile.datecreated<dateadd("d",-5,Now) and tempfile.name<>"del.vbs" then
'удаляем все файлы, созданные более 5 дней назад кроме самого командного файла с именем del.vbs
fso.deletefile (tekkatalog & "" & tempfile.name),true
end if

'здесь был лишний оператор - отредактировал

next


скрипт не проверял - идет расчет и нет времени.

в каждом подкаталоге создать такой файл и указать за сколько дней оставлять файлы. или написать еще один батник или скрипт, который будет вызываться в текущем каталоге, а он сам просканирует все подкаталоги и позапускает в них скрипт удаления . можно команды удаления вставить в основной скрипт, а в каждом подкаталоге создать файл dni.txt, в котором будет только одна строка, содержащая количество дней для этой папки.
Неизвестный
08.02.2012, 12:43
общий
08.02.2012, 12:44
Наверное, как вариант решения forfiles можно было бы и принять (я не раз сталкивался с упоминанием этой утилиты и её богатых возможностей. Но меня не очень устраивает, что при стандартной установке Windows эта утилита не поставляется. Кстати, попутно нашел обсуждение подобной темы здесь. Вот здесь описание forfiles. Скачать.
Мне бы хотелось без проблем переносить скрипт на любой комп, не перетаскивая дополнительных утилит. Конечно, за это решение - это всё же утилита Microsoft.
Идея Филатов Евгений Геннадьевич:понятна, попробую доработать в применимом для меня виде.
Неизвестный
08.02.2012, 14:52
общий
08.02.2012, 14:58
проверил скрипт - работает. чуть подправил в конце.
скрипт работоспособен на любом компе

может напишете, на каком варианте остановились?

1. в каждом подкаталоге скрипт с количеством дней
2. один скрипт и в каждом подкаталоге текстовый файл с количеством дней


вот рабочий скрипт, который удаляет в ТЕКУЩЕМ ( в котором запущен скрипт ) каталоге файлы старше 5 дней



option explicit
dim fso, dso
dim WshShell
dim tekkatalog
dim tempfile

'Создаем объект FileSystemObject
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'определяем текущий каталог, из которого запущен скрипт
tekkatalog=replace(WScript.ScriptFullName,"" & WScript.scriptname,"")

'получаем список файлов в текущем каталоге
set dso=fso.getfolder(tekkatalog)

for each tempfile in dso.files
if tempfile.datecreated<dateadd("d",-5,Now) and tempfile.name<>"del.vbs" then
'удаляем все файлы, созданные более 5 дней назад кроме самого командного файла с именем del.vbs
fso.deletefile (tekkatalog & "" & tempfile.name),true
end if
next
Неизвестный
08.02.2012, 15:03
общий
кстати. можно обойтись без хранения в каждом подкаталоге файла с количеством дней. достаточно создавать папки вида "05ИмяПапки" или "12_архив_за_2012_01", где первые два символа - количество дней для скрипта.
тогда можно запустить один скрипт из текущего каталога, который создаст список подкаталогов, по первым двум символам имени подкаталога определит количество дней и удалит старые файлы в подкаталоге.
давно
Модератор
137394
1850
08.02.2012, 15:52
общий
09.02.2012, 15:55
Вот вариант, единственное - чтобы скрипт не был внутри обрабатываемых папок
Код:
' Скрипт удаляет в указанных папках файлы,
' старше указанного кол-ва дней

' Указываем попарно кол-во сохраняемых дней и путь папки с файлами

MyFolder = Array(5, "C:\Soft1\Arc\In", _
5, "C:\Soft1\Arc\Out", _
2, "E:\DelTmp", _
15, "C:\Soft2\UTM\Arc", _
3, "C:\Soft3")

N = UBound(MyFolder)
Set FSO = CreateObject("Scripting.FileSystemObject")

For i = 0 To N Step 2

On Error Resume Next
Set Folder = FSO.GetFolder(MyFolder(i + 1))
If Err.Number = 0 Then
OldDay = DateAdd("d", -MyFolder(i), Date)
Set Files = Folder.Files
For Each f In Files
If f.DateLastModified < OldDay Then
On Error Resume Next
FSO.DeleteFile MyFolder(i + 1) + "" + f.Name, True
End If
Next
End If
Next
Интересно, а с помощью WMI короче сделать можно?
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
08.02.2012, 16:05
общий
09.02.2012, 15:59
в предложенном Вами решении нужно в массиве явно указывать ВСЕ каталоги, в которых нужно проводить проверку. в моем варианте скрипт работает с текущего каталога - нужно только добавить сканирование поддиректорий.

доделать сканирование? подойдут названия подкаталогов как я описывал ранее ( первые две цифры указывают количество дней для сохранения ) ? желательно чтобы в подкаталогах не было вложеннных подкаталогов.


ps. ошибся с автором варианта. сорри Megaloman.
Неизвестный
08.02.2012, 16:06
общий
08.02.2012, 16:09
Как-то у Вас не очень удобно ... Вообще-то я скрипт (батник?) планирую поместить в назначенные задания и выполнять его каждый день раз в день. Если делать с forfiles (еще не пробовал) - можно в батнике прописать несколько строк с Forfiles для каждой папки и посадить батник в задания. Будет и удобно и наглядно. Но не очень хочется forfiles/
давно
Модератор
137394
1850
08.02.2012, 16:21
общий
08.02.2012, 16:23
в моем варианте скрипт работает с текущего каталога - нужно только добавить сканирование поддиректорий.
- зато потом в назначенных заданиях указывать задание для каждого каталога отдельно. При этом иметь кучу файлов разбросанных по разным директориям. ИМХО, поддиректории не надо, но это пусть заказчик решает.

Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
08.02.2012, 16:26
общий
можно и батник с forfiles. но тогда нужно при создании нового подкаталога или изменения времени сохранения редактировать батник.
если же использовать скрипт с автоматическим определением подкаталогов, в имени которых указаны дни, то никаких исправлений в скрипте в дальнейшем не нужно. запускать скрипт можно точно так же по расписанию.
Неизвестный
08.02.2012, 16:39
общий
08.02.2012, 16:46
Адресаты:
Цитата: Megaloman
- зато потом в назначенных заданиях указывать задание для каждого каталога отдельно. При этом иметь кучу файлов разбросанных по разным директориям. ИМХО, поддиректории не надо, но это пусть заказчик решает.


на самом деле этого не нужно. имеется основной каталог, в котором находится файл del.vbs и он запускается по расписанию.
в этом же каталоге находятся подкаталоги вида "02каталог1", "12архивпочты" и т.п., где первые два символа указывают сколько дней нужно хранить файлы. никаких других дополнительных файлов нигде не создается.
при запуске скрипта определяется список подкаталогов с периодом сохранения и удаляются все файлы, подходящие по условию.



а если есть конкретный список каталогов, который ( список ) изменяется очень редко и заданы периоды для удаления, то Ваш вариант оптимален.
давно
Модератор
137394
1850
08.02.2012, 17:01
общий
08.02.2012, 17:07
Вот еще идея - использовать WinRar c ключом -to -df (и -m0 для скорости работы) и ключами. А затем полученный файл .rar убить. WinRar обычно уже установлен. Но всё равно - это привлечение сторонней утилиты. Да и надо для этого иметь место на диске (хотя, если файлы небольшие, то не страшно, и, что плохо, грузим процессор, что не всегда допустимо.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Мастер-Эксперт
259041
7459
08.02.2012, 17:10
общий
Поделюсь опытом: Я тоже поначалу помещал авто-исполняемые задания в Планировщик. Но случалось: в назначенное время комп не включили. Пришлось задействовать "Повторять задание". При б кол-ве заданий (у меня >80), да ещё с повторами Планировщик перегружается (ведь он ежеминутно проверяет: не наступило ли вр для каждого из всех заданий?).

Поскольку для большинства заданий время не актуально ("Поздравь тёщу ч-з полгода"), я переместил таковые из Планировщика в АвтоЗапуск (кот-й исполняется намного реже, чем еже-минутно). Все проверки момента заданий исполняются быстро и скрытно до поры, когда наступит час отобразить текст на экране.

К сожалению в cmd-средствах нет такой изящной функции обработки даты, как dateadd("d",-5,Now) (из кода товарища Филатова). Я для своих cmd-прог долго создавал вызываемый вычислитель старости Ago.cmd 6кБ, возвращающй старость объекта в днях, часах и минутах от момента ткщ-врем с учётом перехода ч-з месяц и високоса.
Неизвестный
08.02.2012, 17:15
общий
Адресаты:
предлагаю дать два ответа:

1. Ваш вариант для конкретных каталогов, которые перечисляются в теле скрипта.

2. мой вариант для работы с текущим каталогом и указанием дней сохранения в имени подкаталога.

а там пусть автор вопроса выбирает. может понадобятся оба варианта.

и воспользоваться предложением эксперта Алексеев Владимир поместить скрипты в автозапуск. тогда при включении компьютера будет подчищаться место от старых файлов и засоряться новыми.
Неизвестный
08.02.2012, 18:05
общий
это ответ
Здравствуйте, Петрович!

Предлагаю вариант скрипта, который сканирует наличие в текущем каталоге подкаталогов и удаляет в них файлы, подходящие под условие.
Для корректной работы программы имя подкаталога должно иметь вид "ЦЦдальшеимякаталога" , где ЦЦ - двузначное число, показывающее более скольки дней создания удалять файлы. Например в каталоге 03архив удалятся все файлы, созданные более 3 дней назад, а в каталоге 13почта удалятся более 13 дней назад. По умолчанию ( если программа не сможет понять первые два символа как число ) удалятся файлы старше 5 дней ( например в подкаталоге "неудалять5дней" ) .

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


ps. в ходе обсуждения в форуме был разработан улучшенный скрипт ( обрабатывает все вложенные подкаталоги ) , который и поместил в приложение. при проверке работоспособности скрипта необходимо учитывать, что при копировании файлов дата создания будет изменена на текущую и проверка по дате создания не сработает правильно. при переносе дата создания не изменяется. либо можно проверять по дате последней модификации.

С уважением.

Приложение:
option explicit
'чтобы каждый раз не создавать объект, определяем как глобальную переменную
public fso

'а это локальные переменные, которые используются только в следующих четырех командах
dim dso
dim WshShell
dim tekkatalog

'Создаем объект FileSystemObject
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'определяем текущий каталог, из которого запущен скрипт
tekkatalog=replace(WScript.ScriptFullName,"" & WScript.scriptname,"")
'можно явно указать, с какого каталога начинать поиск, например командой
'tekkatalog="D:\Temp\archive"

'вызываем функцию, а в параметрах указываем основной каталог, с которого начинаем поиск, и дни по-умолчанию,
'которые будут использоваться для проверки, если в имени подкаталога явно не указано иное либо
'нет данных из родительского каталога
call subdirr(tekkatalog,5)
'ну вот и вся основная процедура. далее идет выход из скрипта и останов


'вот сама рекурсия. входящие параметры - путь к подкаталогу в виде строки и количество дней для проверки
function subdirr(folder,dni)
'определяем переменные, которые будут использоваться в этой функции
dim ddso
dim subkatalog
dim tempfile
dim den

'получаем список подкаталогов
set ddso=fso.getfolder(folder)

for each subkatalog in ddso.subfolders
'сохраняем условие отбора для дальнейшего использования и используем другую переменную
den=dni
if isnumeric(mid(subkatalog.name,1,2)) then
'если два первых символа названия подкаталога можно преобразовать в число,
'то используем это значение, иначе оставляем входящий параметр
den=clng(mid(subkatalog.name,1,2))
end if
'вызываем рекурсией эту же функцию для проверки всех подкаталогов
call subdirr(subkatalog.parentfolder & "" & subkatalog.name,den)
next

'если больше подкаталогов нет, то работаем с файлами
set ddso=fso.getfolder(folder)
for each tempfile in ddso.files
'получаем список файлов в подкаталоге и проверяем условие
'если первый каталог указан явно, то проверку на имя файла можно не делать
'если же скрипт вызывается в текущем каталоге и начинает работу с него, то оставить второе условие
'чтобы случайно не удалить саму программу. соответственно если в подкаталогах случайно
'окажется файл с таким же именем, то он тоже удален не будет
if tempfile.datecreated<dateadd("d",-dni,Now) and tempfile.name<>"del_rekurs.vbs" then
'кроме даты создания ( DateCreated ) можно сравнивать по дате модификации ( DateLastModified ) или доступа ( DateLastAccess )
'удаляем файлы, подходящие под условие
fso.deletefile (tempfile.parentfolder & "" & tempfile.name),true
end if
next
end function
давно
Модератор
137394
1850
08.02.2012, 19:16
общий
08.02.2012, 19:21
Адресаты:
А если компьютер вообще не выключается (сервер, на котором центролизованно обрабатывается входящая-исходящая информация)? А если комп не включается долго, то там и файлы не накапливаются, и их удаление не актуально. А если у пользователя комп в рабочее время простаивает невключенным, то это если пользователь в отпуске или командировке, иначе зачем ему компьютер. Про домашние компьютеры я не рассуждаю.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
08.02.2012, 19:42
общий
08.02.2012, 19:46
спасибо большое! Однако, мне не столь важно, чтобы файлы искались в поддиректориях - в лучшем случае для каждой задачи в архиве имеем
Arhiv\In
Arhiv\Out
(кстати, а какая вложенность директорий в Вашем решении - м.б. в будущем пригодится)- каждая задача имеет свою систему папок, вплоть до того, что расположены они на разных дисках, и перенастраивать задачи не очень хочется. И переименовывать директории в соответствии с Вашим решением тоже как-то напряжно. Наверное, придётся всё-таки взять forfiles.
давно
Мастер-Эксперт
259041
7459
09.02.2012, 03:29
общий
Есть готовый инструм Корзина, продуманный by MicroSoft как раз для ткщ Вопроса. В Корзину мож выбрасывть даже одноимённые фйлы, и они НЕ спутываются! (л из них мож "Восстановить" в исходн директорию). У Корзины мож регулирвть макси-объём, при превышени кот-го из неё вымещаются старейшие файлы (самые ненужн). Если Петровичу необязат отсчитывть кол-во дней хранени старого фйла, то мож опробовать "тупое" перемещени фйлв в \RECYCLER\ или в её дочернюю \RECYCLER\S-1-5-21-515967899-1606980848-1801674531-1003 (=идентифик текущего юзера, обеспечивающй не-подглядывание других юзеров в под-корзину текущего).
давно
Мастер-Эксперт
259041
7459
09.02.2012, 03:51
общий
У меня почему-то не сработал Ваш Ответ-код. В папке C:\Temp я создал Текст-докум, переименовал его в Del.vbs, открыл его командой Изменить, вставил в фйл Ваш код, сохранил. В этой же папке я создал папку 03архив с прошлогодними фйлами, но она не очистилась пуском Вашего Del.vbs.
Хорошо, если бы все программисты сообщали в своих продуктах, что их программа запустилась, что именно она сделала или на чём споткнулась… Может, я что-то не так сделал при отсутствии описания работы со скриптом?
Неизвестный
09.02.2012, 11:30
общий
Адресаты:
Так и должно быть. Дело в том, что при копировании дата создания файла проставляется текущей. Ведь это новый файл и он создан прямо сейчас. Если бы Вы перенесли файл, то сохранилась бы и дата создания. В данном случае для проверки можно вручную изменить дату создания на более раннюю и еще раз запустить скрипт.
Неизвестный
09.02.2012, 12:01
общий
В данном мной ответе вложенные папки не обрабатываются. Можно переделать скрипт и обрабатывать вложенные папки рекурсией - это реально сделать.
Переименовывать подкаталоги тоже не обязательно - в скрипте сначала устанавливается количество дней по-умолчанию, равное 5, а затем производится попытка получить дни из имени подкаталога. В любом случае нужно где-то хранить или явно указывать сколько дней нужно оставлять. При использовании рекурсии для работы с подкаталогами можно при отсутствии в имени вложенного подкаталога значения, использовать настройки родительской папки, т.е. :
--03каталог ( 3 дня )
----07каталог ( 7 дней )
------простокаталог ( используется 7 дней по-умолчанию для родительского каталога )
------12каталог ( 12 дней )
----ещекаталог ( используется 3 дня по-умолчанию для родительского каталога )
--каталог (используется 5 дней по-умолчанию для каталогов, расположенных в том же месте, что и скрипт )

или

..\03каталог\
..\03каталог\07каталог\
..\03каталог\07каталог\простокаталог\
..\03каталог\07каталог\12каталог\
..\03каталог\ещекаталог\
..\каталог\


В скрипте определяется каталог, из которого запущена программа. Можно в переменной явно указать путь, с которого начинать поиск и удаление. Тогда скрипт сначала удалит все файлы в этом каталоге, подходящие по условию, а затем войдет в подкаталоги и там будет делать то же самое. Рекурсия вещь неплохая.

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

Можно предусмотреть какие-то шаблоны для наименований, например все подкаталоги, начинающиеся с "Temp" будут храниться 5 дней, в "Mail" 31 день и т.п.
Неизвестный
09.02.2012, 13:08
общий
Сделал с рекурсией. Теперь ищет во всех вложенных подкаталогах. Условие отбора передается из родительского каталога если нет явного указания в названии подкаталога. Для первого вызова стоит параметр по-умолчанию 5 дней.
Наименование файла del_rekurs.vbs - необходимо для проверки в случае работы с текущего каталога. Скрипт рабочий. Проверял условия отбора от 3 до 56 дней. Создал вложение пяти подкаталогов, скопировал файлы, вручную изменил дату создания на январь.


option explicit
'чтобы каждый раз не создавать объект, определяем как глобальную переменную
public fso

'а это локальные переменные, которые используются только в следующих четырех командах
dim dso
dim WshShell
dim tekkatalog

'Создаем объект FileSystemObject
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'определяем текущий каталог, из которого запущен скрипт
tekkatalog=replace(WScript.ScriptFullName,"" & WScript.scriptname,"")
'можно явно указать, с какого каталога начинать поиск, например командой
'tekkatalog="D:\Temp\archive"

'вызываем функцию, а в параметрах указываем основной каталог, с которого начинаем поиск, и дни по-умолчанию,
'которые будут использоваться для проверки, если в имени подкаталога явно не указано иное либо
'нет данных из родительского каталога
call subdirr(tekkatalog,5)
'ну вот и вся основная процедура. далее идет выход из скрипта и останов


'вот сама рекурсия. входящие параметры - путь к подкаталогу в виде строки и количество дней для проверки
function subdirr(folder,dni)
'определяем переменные, которые будут использоваться в этой функции
dim ddso
dim subkatalog
dim tempfile
dim den

'получаем список подкаталогов
set ddso=fso.getfolder(folder)

for each subkatalog in ddso.subfolders
'сохраняем условие отбора для дальнейшего использования и используем другую переменную
den=dni
if isnumeric(mid(subkatalog.name,1,2)) then
'если два первых символа названия подкаталога можно преобразовать в число,
'то используем это значение, иначе оставляем входящий параметр
den=clng(mid(subkatalog.name,1,2))
end if
'вызываем рекурсией эту же функцию для проверки всех подкаталогов
call subdirr(subkatalog.parentfolder & "" & subkatalog.name,den)
next

'если больше подкаталогов нет, то работаем с файлами
set ddso=fso.getfolder(folder)
for each tempfile in ddso.files
'получаем список файлов в подкаталоге и проверяем условие
'если первый каталог указан явно, то проверку на имя файла можно не делать
'если же скрипт вызывается в текущем каталоге и начинает работу с него, то оставить второе условие
'чтобы случайно не удалить саму программу. соответственно если в подкаталогах случайно
'окажется файл с таким же именем, то он тоже удален не будет
if tempfile.datecreated<dateadd("d",-dni,Now) and tempfile.name<>"del_rekurs.vbs" then
'удаляем файлы, подходящие под условие
fso.deletefile (tempfile.parentfolder & "" & tempfile.name),true
end if
next
end function


Можно заменить текст в ответе на этот код.

С уважением.
давно
Мастер-Эксперт
259041
7459
09.02.2012, 14:43
общий
Спасибо, я понял: Проводник в столбце "Изменён" отображает дату изменени (2010.06.01) прошлогоднего фйла, кмд Dir и TotalCommander - тоже. Но в свойствах этого фйла, свеже-скопированного из Foto\ , отображ-ся, что он изменён 2010.06.01 , а Создан 2012.02.09 (=сегодня). По Вашему совету я произвёл перемещени (вместо копи) стар-фйла в папку для удалени, и Ваш скрипт мигом удалил его. Вероятно, в богатых возможностях vbs-функций можно было заменить дату создани на дату изменени (дабы устранить настораживающ противоречие с отображением в Проводнике, Dir и TotCmd)? Это я поизучаю на досуге.

"для проверки можно вручную изменить дату создания" - это чем такое можно сделать? Т-ко в Hex-радакторе?
Неизвестный
09.02.2012, 15:02
общий
Адресаты:
в ответе на консультацию # 185290 я перечислял возможные проверки даты :
'кроме даты создания ( DateCreated ) можно сравнивать по дате модификации ( DateLastModified ) или доступа ( DateLastAccess )


я менял в FAR - Ctrl+A выдает атрибуты и несколько данных дата-время : последней записи в файл, создания, последнего доступа и изменения. все это можно отредактировать.

лучше использовать код из поста #25 форума - там обрабатываются вложенные подкаталоги и неплохое описание.
Неизвестный
09.02.2012, 15:45
общий
Спасибо большое! использую Ваш код как учебник по рекурсии Но пока вложенные папки мне не очень интересны.
давно
Модератор
137394
1850
09.02.2012, 15:54
общий
это ответ
Здравствуйте, Петрович!
Предлагаю два варианта решения: с помощью .bat - файла и скрипта .vbs

В .bat-файле основная трудность - работа с датой. Я предполагаю, что в системе дата имеет формат dd.mm.yyyy.
Идея решения - преобразовать даты в числа вида yyyymmdd, и их уже сравнивать.
Построение командного файла описана в комментариях по тексту.
Для того, чтобы вычислить дату, отстоящую от текущей на заданное кол-во дней заимствовал готовую процедуру (см здесь или здесь ).
Далее при просмотре файлов в указанной директории командой For
выделяю дату для каждого файла, преобразовываю её к виду, пригодному для сравнения, и более старые файлы удаляю.

Код:

@Echo Off
rem ------------------------------------------------------------------
rem Удаляем в указанных директориях файлы старше указанного кол-ва дней
rem Вызываем последовательно для каждой очищаемой директории процедуру
rem Call :DelOldFiles "Путь к папке" -Дни
rem "Путь к папке" - в кавычках без \ на конце
rem -------------------------------------------------------------------

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Call :DelOldFiles "C:\TTTTT\AAAAA\DTS\Arc\In" -5
Call :DelOldFiles "C:\TTTTT\AAAAA\DTS\Arc\Out" -5
Call :DelOldFiles "C:\UTM\Arc" -15
Call :DelOldFiles "C:\Обновления-2009\Plat\{Сделано}" -5

GoTo :Eof

:DelOldFiles
rem --------------------------------------
rem Процедурка удаляет в директории %1
rem файлы старше указанного кол-ва дней %2
rem по отношению к системной дате
rem --------------------------------------

Call :FromNow %2 %Date%

FOR %%f IN ("%~1\*.*") DO (
Set dFile=%%~tf
Set dFile=!dFile:~6,4!!dFile:~3,2!!dFile:~0,2!
If !dFile! LSS %yyyymmdd% Del "%%f"
)
GoTo :Eof

:FromNow
rem --------------------------------------------------
rem Процедурка дату формата dd.mm.yyyy %2
rem пересчитывает на указ число дней (+-) %1
rem Формирует в ответе переменную %yyyymmdd%
rem --------------------------------------------------
SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal& Set yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
GoTo :Eof

В vbs-cкрипте с сравнением дат нет проблем, аналог bat-файла предоставляю. Редкий случай - vbs-скрипт получился даже короче bat.
Код:

' Скрипт удаляет в указанных папках файлы,
' старше указанного кол-ва дней
' ------------------------------------------------------------------
Public FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

' Для каждой обрабатываемой папки вызываем процедуру DelOldFiles
' Указываем попарно кол-во сохраняемых дней и путь папки с файлами
' ------------------------------------------------------------------
DelOldFiles 5, "C:\TTTTT\AAAAA\DTS\Arc\In"
DelOldFiles 5, "C:\TTTTT\AAAAA\DTS\Arc\Out"
DelOldFiles 2, "E:\DelTmp"
DelOldFiles 15, "C:\UTM\Arc"
DelOldFiles 3, "C:\Обновления-2009\Plat\{Сделано}"
' ------------------------------------------------------------------

Sub DelOldFiles(dFile, nDir)

On Error Resume Next
Set Folder = FSO.GetFolder(nDir)
If Err.Number = 0 Then
OldDay = DateAdd("d", -dFile, Date)
Set Files = Folder.Files
For Each f In Files
If f.DateLastModified < OldDay Then
On Error Resume Next
FSO.DeleteFile nDir + "" + f.Name, True
End If
Next
End If
End Sub
В мини-форуме приведен первый вариант моего скрипта, там вместо последовательного вызова процедуры исходные данные записываются в массив. Что удобнее- дело вкуса. Мне более по нраву последний вариант. Если понадобится, можно сделать и с подкаталогами. Кстати, в bat-файле это можно сделать проще.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Модератор
137394
1850
09.02.2012, 16:09
общий
09.02.2012, 16:11
Адресаты:
"для проверки можно вручную изменить дату создания"
-в Far-е это делается просто, из-за пристрастия к батникам держусь за него до последнего .
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Мастер-Эксперт
259041
7459
09.02.2012, 16:13
общий
И от меня примите Большое спасибо! (я совсем забыл про FAR!...)
Форма ответа