Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - удалить файлы старше 5ти минут батником

Ответить
Настройки темы
CMD/BAT - удалить файлы старше 5ти минут батником

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день, уважаемые гуру.
Подскажите пожалуйста как снести файлы из определенной директории батником, которых дата создания больше 5ти минут.
Облазил очень много тем и форумов, но так и не нашел, везде больше Х дней.
Если что не пинайте сильно, спасибо!

Отправлено: 11:38, 12-07-2012

 

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Обратите внимание - время указывается в секундах! Если хотите задавать значения в минутах, добавьте Set /A TimeDiff=TimeDiff*60 после строки, задающей значение.
Скрипт использует мои функции работы со временем, конкретно для этого случая там довольно много лишнего, но скрипт писался на быструю руку, лень было вырезать ненужные функции.
Авторство VBS для получения времени создания - Bigwolf с cyberforum'а. Обойтись встроенными средствами (%~tX) не удалось, они выдают время изменения, а парсить вывод Dir с нужным ключиком мне если честно, лень было.
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

:: Путь к директории c файлами
Set WorkDir=test
:: Указываем разницу во времени, в секундах
Set TimeDiff=300


:: Создаём VBS, чтобы обойти неприятный момент, связанный с тем, что
:: ~tX выдает время последней модификации, а не создания, и такое
:: предопределенное поведение вроде бы поменять невозможно.
>"%Temp%\GetCreationDate.vbs" (
	Echo Set objFS=CreateObject^("Scripting.FileSystemObject"^)
	Echo Set objArgs = WScript.Arguments
	Echo strFile= objArgs^(0^)
	Echo WScript.Echo objFS.GetFile^(strFile^).DateCreated
)

:: Получаем текущее время и дату для сравнения
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Set TimeNow=%STime%
Set DateNow=%Date%

:: Получаем все файлы из директории и вложенных поддиректорий, передаем их
:: в качестве аргумента ранее созданному скрипту.
For /F "delims=" %%A In ('Dir "%WorkDir%\*" /A-D /B /S') Do (
	For /F "tokens=1,2" %%B In ('CScript //nologo "%Temp%\GetCreationDate.vbs" "%%A"') Do (
rem Проверяем на дату и время создания, не подходящие по времени создания - удаляем
		If "%DateNow%"=="%%B" (
rem Сериализуем полученную от VBS временную метку для дальнейшего сравнения
			Call :ParseTimestamp %%~C
			Call :SerializeTime
rem Получаем разницу
			Call :TMinus %TimeNow% !STime!
rem Если разница больше указанного времени - удаляем
			If !Result! GTR !TimeDiff! Del "%%~A"
			Echo   %%~nxA !Result!s after creation date
		) Else (
rem Дата не сошлась, время проверять нету смысла, удаляем.
			Del "%%~A"
			Echo   %%~nxA too old - created %%B
		)
	)
)

:: Подчищаем за собой
Del "%Temp%\GetCreationDate.vbs"
Pause&Exit


::===Функции работы со временем в .bat====================================
:: Anonymous, 2010
:: v 1.3
:ParseTimestamp
:: Разбирает на составляющие временную метку формата ЧЧ:ММ:СС
:: Формат:   Call :ParseTimestamp (время)
:: К примеру - Call :ParseTimestamp %time:~-0,8%
:: Вывод - в переменные HH MM и SS
For /F "tokens=1,2,3 delims=:" %%A In ("%1") Do (
    Set HH=%%A
    Set MM=%%B
    Set SS=%%C
)

:SerializeTime
:: Сериализует время из переменных HH MM и SS
:: Вывод - в ErrorLevel
Call :Cut %HH% HH&Call :Cut %MM% MM&Call :Cut %SS% SS
Set /A STime=(HH*60*60)+(MM*60)+SS
Exit /B %STime%

