User Tools

Site Tools


backup_script_7zip

This is an old revision of the document!


Backup Script (7-Zip)

@echo off

rem Usage:
rem 
rem   Backup.bat TargetName TargetDir ContentType Frequency HaltOnTargetDirError
rem 
rem   ContentType = 'All', 'CS' or 'Batch'
rem   Frequency = 'Hourly', 'Daily' or 'Weekly'
rem   HaltOnTargetDirError = 'True' or 'False'
rem 
rem Example:
rem 
rem   Backup.bat DevLocal C:\DevLocal CS Daily True
rem 
rem NOTE: Do NOT put double quotes in the argments - it won't work. If the directory has a space, use 8.3 formatted names:
rem 
rem   Backup.bat FooBar z:\mydocu~1\visual~1\FooBar CS Hourly
rem 
 
set AllFlags=
set AllSearch=*
 
set CSFlags=-x!*.dll -x!*.zip -x!*.pdf -x!*.pdb -x!*.exe
set CSSearch=*
 
set BatchFlags=
set BatchSearch=*.bat
 
if [%1]==[] goto ErrorInCommandLineOptions
if [%2]==[] goto ErrorInCommandLineOptions
if [%3]==[] goto ErrorInCommandLineOptions
if [%4]==[] goto ErrorInCommandLineOptions
if [%5]==[] goto ErrorInCommandLineOptions
 
set TargetName=%1
set TargetDir=%2
set ContentType=%3
set Frequency=%4
set HaltOnTargetDirError=%5
 
set BackupDir=C:\Backups\%TargetName%
 
:CheckHaltOnTargetDirError
if "%HaltOnTargetDirError%"=="True" goto CheckTargetDir
if "%HaltOnTargetDirError%"=="False" goto CheckTargetDir
 
echo ERROR: The HaltOnTargetDirError must be 'True' or 'False'.
echo.
goto ErrorInCommandLineOptions
 
:CheckTargetDir
if exist "%TargetDir%" goto CheckBackupDir
 
echo ERROR: The target directory (%TargetDir%) does not exist or can not be accessed.
 
if "%HaltOnTargetDirError%"=="False" goto Done
 
pause
goto Done
 
:CheckBackupDir
if exist "%BackupDir%" goto CheckContentType
 
echo ERROR: The backup directory (%BackupDir%) does not exist or can not be accessed.
pause
goto Done
 
:CheckContentType
if "%ContentType%"=="All" goto ContentTypeIsAll
if "%ContentType%"=="CS" goto ContentTypeIsCS
if "%ContentType%"=="Batch" goto ContentTypeIsBatch
 
echo ERROR: The content type must be 'All', 'CS' or 'Batch'.
echo.
goto ErrorInCommandLineOptions
 
:ContentTypeIsAll
set Flags=%AllFlags%
set Search=%AllSearch%
goto CheckFrequency
 
:ContentTypeIsCS
set Flags=%CSFlags%
set Search=%CSSearch%
goto CheckFrequency
 
:ContentTypeIsBatch
set Flags=%BatchFlags%
set Search=%BatchSearch%
goto CheckFrequency
 
:CheckFrequency
if "%Frequency%"=="Hourly" goto FrequencyIsHourly
if "%Frequency%"=="Daily" goto FrequencyIsDaily
if "%Frequency%"=="Weekly" goto FrequencyIsWeekly
 
echo ERROR: The frequency must be 'Hourly', 'Daily' or 'Weekly'.
echo.
goto ErrorInCommandLineOptions
 
:FrequencyIsHourly
set CreateBackupCommand=7z u -r %Flags% "%BackupDir%\Daily_Backup_01.7z" -u- -up0q0x2y2z0w2!"%BackupDir%\%Frequency%_Backup_Temp.7z" "%TargetDir%\%Search%"
goto CheckDailyBackup
 
:FrequencyIsDaily
set CreateBackupCommand=7z a -r %Flags% "%BackupDir%\%Frequency%_Backup_Temp.7z" "%TargetDir%\%Search%"
goto CreateBackup
 
:FrequencyIsWeekly
set CreateBackupCommand=copy "%BackupDir%\Daily_Backup_01.7z" "%BackupDir%\%Frequency%_Backup_Temp.7z"
goto CheckDailyBackup
 
:CheckDailyBackup
 
if exist "%BackupDir%\Daily_Backup_01.7z" goto CreateBackup
 
echo ERROR: The daily backup ("%BackupDir%\Daily_Backup_01.7z") does not exist or can not be accessed.
pause
goto Done
 
:CreateBackup
%CreateBackupCommand%
 
if not exist "%BackupDir%\%Frequency%_Backup_01.7z" goto RollDone

