Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   удалить файлы старше 5ти минут батником (http://forum.oszone.net/showthread.php?t=238442)

Dannnnnia 12-07-2012 11:38 1950501

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

Anonymоus 12-07-2012 18:39 1950789

Обратите внимание - время указывается в секундах! Если хотите задавать значения в минутах, добавьте 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
::========================================================================


Iska 12-07-2012 22:43 1950925

Цитата:

Цитата Anonymоus
Обойтись встроенными средствами (%~tX) не удалось, они выдают время изменения, а парсить вывод Dir с нужным ключиком мне если честно, лень было. »

Если без вложенных папок,
читать дальше »
то можно и «wmic.exe» обойтись, например:
Код:

wmic.exe DataFile where "Drive = 'E:' AND Path = '\\Песочница\\0159\\'" get Name, CreationDate
Если со вложенными, то не стоит — "…Path LIKE …%%" отрабатывает полный перебор файловой системы.

Опиум 18-08-2017 17:48 2759286

удаляем файлы (которые старее 5 минут) в архив командой
Код:

rar m -m0 -to5m
потом грохаем архив. вот и все дела)


Время: 22:16.

Время: 22:16.
© OSzone.net 2001-