:DeserializeTime
:: Десериализует время, приводит его к стандартному формату
:: Формат:   Call :DeserializeTime (сериализованное время)
:: Вывод - в переменные DHH DMM и DSS
Set DHH=00&Set DMM=00&Set DSS=00
Set /A DHH=%1/60/60
Set /A DMM=(%1/60)-(DHH*60)
Set /A DSS=%1-(DHH*60*60)-(DMM*60)
If %DHH%==24 Set DHH=00
If %DHH% LSS 10 Set DHH=0%DHH%
If %DMM% LSS 10 Set DMM=0%DMM%
If %DSS% LSS 10 Set DSS=0%DSS%
Exit /B

:TMinus
:: Функция вычитания для сериализованного времени
:: Формат:   Call :TMinus (сериализованное время) (сколько секунд отнять)
:: Вывод - в ErrorLevel
Set Result=
Set /A Result=%1-%2
If %2 GTR %1 (
    Set /A Result=86400+%1-%2
)
Exit /B %Result%

:TPlus
:: Функция прибавления для сериализованного времени
:: Формат:   Call :TPlus (сериализованное время) (сколько секунд прибавить)
:: Вывод - в ErrorLevel
Set Result=
Set /A Result=%1+%2
If %Result% GTR 86400 (
    Set /A Result=%1+%2-86400
)
Exit /B %Result%

:Timer
:: Отсчитывает прошедшее с заданного момента время
:: Формат:   Call :Timer (запомненное сериализованное время)
:: Вывод - в ErrorLevel
:: Если счетчик переходит границу суток, число дней возрастает на 1
:: Дни выводятся в переменную ED (и накапливаются) // да, знаю, что костыль и быдлокод
Set OTime=%1
If "%ED%"=="" Set ED=0
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Set CTime=%STime%
If %OTime% GTR %CTime% (
    Set /A Timer=86400-%OTime%+%CTime%
    Set /A ED+=1
) Else (
    Set /A Timer=CTime-OTime
)
Exit /B %Timer%

:Timer2
:: Проверяет, прошел ли заданный промежуток времени
:: Формат:   Call :Timer2 (запомненное сериализованное время) (промежуток в секундах)
:: Вывод - в ErrorLevel (только 0=промежуток истёк или 1=промежуток ещё не истёк)
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Call :TMinus %STime% %1
If %2 GTR %Result% Set Timer2=1&Exit /B 1
Set Timer2=0&Exit /B 0

:Cut
:: Убирание ведущих нулей и пробелов
:: Формат:   Call :Cut (Двухзначное число) (Переменная, куда вывести резуьтат)
Set d=%1
If "%d:~,1%"=="0" Set %2=%d:~1%
If "%d:~,1%"==" " Set %2=%d:~1%
Exit /B
::========================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:39, 12-07-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Anonymоus:
Обойтись встроенными средствами (%~tX) не удалось, они выдают время изменения, а парсить вывод Dir с нужным ключиком мне если честно, лень было. »
Если без вложенных папок,
читать дальше »
то можно и «wmic.exe» обойтись, например:
Код: Выделить весь код
wmic.exe DataFile where "Drive = 'E:' AND Path = '\\Песочница\\0159\\'" get Name, CreationDate
Если со вложенными, то не стоит — "…Path LIKE …%%" отрабатывает полный перебор файловой системы.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:43, 12-07-2012 | #3


Ветеран


Сообщения: 542
Благодарности: 35

Профиль | Сайт | Отправить PM | Цитировать


удаляем файлы (которые старее 5 минут) в архив командой
Код: Выделить весь код
rar m -m0 -to5m
потом грохаем архив. вот и все дела)

-------
консольный клиент telegram для Windows: www.elapser.info

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:48, 18-08-2017 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - удалить файлы старше 5ти минут батником

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Нужно удалить лог файлы старше 30 дней ksv_sergo Скриптовые языки администрирования Windows 14 24-03-2016 15:02
Можно ли удалить файлы Drony Microsoft Windows NT/2000/2003 5 31-01-2012 20:46
удалить лишние файлы binders Вебмастеру 3 29-09-2011 17:50
Удалить файлы, шифрование ManHack Мобильные ОС, смартфоны и планшеты 2 27-09-2010 18:28
Не удалить файлы от старой ОС Slavamlado Хочу все знать 2 04-03-2006 21:37




 
Переход