===== Backup Script (7-Zip) =====
==== With Fancy Logging ====
See [[logger|Logger]].
@echo off
rem Version 1.1.0
rem Last Update: 2011-06-24
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 arguments - 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 LoggerExe=C:\Bin\Logger.exe
set SummaryLogFile=C:\Bin\Logs\Summary.log
set FullLogFile=C:\Bin\Logs\Backup.log
echo Info: Backup: **** Starting **** | %LoggerExe% >> %SummaryLogFile%
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:\Dev\Backups\%TargetName%
:CheckHaltOnTargetDirError
if "%HaltOnTargetDirError%"=="True" goto CheckTargetDir
if "%HaltOnTargetDirError%"=="False" goto CheckTargetDir
echo ERROR: The HaltOnTargetDirError must be 'True' or 'False'.
echo ERROR: Backup: The HaltOnTargetDirError must be 'True' or 'False'. | %LoggerExe% >> %SummaryLogFile%
echo.
goto ErrorInCommandLineOptions
:CheckTargetDir
if exist "%TargetDir%" goto CheckBackupDir
echo ERROR: The target directory (%TargetDir%) does not exist or can not be accessed.
echo ERROR: Backup: The target directory (%TargetDir%) does not exist or can not be accessed. | %LoggerExe% >> %SummaryLogFile%
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.
echo ERROR: Backup: The backup directory (%BackupDir%) does not exist or can not be accessed. | %LoggerExe% >> %SummaryLogFile%
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 ERROR: Backup: The content type must be 'All', 'CS' or 'Batch'. | %LoggerExe% >> %SummaryLogFile%
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 ERROR: Backup: The frequency must be 'Hourly', 'Daily' or 'Weekly'. | %LoggerExe% >> %SummaryLogFile%
echo.
goto ErrorInCommandLineOptions
:FrequencyIsHourly
set CreateBackupCommand="C:\Program Files\7-Zip\7z.exe" u -r %Flags% "%BackupDir%\Daily_Backup_01.7z" -u- -up0q0x2y2z0w2!"%BackupDir%\%Frequency%_Backup_Temp.7z" "%TargetDir%\%Search%"
goto CheckDailyBackup
:FrequencyIsDaily
set CreateBackupCommand="C:\Program Files\7-Zip\7z.exe" a -r %Flags% "%BackupDir%\%Frequency%_Backup_Temp.7z" "%TargetDir%\%Search%"
goto CleanUpTemps
: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 CleanUpTemps
echo ERROR: The daily backup ("%BackupDir%\Daily_Backup_01.7z") does not exist or can not be accessed.
echo ERROR: Backup: The daily backup ("%BackupDir%\Daily_Backup_01.7z") does not exist or can not be accessed. | %LoggerExe% >> %SummaryLogFile%
pause
goto Done
:CleanUpTemps
rem Clean up now, just in case the last run died halfway through.
del "%BackupDir%\%Frequency%_Backup_Temp.7z"
del "%BackupDir%\%Frequency%_Compare.7z"
del "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt"
del "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
:CreateBackup
echo Pre-check and set up is done. Beginning backup.
echo Info: Backup: [%TargetName% %Frequency%] Pre-check and set up is done. Beginning backup. | %LoggerExe% >> %SummaryLogFile%
%CreateBackupCommand% 2>&1 | %LoggerExe% >> %FullLogFile%
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" 2>&1 | %LoggerExe% >> %FullLogFile%
"C:\Program Files\7-Zip\7z.exe" l -slt "%BackupDir%\%Frequency%_Compare.7z" > "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt"
rename "%BackupDir%\%Frequency%_Compare.7z" "%Frequency%_Backup_Temp.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_01.7z" "%Frequency%_Compare.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
"C:\Program Files\7-Zip\7z.exe" l -slt "%BackupDir%\%Frequency%_Compare.7z" > "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
rename "%BackupDir%\%Frequency%_Compare.7z" "%Frequency%_Backup_01.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
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.
echo Info: Backup: [%TargetName% %Frequency%] No differences found - throwing the backup away. | %LoggerExe% >> %SummaryLogFile%
REM No differences found, so just clean up.
del "%BackupDir%\%Frequency%_Backup_01_Contents.txt" 2>&1 | %LoggerExe% >> %FullLogFile%
del "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt" 2>&1 | %LoggerExe% >> %FullLogFile%
del "%BackupDir%\%Frequency%_Backup_Temp.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
GOTO :done
:DifferencesExist
ECHO Differences found - storing the backup.
echo Info: Backup: [%TargetName% %Frequency%] Differences found - storing the backup. | %LoggerExe% >> %SummaryLogFile%
del "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
del "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt"
:RollExistingBackups
del "%BackupDir%\%Frequency%_Backup_20.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_19.7z" "%Frequency%_Backup_20.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_18.7z" "%Frequency%_Backup_19.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_17.7z" "%Frequency%_Backup_18.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_16.7z" "%Frequency%_Backup_17.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_15.7z" "%Frequency%_Backup_16.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_14.7z" "%Frequency%_Backup_15.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_13.7z" "%Frequency%_Backup_14.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_12.7z" "%Frequency%_Backup_13.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_11.7z" "%Frequency%_Backup_12.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_10.7z" "%Frequency%_Backup_11.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_09.7z" "%Frequency%_Backup_10.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_08.7z" "%Frequency%_Backup_09.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_07.7z" "%Frequency%_Backup_08.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_06.7z" "%Frequency%_Backup_07.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_05.7z" "%Frequency%_Backup_06.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_04.7z" "%Frequency%_Backup_05.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_03.7z" "%Frequency%_Backup_04.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_02.7z" "%Frequency%_Backup_03.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
rename "%BackupDir%\%Frequency%_Backup_01.7z" "%Frequency%_Backup_02.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
:RollDone
rename "%BackupDir%\%Frequency%_Backup_Temp.7z" "%Frequency%_Backup_01.7z" 2>&1 | %LoggerExe% >> %FullLogFile%
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 arguments - 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 Info: Backup: **** Done **** | %LoggerExe% >> %SummaryLogFile%
==== Without Fancy Logging ====
@echo off
rem Version 1.0.0
rem Last Update: 2011-06-14
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 arguments - 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:\Dev\Backups\%TargetName%
:CheckHaltOnTargetDirError
if "%HaltOnTargetDirError%"=="True" goto CheckTargetDir
if "%HaltOnTargetDirError%"=="False" goto CheckTargetDir
echo ERROR: The HaltOnTargetDirError must be 'True' or 'False'.
eventcreate /ID 1 /t ERROR /l APPLICATION /so "Backup" /d "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.
eventcreate /ID 1 /t ERROR /l APPLICATION /so "Backup" /d "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.
eventcreate /ID 1 /t ERROR /l APPLICATION /so "Backup" /d "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'.
eventcreate /ID 1 /t ERROR /l APPLICATION /so "Backup" /d "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'.
eventcreate /ID 1 /t ERROR /l APPLICATION /so "Backup" /d "The frequency must be 'Hourly', 'Daily' or 'Weekly'."
echo.
goto ErrorInCommandLineOptions
:FrequencyIsHourly
set CreateBackupCommand="C:\Program Files\7-Zip\7z.exe" u -r %Flags% "%BackupDir%\Daily_Backup_01.7z" -u- -up0q0x2y2z0w2!"%BackupDir%\%Frequency%_Backup_Temp.7z" "%TargetDir%\%Search%"
goto CheckDailyBackup
:FrequencyIsDaily
set CreateBackupCommand="C:\Program Files\7-Zip\7z.exe" a -r %Flags% "%BackupDir%\%Frequency%_Backup_Temp.7z" "%TargetDir%\%Search%"
goto CleanUpTemps
: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 CleanUpTemps
echo ERROR: The daily backup ("%BackupDir%\Daily_Backup_01.7z") does not exist or can not be accessed.
eventcreate /ID 1 /t ERROR /l APPLICATION /so "Backup" /d "The daily backup ('%BackupDir%\Daily_Backup_01.7z') does not exist or can not be accessed."
pause
goto Done
:CleanUpTemps
rem Clean up now, just in case the last run died halfway through.
del "%BackupDir%\%Frequency%_Backup_Temp.7z"
del "%BackupDir%\%Frequency%_Compare.7z"
del "%BackupDir%\%Frequency%_Backup_Temp_Contents.txt"
del "%BackupDir%\%Frequency%_Backup_01_Contents.txt"
:CreateBackup
eventcreate /ID 1 /t INFORMATION /l APPLICATION /so "Backup %TargetName% %Frequency%" /d "Pre-check and set up is done. Beginning backup."
%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"
"C:\Program Files\7-Zip\7z.exe" 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"
"C:\Program Files\7-Zip\7z.exe" 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.
eventcreate /ID 1 /t INFORMATION /l APPLICATION /so "Backup %TargetName% %Frequency%" /d "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.
eventcreate /ID 1 /t INFORMATION /l APPLICATION /so "Backup %TargetName% %Frequency%" /d "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 arguments - 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.
{{tag>code_snippet msdos batch_file 7zip backup}}