четверг, 4 апреля 2013 г.

Дифференциальный backup с помощью 7zip


@echo off
rem задаем переменные, вроде все понятно
SET Z="C:\Program Files\7-Zip\7z.exe"
rem Папка для хранения бэкапов
SET BACKUPDIR=r:\servers_backup\adm\work\7zip\
rem каталог который бэкапить
SET SOURCEDIR=y:\
rem переменная для задания имени файла
SET filename=work_diff_
rem с переменной TIME1 пришлось извращаться, потому что дефолтная TIME содежит двоеточия,
rem которые не могут содержаться в именах файлов и папок.
rem Также от значения часа берется только вторая цифра, например если 12 часов - в H1 зпишется 2,
rem потому что если часы состоят из одной цифры, а выводятся две - начинаются косяки.
FOR /F "TOKENS=*" %%A IN ('TIME/T') DO SET TIME1=%%A
SET H1=%TIME1:~0,2%
SET M1=%TIME1:~3,2%
set TIME1=%H1%-%M1%


rem костыль для вывода дня недели
set /a y=%date:~6,4%
set /a m=1%date:~3,2%-100
set /a d=1%date:~0,2%-100
set /a i=(%y%-1901)*365 + (%y%-1901)/4 + %d% + (!(%y% %% 4))*(!((%m%-3)^&16))
set /a i=(%i%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))%%7+1
set  weekday=%i%

echo ====================================================
echo %weekday%, %DATE% %TIME1% Start Backup Script
echo ====================================================

if %weekday%==1 goto megafull
if %weekday%==2 goto diff
if %weekday%==3 goto diff
if %weekday%==4 goto diff
if %weekday%==5 goto diff
if %weekday%==6 goto diff
if %weekday%==7 goto diff

rem погнали
:megafull

rem если полные бекапы уже есть, следующие будем делать не с нуля, а на их основе.
if exist "%BACKUPDIR%0_work_*.7z" (
echo one full backup already exist
goto full
)

rem создаем полный бекап с нуля
echo ----------------------------------------------------
echo %weekday%, %DATE% %TIME1% Creating MEGAFULL Backup 0_work_%DATE%_%TIME1%.7z
echo ----------------------------------------------------
%Z% a -t7z %BACKUPDIR%0_work_%DATE%_%TIME1%.7z -r %SOURCEDIR% -m0=bzip2 -mmt=8 -ssw -y

rem записываем имя свежего полного бекапа в файл
del %BACKUPDIR%\last_full.txt
@echo 0_work_%DATE%_%TIME1%.7z>%BACKUPDIR%last_full.txt

rem удаляем файлы старше 8 дней, чтобы остались бекапы только прошлой недели
eachfile.exe -purge -r -w -e -d 8 -l 0 -dir %BACKUPDIR%
goto DoExit

:full
rem полные бекапы уже есть, следующие делам на их основе

rem считываем из файла имя последнего полного бекапа
set /p last_full=<%BACKUPDIR%last_full.txt

rem делаем полный бекап на основе предыдущего
echo ----------------------------------------------------
echo %weekday%, %DATE% %TIME1% Creating FULL Backup 0_work_%DATE%_%TIME1%.7z на основе %BACKUPDIR%%last_full%
echo ----------------------------------------------------
%Z% u %BACKUPDIR%%last_full% -u- -up0q3r2x2y2z1w2!%BACKUPDIR%0_work_%date%_%TIME1%.7z -t7z -mmt=8 -m0=bzip2 -ssw -y -r %SOURCEDIR%

rem записываем имя свежего полного бекапа в файл
del %BACKUPDIR%\last_full.txt
@echo Start file>%BACKUPDIR%last_full.txt
@echo 0_work_%DATE%_%TIME1%.7z>%BACKUPDIR%last_full.txt

rem удаляем файлы старше 8 дней, чтобы остались бекапы только прошлой недели
eachfile.exe -purge -r -w -e -d 8 -l 0 -dir %BACKUPDIR%
goto DoExit

:diff

rem если полных бекапов нет вообще - делаем полный с нуля
if not exist "%BACKUPDIR%0_work_*.7z" (
echo no full backup exist, begin make full backup
goto megafull
)

set /p last_full=<%BACKUPDIR%last_full.txt

rem если есть - считываем его имя из файла и делаем дифференциальный бекап на его основе


echo ----------------------------------------------------
echo %DATE% %TIME1% Creating DIFF Backup 1_%filename%%DATE%_%TIME1%.7z  на основе %BACKUPDIR%%last_full%
echo ----------------------------------------------------

%Z% u %BACKUPDIR%%last_full% -u- -up0q3r2x2y2z0w2!%BACKUPDIR%1_%filename%%date%_%TIME1%.7z -t7z -mmt=8 -m0=bzip2 -ssw -y -r %SOURCEDIR%

goto DoExit
:DoExit
echo ====================================================
echo %DATE% %TIME1% End Backup Script
echo ====================================================
exit