Guest dderkits Posted October 7, 2007 Posted October 7, 2007 Below is a new version of the backup script that I posted to USENET on 5 July 2005 (initial version) and 9 Sept 2006 (revised version). This new version can also be found at: http://www.derkits.com/apps/serverbackup.txt (be sure to change the file attribute to .cmd before using it) The version below may be affected by line wrapping. So, it is probably best to download the script from the above URI. The main improvements are: - Inserted code after the backup operations and before the robocopy operation to parse the ntbackup logs for certain error messages that will indicate a problem even if ntbackup returns a "success" errorlevel. - Under Exchange backup section, corrected position of line "set saveerrorlevel=%errorlevel%". This is still a caveat: - Robocopy, when run in a batch script, can have problems with very large backup (.bkf) files. I have noticed this with individual .bkf files that are around/over 110GB in size, and it is more likely to occur on servers that have the /3GB switch enabled in boot.ini. In some cases, rebooting the server will resolve the problem, at least termporarily. One workaround is to copy the file manually, using robocopy or another method. But, if you are encountering this error often, then your infrastructure may have outgrown the capabilities of this script. For additional information on this robocopy "bug", search the web for: robocopy insufficient resources. See also: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q259837 Some text from my earlier post is still relevant, so I'll repeat it here. "Below is a batch-based script that I have developed for a few clients in setting them up with disk-based backup (using USB2 and/or FireWire external hard drives, such as those available from AcomData and others). I'm posting it here in case anyone has a use for it. This material is supplied without any warranty or support. You should periodically test the quality of your backups no matter what backup software you use, including running test restores on test hardware. Although this backup script should be usable "out-of-the-box", it is best if the sysadmin reviews it and makes an effort to understand it, before actually using it. This is freely-available (no copyright) and may be copied/customized/used as desired. Reasons to consider a disk-based backup approach: - Disk backup is usually considerably less expensive than tape backup, once all of the hardware and software are factored in. This is certainly true at larger data sizes, which is sometimes the case for file servers and/or email servers. - Disk backup is usually faster than tape backup, and easier to restore from. - Disk drives are usually more portable than tape drives, and they have strong OS support (with the drivers preloaded in most cases). - This backup script is free, and it leverages the capabilities of ntbackup, which comes with Windows for no additional cost. - Disk backup can be easily scheduled using Scheduled Tasks. - Off-site capabilities are easily supported, by having one external drive always attached to hold the backups, and then another drive (or set of drives) that mirror the content of the always-attached drive and that rotate a few times per week - e.g. at any given moment, one rotated drive is attached, one is in transit, and one is safely off-site). See the script for additional details about this mechanism. Granted, this backup script is a batch file, but for relatively simple purposes a batch is okay (using cmd, not bat, of course). If I were doing this formally, I'd probably write it in vbscript, but batch is somewhat more accessible to the Windows community. Feel free to email me if you find any bugs or have any comments. Enjoy, - David Derkits http://www.derkits.com/ @echo off echo Version 2.50 (25Aug07) - David Derkits (dderkits@alumni.caltech.edu) echo Runs a backup to two external hard drives and logs progress and errors echo into an email. echo This script can be executed manually but, in practice, is usually run echo automatically using Scheduled Tasks. echo This script must be run locally on the server that is to be backed-up. echo. echo Command syntax: echo. echo serverbackup.cmd weeknum baktype echo. echo where weeknum is: 1, 2, or 3 (assuming a three-week rotation; this echo script supports, without modification, rotations of longer or echo shorter duration). Generally, weeknum is: 1, 2, 3, ..., n echo Note that weeknum can generally be thought of as a "rotation number"; echo it does not necessarily have to align on a weekly repetition. echo. echo where baktype is: normal or diff echo. echo example: echo backupscript 1 diff echo. echo Changelog: echo 8/25/07: Created version 2.50. Inserted code after the backup echo operations and before the robocopy operation to parse the ntbackup echo logs for certain error messages that will indicate a problem even echo if ntbackup returns a "success" errorlevel. Under Exchange backup echo section, corrected position of line "set saveerrorlevel= %errorlevel%". rem ----- rem THIS FILE IS MADE AVAILABLE WITHOUT ANY WARRANTY OR SUPPORT. You must rem periodically test the quality of your backups no matter what backup rem software you use, including running test restores on test hardware. rem Although this backup script should be usable "out-of-the-box", it is rem best if the sysadmin reviews it and makes an effort to understand it, rem before actually using it. This is freely-available (no copyright) and rem may be copied/customized/used as desired. rem ----- rem ----- rem BEFORE USING THIS SCRIPT FOR THE FIRST TIME rem 1) Edit the Script Customizations (next section, below). rem 2) Attach two external hard drives such that they are assigned drive rem letters by the Windows OS. Format these drives using NTFS. rem 1) Designate one drive as the Fixed Drive, and create a file at the rem root of the drive that has a filename matching that shown in the rem Script Customizations section below. rem 2) Designate the second drive as the Rotated Drive, and create a file rem at the root of the drive that has a filename matching that shown rem in the Script customizations section below. rem 3) In most cases, there will be more than one Rotated Drive, so that rem one drive is connected, one is in transit, and one is off- site. rem Follow the above step for each such Rotated Drive. rem 2) If the script will be used to back-up Exchange data, then rem create the exchange.bks file locally as follows: rem 1) Open Windows Backup (Start button -> All Programs -> Accessories -> rem System Tools -> Backup. rem 2) If Backup launches in "Backup or Restore Wizard" mode, then uncheck rem "Always start in wizard mode", click Next, click Next, click Cancel, rem and relaunch Backup. rem 3) In the "Backup Utility" window, go to the "Backup" tab. Find the rem "Microsoft Exchange Server" section and expand it you see the rem "Microsoft Information Store" entry. Checkmark the checkbox rem next to this entry. rem 4) Go to menu bar Job -> Save Selections As..., and save the file as: rem c:\active\scripts\serverbackup\exchange.bks rem (or whatever file/path that is entered in the Script Customizations rem section below) rem 5) Close Windows Backup. The file is now created. rem NOTE: The exchange.bks file will have to be manually recreated whenever rem an Exchange Storage Group is added or deleted (so that the rem exchange.bks file is aware of the change). rem 3) Create the Alert Group (ga.*) in the Active Directory rem (see the "emailaddress" variable below for the name format). rem Example: ga.servername.backup-notify rem (This step can be skipped if the email address to which backup rem reports will be sent already exists.) rem 4) Modify the Registry so that only one backup log (rather than rem 10 logs, rotated) is used. To do this, load the registry file rem ntbackup-onlyonelog.reg (which is usually located in the same folder as rem serverbackup.cmd) under the user account that ntbackup will rem impersonate when conducting its backups. rem For reference, this is the content of the .reg file (note: two lines): rem [HKEY_CURRENT_USER\Software\Microsoft\Ntbackup\Log Files] rem "Log File Count"=dword:00000001 rem 5) Set up the Scheduled Tasks if Scheduled Tasks are to be used. rem For each week (or "rotation"), there are normally two Scheduled Tasks: rem (assuming a three-week rotation and a 12am start time; note that a rem three-week rotation would require a total of six Scheduled Tasks) rem "Backup Week 1 Normal" rem Run: c:\active\scripts\serverbackup\serverbackup.cmd 1 normal rem Schedule: Weekly, every 3 weeks, at 12am on Monday rem "Backup Week 1 Diff" rem Run: c:\active\scripts\serverbackup\serverbackup.cmd 1 diff rem Schedule: Weekly, every 3 weeks, at 12am on Tues, Weds, Thurs, rem Fri, and Sat rem For both: rem Run as: DOMAINNAMEHERE\Administrator rem Enabled rem Rest of the settings = use the defaults rem The backup script can handle any Scheduled Task configuration, so the rem above is just one example of many possible tasks. rem ----- rem SCRIPT CUSTOMIZATIONS rem 1) Specify the server to be backed-up rem set srvname=servername rem 2) Specify the names of the files to be placed at the root of the external rem backup drives to indicate their eligibility as backup drives: rem (this is crucial in preventing accidential erasure of data) rem set fixedfilename=autobackup-fixed-ok.txt rem set rotatedfilename=autobackup-rotated-ok.txt rem 3a) Specify whether the server needs an Exchange backup: rem use "true" or "false" (w/o quotes) rem set bakexchange=false rem rem 3b) If an Exchange backup is specified, on the server in question, ensure rem that the exchange.bks file exists, and specify its path: rem set exchangebksfile=c:\active\scripts\serverbackup\exchange.bks rem 4a) Specify whether the server needs to backup a file on another rem server: rem use "true" or "false" (w/o quotes) rem set bakother=false rem rem 4b) If this is the case, then specify the location of the file, using its rem full file name and its UNC path: rem set otherfile=\\otherservername\c$\backup\otherserver-drivec- sysstate.bkf rem rem 4c) Specify a friendly name for this backup: rem set bakothername=otherserver-drivec-sysstate rem rem Note: A backup of a file on another server will only be done during rem a backup of type normal (i.e. baktype=normal). Be sure that the user rem account under which serverbackup.cmd runs has the right to access rem the other location. rem 5) Specify the email address that will be used in the From: and To: rem fields of the emailed backup report: rem Example: ga.%srvname%.backup-notify@company.com rem set emailaddress=ga.%srvname%.backup-notify@company.com rem 6) Specify the Exchange email pickup folder. The user account under rem which serverbackup.cmd runs must have write access to this location. rem For authentication purposes, this location should be in the same rem Windows domain as the server on which the backup script is running. rem set exchpickup=\\mailservername\c$\Program Files\Exchsrvr\Mailroot\vsi 1\PickUp rem ----- rem Note: Carets are used to wrap lines that extend beyond 80 characters. rem Note: The line "cmd /c exit /b 5" is used to set the errorlevel to a rem non-zero value so that we know that the next command executed rem at least to the point that a new errorlevel was set. set weeknum=%1 set baktype=%2 set baktypeabbrev=%baktype% if /i %baktype%==diff set baktype=differential set baklog=%temp%\backuplog.log set robolog=%temp%\robocopylog.log set emailtop=%temp%\emailtop.txt set ntbackuplog=%userprofile%\Local Settings\Application ^ Data\Microsoft\Windows NT\NTBackup\data\backup01.log set ntbackupall=%temp%\ntbackupall.log rem Delete any pre-existing log files: del "%baklog%" del "%ntbackuplog%" del "%robolog%" del "%emailtop%" del "%ntbackupall%" rem Write the header of the baklog: echo Starting Server Backup> "%baklog%" echo.>> "%baklog%" echo Server, Backup Details, and start Date/Time:>> "%baklog%" echo %srvname%, Week %weeknum%, Type %baktype%>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" rem Make sure the script is being run on the correct server if /i %srvname%==%computername% goto proper-server echo This script must be run locally on the server to be ^ backed-up.>> "%baklog%" echo If this is the correct server, then open this script>> "%baklog%" echo in notepad and edit the "srvname" variable (the script>> "%baklog%" echo believes the file server is %srvname%).>> "%baklog%" echo Script aborting.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Wrong Server goto end :proper-server rem Make sure that weeknum (%1) has been specified if not [%1]==[] goto weeknum-specified echo Please include the weeknum (a positive integer) when ^ running the script:>> "%baklog%" echo serverbackup.cmd weeknum baktype>> "%baklog%" echo Script aborting.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Variable weeknum Not Specified goto end :weeknum-specified rem Make sure that baktype (%2) has been specified properly if %2==normal goto baktype-specified if %2==diff goto baktype-specified echo Please include the proper baktype when running ^ the script:>> "%baklog%" echo serverbackup.cmd weeknum baktype>> "%baklog%" echo where baktype is: normal or diff>> "%baklog%" echo Script aborting.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Variable baktype Not Specified goto end :baktype-specified rem Check all locally-attached drives to find the fixed (non-rotated) rem external backup drive, by looking for its tag. This step will rem find and use the alphabetically-first such drive, even if multiple rem such drives are attached. rem set fixeddriveletter=none for %%f in (z y x w v u t s r q p o n m l k j i h g f e d) do if ^ exist %%f:\%fixedfilename% set fixeddriveletter=%%f if not %fixeddriveletter%==none goto fixeddrive-is-ready echo The external Fixed Drive is not attached or it is not ^ tagged for>> "%baklog%" echo use by the backup mechanism (the file %fixedfilename %>>"%baklog%" echo must exist at the root of the drive).>> "%baklog%" echo Please take corrective action.>> "%baklog%" echo Backup aborting.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Fixed Drive Not Ready goto end :fixeddrive-is-ready echo External Fixed Drive, drive %fixeddriveletter%:, is ready.>> "%baklog%" echo.>> "%baklog%" rem If the type of backup is Normal, delete the pre-existing backup files rem since backup type Normal implies we are starting a new week: if /i %baktype%==normal del /q %fixeddriveletter%:\week%weeknum%\*.* rem If the type of backup is Differential, then we need to know whether rem it is the first, second, etc. Differential backup of the week, so that rem we don't overwrite any previous Differential backup files. We do this rem by checking for preexisting Differential backup files. rem Note: If there are more than 49 differential backup files, then this rem will not operate properly. if /i %baktype%==normal goto skip-diff-check for /L %%f in (50,-1,1) do if not exist ^ %fixeddriveletter%:\week%weeknum%\%srvname%-week%weeknum%-diff%%f-sys^ state.bkf set diffnum=%%f echo Variable diffnum is %diffnum%.>> "%baklog%" echo.>> "%baklog%" set baktypeabbrev=diff%diffnum% :skip-diff-check rem Backup files have a labeling scheme, which is of the form: rem servername-week1-diff3 rem This is used in the file name and in the tape name. rem We represent this with a new variable: set bakname=%srvname%-week%weeknum%-%baktypeabbrev% rem ----- rem Run the backup of the System State: rem The errorlevel entry will help catch if the backup aborts. set jobname=sysstate echo Starting backup of %jobname%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" rem Note: system state is always type=Normal. rem The ntbackup command is sufficiently long that we first prepare the rem command as a variable, then we run ntbackup using this variable as rem the parameter: set bakss=backup systemstate /n "%bakname%-%jobname%" /d set bakss=%bakss% "%bakname%-%jobname%" /v:yes /r:no /rs:no /hc:off /m normal set bakss=%bakss% /j "%jobname%" /l:s /f set bakss=%bakss% "%fixeddriveletter%:\week%weeknum%\%bakname%-%jobname %.bkf" cmd /c exit /b 5 ntbackup %bakss% set saveerrorlevel=%errorlevel% type "%ntbackuplog%"> "%ntbackupall%" echo.>> "%ntbackupall%" rem Check the errorlevel and notify admin if there is a problem. if %saveerrorlevel%==0 goto bak-sysstate-ok echo Backup of %jobname% failed.>> "%baklog%" echo Check the backup log for details.>> "%baklog%" echo Backup aborting.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Backup of %jobname% failed goto end :bak-sysstate-ok echo Backup of %jobname% completed successfully.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" rem ----- rem ----- rem Run the backup of the C Drive: rem The errorlevel entry will help catch if the backup aborts. set jobname=drivec echo Starting backup of %jobname%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" rem The ntbackup command is sufficiently long that we first prepare the rem command as a variable, then we run ntbackup using this variable as rem the parameter: set bakdc=backup c:\ /n "%bakname%-%jobname%" /d "%bakname%-%jobname%" set bakdc=%bakdc% /v:yes /r:no /rs:no /hc:off /m %baktype% /j "%jobname %" set bakdc=%bakdc% /l:s /f set bakdc=%bakdc% "%fixeddriveletter%:\week%weeknum%\%bakname%-%jobname %.bkf" cmd /c exit /b 5 ntbackup %bakdc% set saveerrorlevel=%errorlevel% type "%ntbackuplog%">> "%ntbackupall%" echo.>> "%ntbackupall%" rem Check the errorlevel and notify admin if there is a problem. if %saveerrorlevel%==0 goto bak-drivec-ok echo Backup of %jobname% failed.>> "%baklog%" echo Check the backup log for details.>> "%baklog%" echo Backup aborting.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Backup of %jobname% failed goto end :bak-drivec-ok echo Backup of %jobname% completed successfully.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" rem ----- rem ----- rem The next step is to back-up Exchange data, but only if the rem bakexchange variable is set to true: if not %bakexchange%==true goto skip-bakexchange rem Run the backup of the Exchange database: rem The errorlevel entry will help catch if the backup aborts. set jobname=exchange echo Starting backup of %jobname%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" rem The ntbackup command is sufficiently long that we first prepare the rem command as a variable, then we run ntbackup using this variable as rem the parameter: set bakex=backup "@%exchangebksfile%" /n "%bakname%-%jobname%" /d set bakex=%bakex% "%bakname%-%jobname%" /v:yes /r:no /rs:no /hc:off /m set bakex=%bakex% %baktype% /j "%jobname%" /l:s /f set bakex=%bakex% "%fixeddriveletter%:\week%weeknum%\%bakname%-%jobname %.bkf" cmd /c exit /b 5 ntbackup %bakex% set saveerrorlevel=%errorlevel% type "%ntbackuplog%">> "%ntbackupall%" echo.>> "%ntbackupall%" rem Check the errorlevel and notify admin if there is a problem. if %saveerrorlevel%==0 goto bak-exchange-ok echo Backup of %jobname% failed.>> "%baklog%" echo Check the backup log for details.>> "%baklog%" echo Backup aborting.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Backup of %jobname% failed goto end :bak-exchange-ok echo Backup of %jobname% completed successfully.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" :skip-bakexchange rem ----- rem ----- rem This next step allows the local server to backup a file rem on another computer (usually a .bkf file representing a rem backup generated locally on that other computer), but rem only if the bakother variable is set to true: if not %bakother%==true goto skip-bakother rem This backup will only be done during a normal backup. if not %baktype%==normal goto skip-bakother set jobname=%bakothername% echo Starting backup of %jobname%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" cmd /c exit /b 5 copy "%otherfile%" %fixeddriveletter%:\week%weeknum% set saveerrorlevel=%errorlevel% rem Check the errorlevel and notify admin if there is a problem. if %saveerrorlevel%==0 goto bakother-ok echo Backup %jobname% failed.>> "%baklog%" echo Backup aborting.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Backup of %jobname% failed goto end :bakother-ok echo Backup of %jobname% completed successfully.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo.>> "%baklog%" :skip-bakother rem ----- rem Now that all of the backups have completed, let's check the rem ntbackup logs (which are all contained in the file that is rem represented by the "ntbackupall" variable) for mention of rem any errors that - for whatever reason - did not cause rem ntbackup to generate a formal errorlevel alert. rem Note: You may manually add additional findstr commands (simply rem repeat the two-line block and use a different search string). Be rem sure to test any additions to ensure that they do not detect valid rem log entries. findstr /i /c:"error " "%ntbackupall%" if not errorlevel 1 goto ntbackuplogerror-failure findstr /i /c:"error:" "%ntbackupall%" if not errorlevel 1 goto ntbackuplogerror-failure findstr /i /c:"The operation did not successfully complete." "%ntbackupall%" if not errorlevel 1 goto ntbackuplogerror-failure findstr /i /c:"Insufficient disk space." "%ntbackupall%" if not errorlevel 1 goto ntbackuplogerror-failure goto ntbackuplogerror-success :ntbackuplogerror-failure set fatalerror=Failure: ntbackup Error (see "ntbackup log" section) goto end :ntbackuplogerror-success rem Check all locally-attached drives to find the rotated rem external backup drive, by looking for its tag. This step will rem find and use the alphabetically-first such drive, even if multiple rem such drives are attached. This step will double-check that one rem external drive is not tagged as both the Fixed Drive and the rem Rotated Drive. rem set rotateddriveletter=none for %%f in (z y x w v u t s r q p o n m l k j i h g f e d) do if ^ exist %%f:\%rotatedfilename% set rotateddriveletter=%%f if not %rotateddriveletter%==none goto rotateddrive-is-ready echo The external Rotated Drive is not attached or it is not ^ tagged for>> "%baklog%" echo use by the backup mechanism (the file %rotatedfilename %>>"%baklog%" echo must exist at the root of the drive).>> "%baklog%" echo Please take corrective action.>> "%baklog%" echo Backup aborting.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Rotated Drive Not Ready goto end if not %rotateddriveletter%==%fixeddriveletter% goto rotateddrive-is- ready echo One drive, drive %rotateddriveletter%:, is tagged as both the ^ Fixed Drive>> "%baklog%" echo and the Rotated Drive. This is not allowed. Please take ^ corrective action>> "%baklog%" echo (usually by deleting one of the file tags at the root of the ^ drive).>> "%baklog%" echo Backup aborting.>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Rotated Drive is also the Fixed Drive goto end :rotateddrive-is-ready echo External Rotated Drive, drive %rotateddriveletter%:, is ^ ready.>> "%baklog%" echo.>> "%baklog%" rem Run the robocopy command. echo Starting Fixed-to-Rotated Copy Operation.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" rem The robocopy command is sufficiently long that we first prepare the rem command as a variable, then we run robocopy using this variable as rem the parameter: set robocmd=%fixeddriveletter%: %rotateddriveletter%: /mir /xd set robocmd=%robocmd% %fixeddriveletter%:\RECYCLER set robocmd=%robocmd% "%fixeddriveletter%:\System Volume Information" set robocmd=%robocmd% %rotateddriveletter%:\RECYCLER set robocmd=%robocmd% "%rotateddriveletter%:\System Volume Information" set robocmd=%robocmd% /xf %fixeddriveletter%:\%fixedfilename% set robocmd=%robocmd% %rotateddriveletter%:\%rotatedfilename% set robocmd=%robocmd% /log:"%robolog%" /tee /np cmd /c exit /b 100 robocopy %robocmd% set saveerrorlevel=%errorlevel% rem Check the errorlevel of the robocopy command and notify admin if a rem problem occurred. rem Errorlevels 0-3 are OK. if %saveerrorlevel% LEQ 3 goto robocopy-checktwo goto robocopy-failure :robocopy-checktwo if %saveerrorlevel% GEQ 0 goto robocopy-success :robocopy-failure echo The copy operation from %fixeddriveletter%: to ^ %rotateddriveletter%: failed.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo (Errorlevels 0-3 are OK)>> "%baklog%" echo Check the logs for details.>> "%baklog%" echo Backup Aborting>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" set fatalerror=Failure: Fixed-to-Rotated Copy Operation Failed goto end :robocopy-success echo Fixed-to-Rotated Copy Operation Successful.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" echo (Errorlevels 0-3 are OK)>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" set fatalerror=Success: Backup Successful rem If the backup process has gone this far, then it means that rem both external drives are properly attached. So, at this rem point (when all priority backup and mirroring operations are complete), rem if the type of backup is Normal, then we will run a chkdsk (in read-only rem mode) on both external drives to check their status. rem Write notice of any possible errors to baklog and fatalerror. if not %baktype%==normal goto skip-chkdsk echo Starting chkdsk of Fixed drive, drive %fixeddriveletter%:.>> "%baklog%" echo.>> "%baklog%" cmd /c exit /b 5 chkdsk %fixeddriveletter%: set saveerrorlevel=%errorlevel% if %saveerrorlevel%==0 goto chk-fixeddrive-okay echo chkdsk detected possible errors on the Fixed Drive, ^ drive %fixeddriveletter%:.>> "%baklog%" echo With this drive attached, run chkdsk %fixeddriveletter%: ^ /f /r /x on %srvname%>> "%baklog%" echo as soon as possible.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" set fatalerror=%fatalerror%; but see chkdsk for Fixed Drive goto skip-chk-fixeddrive-okay :chk-fixeddrive-okay echo chkdsk of Fixed drive, drive %fixeddriveletter%:, reported no ^ errors.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" :skip-chk-fixeddrive-okay echo Starting chkdsk of Rotated drive, drive ^ %rotateddriveletter%:.>> "%baklog%" echo.>> "%baklog%" cmd /c exit /b 5 chkdsk %rotateddriveletter%: set saveerrorlevel=%errorlevel% if %saveerrorlevel%==0 goto chk-rotateddrive-okay echo chkdsk detected possible errors on the Rotated Drive, drive ^ %rotateddriveletter%:.>> "%baklog%" echo With this drive attached, run chkdsk %rotateddriveletter%: ^ /f /r /x on %srvname%>> "%baklog%" echo as soon as possible.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" set fatalerror=%fatalerror%; but see chkdsk for Rotated Drive goto skip-chk-rotateddrive-okay :chk-rotateddrive-okay echo chkdsk of Rotated drive, drive %rotateddriveletter%:, reported no ^ errors.>> "%baklog%" echo Errorlevel is %saveerrorlevel%.>> "%baklog%" date /t>> "%baklog%" time /t>> "%baklog%" echo.>> "%baklog%" :skip-chk-rotateddrive-okay :skip-chkdsk :end rem Build the summary email for the admin and send it using an Exchange rem email pickup folder. echo X-sender: %emailaddress%> "%emailtop%" echo x-receiver: %emailaddress%>> "%emailtop%" echo From: %emailaddress%>> "%emailtop%" echo To: %emailaddress%>> "%emailtop%" echo Subject: Backup of %srvname%: %fatalerror%>> "%emailtop%" echo.>> "%emailtop%" echo Server Backup Report for %srvname%>> "%emailtop%" echo Status message is: %fatalerror%>> "%emailtop%" echo.>> "%emailtop%" echo --------------- start backup script log -------------->> "%emailtop%" echo.>> "%emailtop%" type "%baklog%">> "%emailtop%" echo.>> "%emailtop%" echo ----------------- start ntbackup log ----------------->> "%emailtop%" echo.>> "%emailtop%" type "%ntbackupall%">> "%emailtop%" echo.>> "%emailtop%" echo ----------------- start robocopy log ----------------->> "%emailtop%" echo.>> "%emailtop%" type "%robolog%">> "%emailtop%" echo.>> "%emailtop%" echo ---------------- end of Backup Report ---------------->> "%emailtop%" echo.>> "%emailtop%" copy "%emailtop%" "%exchpickup%" rem Delete the log files del "%baklog%" del "%ntbackuplog%" del "%robolog%" del "%emailtop%" del "%ntbackupall%" rem End of Backup Script
Guest Pegasus \(MVP\) Posted October 8, 2007 Posted October 8, 2007 Re: Batch ntbackup to external hard drives (new version - October 2007) "dderkits" <dderkits@alumni.caltech.edu> wrote in message news:1191755051.203896.254490@k79g2000hse.googlegroups.com... > Below is a new version of the backup script that I posted to USENET on > 5 July 2005 (initial version) and 9 Sept 2006 (revised version). This > new version can also be found at: > http://www.derkits.com/apps/serverbackup.txt <snip> At around 700 lines, this is probably the largest batch file I have ever seen. I seriously wonder how maintainable and modifiable it is by anyone other than its author, and I suspect that even its author would have a serious problem if he attempted to modify it after not working with it for a whole year. I believe it would gain enormously if it was structured instead of having 700 lines one after the other. This could be done like so: call :SetVar call :DelLog call :WriteHeader call :CheckLocal goto :eof ----------------------------- Set various env. variables ----------------------------- :SetVar set baklog=%temp%\backuplog.log set robolog=%temp%\robocopylog.log set emailtop=%temp%\emailtop.txt set ntbackuplog=%userprofile%\Local Settings\Application Data\Microsoft\Windows NT\NTBackup\data\backup01.log set ntbackupall=%temp%\ntbackupall.log goto :eof ----------------------------- Delete old log files ----------------------------- :DelLog del "%baklog%" del "%ntbackuplog%" del "%robolog%" del "%emailtop%" del "%ntbackupall%" goto eof A big advantage of such structured code is that it becomes very easy to test each module separately, by simply modifying the initial list of "call" statements.
Recommended Posts