rem Determine if there is any differences between the current backup and the previous backup.
rem 7Zip includes the name of the file in the content list, so we need to make sure the filename is the same for each backup. We only want to know if the *contents* are different.
rem If DOS had a more functional 'tail' command we wouldn't need to do this...
 
rename "%BackupDir%\%Frequency%_Backup_Temp.7z" "%Frequency%_Compare.7z"
7z l -slt "%BackupDir%\%Frequency%_Compare.7z" > "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt"
rename "%BackupDir%\%Frequency%_Compare.7z" "%Frequency%_Backup_Temp.7z"
 
rename "%BackupDir%\%Frequency%_Backup_01.7z" "%Frequency%_Compare.7z"
7z l -slt "%BackupDir%\%Frequency%_Compare.7z" > "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
rename "%BackupDir%\%Frequency%_Compare.7z" "%Frequency%_Backup_01.7z"
 
fc "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt" "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
 
IF ERRORLEVEL 1 GOTO :DifferencesExist
 
ECHO No differences found - throwing the backup away.

REM No differences found, so just clean up.
del "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
del "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt"
del "%BackupDir%\%Frequency%_Backup_Temp.7z"
GOTO :done
 
:DifferencesExist
 
ECHO Differences found - storing the backup.
 
del "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
del "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt"
 
:RollExistingBackups
 
del "%BackupDir%\%Frequency%_Backup_20.7z"
rename "%BackupDir%\%Frequency%_Backup_19.7z" "%Frequency%_Backup_20.7z"
rename "%BackupDir%\%Frequency%_Backup_18.7z" "%Frequency%_Backup_19.7z"
rename "%BackupDir%\%Frequency%_Backup_17.7z" "%Frequency%_Backup_18.7z"
rename "%BackupDir%\%Frequency%_Backup_16.7z" "%Frequency%_Backup_17.7z"
rename "%BackupDir%\%Frequency%_Backup_15.7z" "%Frequency%_Backup_16.7z"
rename "%BackupDir%\%Frequency%_Backup_14.7z" "%Frequency%_Backup_15.7z"
rename "%BackupDir%\%Frequency%_Backup_13.7z" "%Frequency%_Backup_14.7z"
rename "%BackupDir%\%Frequency%_Backup_12.7z" "%Frequency%_Backup_13.7z"
rename "%BackupDir%\%Frequency%_Backup_11.7z" "%Frequency%_Backup_12.7z"
rename "%BackupDir%\%Frequency%_Backup_10.7z" "%Frequency%_Backup_11.7z"
rename "%BackupDir%\%Frequency%_Backup_09.7z" "%Frequency%_Backup_10.7z"
rename "%BackupDir%\%Frequency%_Backup_08.7z" "%Frequency%_Backup_09.7z"
rename "%BackupDir%\%Frequency%_Backup_07.7z" "%Frequency%_Backup_08.7z"
rename "%BackupDir%\%Frequency%_Backup_06.7z" "%Frequency%_Backup_07.7z"
rename "%BackupDir%\%Frequency%_Backup_05.7z" "%Frequency%_Backup_06.7z"
rename "%BackupDir%\%Frequency%_Backup_04.7z" "%Frequency%_Backup_05.7z"
rename "%BackupDir%\%Frequency%_Backup_03.7z" "%Frequency%_Backup_04.7z"
rename "%BackupDir%\%Frequency%_Backup_02.7z" "%Frequency%_Backup_03.7z"
rename "%BackupDir%\%Frequency%_Backup_01.7z" "%Frequency%_Backup_02.7z"
 
:RollDone
 
rename "%BackupDir%\%Frequency%_Backup_Temp.7z" "%Frequency%_Backup_01.7z"
 
goto :Done
 
:ErrorInCommandLineOptions
echo Error in command line arguments.
echo.
echo Usage:
echo.
echo   Backup.bat TargetName TargetDir ContentType Frequency HaltOnTargetDirError
echo.
echo   ContentType = 'CS' or 'Batch'
echo   Frequency = 'Hourly', 'Daily' or 'Weekly'
echo   HaltOnTargetDirError = 'True' or 'False'
echo.
echo Example:
echo.
echo   Backup.bat DevLocal C:\DevLocal CS Daily True
echo.
echo NOTE: Do NOT put double quotes in the argments - it won't work. If the directory has a space, use 8.3 formatted names:
echo.
echo   Backup.bat FooBar z:\mydocu~1\visual~1\FooBar CS Hourly
echo.
 
goto :Done
 
:Done
echo Done.
backup_script_7zip.1232585049.txt.gz · Last modified: 2017/01/01 19:48 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki