PDA

Показать полную графическую версию : [решено] Удаление старых архивов


wizardkir
29-09-2010, 18:55
привет.
Ребята прошу помощи!!! Надо удалять старые архивы рара которым больше 5 дней с помощью скрипта. Может у кого есть готовый, - поделитесь пожалуйста...

amel27
30-09-2010, 06:26
для стандартного формата даты: "ДД.ММ.ГГГГ"
@Echo Off
SetLocal EnableDelayedExpansion

Call :FromNow -5
for %%i in (*.rar) do (
set $t=%%~ti& set $d=!$t:~6,4!!$t:~3,2!!$t:~,2!
if !$d! LSS %yyyymmdd% DEL /F "%%i"
)
Exit /B

:FromNow
SetLocal
Set yyyy=%DATE:~-4%& set /a mm=100%DATE:~3,2%%%100& set /a dd=100%DATE:~,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%
Exit /B

формулы пересчета даты взяты отсюда:
http://www.dostips.com/DtTipsDateTime.php#Function.date2jdate

wizardkir
30-09-2010, 11:37
Ещё вопрос, например если я хочу сменить с 15 дней на 5? Мне достаточно изминить 15 на 5 ???

amel27
30-09-2010, 11:57
wizardkir, угу, процедура FromNow отсчитывает заданное количество дней от текущей даты, результат потом используется для сравнения

NiOl
30-09-2010, 12:29
Вот и появилась вменяемая формула для работы с датами... ;) но по мне - лучше оставить последние 5 (или 15) архивов... а то если "почему-то" бэкапы не прошли, то нужно иметь хоть что-то, а не вытирать все подряд за сроком давности.

wizardkir
10-11-2010, 17:40
трабл, скрипт сработал один раз и больше не пашет...ребят не подскажите в чом дело?

amel27
11-11-2010, 09:57
wizardkir, не запускается или запускается, но не делает что надо?...

biossa
28-09-2011, 21:31
Удаление архивных файлов в подпапках 1 уровня вложенности в указанной директории
Сохранение только N количесво последних по дате изменения файлов
Например из C:/ARCHIVE/
Структура:

C:/ARCHIVE/User1
C:/ARCHIVE/User1/file1_archive_2008-MM-DD.rar
C:/ARCHIVE/User1/file2_archive_2007-MM-DD.rar
C:/ARCHIVE/User1/file3_archive_2006-MM-DD.rar
C:/ARCHIVE/User2
C:/ARCHIVE/User2/file1_archive_2011-MM-DD.rar
C:/ARCHIVE/User2/file2_archive_2010-MM-DD.rar
C:/ARCHIVE/User2/file3_archive_2009-MM-DD.rar

В результате будут удалены 2 файла:
1) C:/ARCHIVE/User1/file3_archive_2006-MM-DD.rar
2) C:/ARCHIVE/User2/file3_archive_2009-MM-DD.rar

Настраиваемые параметры:
set BackUpFolder=C:/ARCHIVE
set KeepNumFiles=2

@echo off
SetLocal EnableExtensions
set BackUpFolder=C:/ARCHIVE
set KeepNumFiles=2
@echo. & @echo Script Start: & @echo.
@rem Get LIST of Directories --------------------------------------------
@pushd %BackUpFolder%>dirs.log 2>&1
find "The system cannot find the path specified." < dirs.log > nul
if errorlevel 1 (
@for /f "tokens=* delims=" %%D in ('dir /ad /b /o-d') do call :FromDir %%D
) else (
@echo Wrong Path %BackUpFolder% in param "BackUpFolder": Location did not find!
@echo Wrong Path %BackUpFolder% in param "BackUpFolder": Location did not find!>>erase_old_files.log
exit
)
@exit /b
@popd

:FromDir
@set NumFiles=%KeepNumFiles%
@set CurrentDir=.\%1
@echo Directory: %CurrentDir%
DIR "%CurrentDir%" /B /A-D /o-d>dirs.log 2>&1

find "File Not Found" < dirs.log > nul
if errorlevel 1 (
@for /f "tokens=* delims=" %%1 in ('DIR "%CurrentDir%" /B /A-D /o-d') do call :CheckFiles %%1
@exit /b
) else (
@echo Directory %1 is EMPTY!
@echo %date% %time%: Script detected, that Folder "%CurrentDir%" is EMPTY!>>erase_old_files.log
@exit /b
)



:CheckFiles
if not %NumFiles%==0 set /a NumFiles-=1&exit /b
@echo File deleted: %1
@echo %date% %time%: erase %CurrentDir%\%1>>erase_old_files.log
erase "%CurrentDir%\%1"
@exit /b

Логи складываются рядом со скриптом в erase_old_files.log

mskam
20-08-2013, 09:13
задача похожая, есть каталог допустим C:/123 в которой есть файлы *.avi которые там появляются в достаточном количестве и мне надо удалять файлы *.avi в этом каталоге которые старше 7 дней.

подойдёт ли пример написаны amel27 только с маленьким дополнением

Call :FromNow -7
for %%i in (C:/123/*.avi) do (
не пинайте сильно я в этом языке мало что понимаю.

Busla
20-08-2013, 14:16
не проще ли обычным forfiles /D?




© OSzone.net 2001-2012