NTBACKUP を利用したバックアップバッチ
昔、頼まれて適当に組み上げた、NTBACKUPを利用した世代管理・差分バックアップを行うバッチファイル。NTBACKUPだけでは、バックアップのスケジュールは登録できるが、ファイル名を別々にする場合はその分登録する必要があり、世代管理も出来なかったので、バッチファイルで行うように作成。「コントロールパネル」の「タスク」でスケジュール実行されることを想定してます。
特定の曜日にフルバックアップを行い、その曜日以降は、その差分をバックアップしていく(差分バックアップの対象かは、アーカイブ属性があるか)。
世代管理は、フルバックアップ時にファイルをローテーションする。差分バックアップも世代管理対象の場合は、フルバックアップと同じ世代番号となる(しない場合は上書きされていく)。
バックアップの開始・終了は、NTBACKUPがイベントログに記録する。ローテーションを行う場合は、バッチがファイルをローテーションする旨をイベントログに記録する。
バックアップバッチ
1 |
@ECHO OFF REM ***************************************************************************** REM * MS-Windows NTBACKUP バックアップバッチ * REM * * REM * MakeDate:2007/09/28 Creator:T.Imamura * REM ***************************************************************************** SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS REM ****** 環境設定 ****** REM バックアップ対象 SET buckup_dirs=C:\Temp\BackupTest\target\ C:\Temp\BackupTest\works\ REM バックアップの保存先 SET save_path=C:\Temp\BackupTest\save REM バックアップファイル(プレフィックス)名 SET save_file=backup REM フルバックアップ時システム状態データも対象とするか (YES/NO) SET backup_with_sys=yes REM バックアップ後にデータ確認するか (yes|no) SET backup_verify=no REM バックアップのアクセス制限するか (yes|no) SET backup_restriction=no REM バックアップ後にデータ確認するか (f|s|n) f=完全、s=要約、n=なし SET backup_log_lv=s REM フルバックアップ曜日 (日=0 ...) SET full_backup_week=5 REM バックアップ世代数 SET generation=2 REM 差分バックアップも世代管理するか (YES/NO) SET difference_generation=YES REM *********************************** SET YYMMDD=%DATE:~-10% SET HHMMSS=%TIME% SET JOB_ID=BACKUP_%YYMMDD:~0,4%%YYMMDD:~5,2%%YYMMDD:~8,2%_%HHMMSS:~0,2%%HHMMSS:~3,2% REM 今日の曜日の番号と名前 CALL :SetWeekNum %YYMMDD% CALL :SetWeekName %weekdays% IF /I %weekdays% EQU %full_backup_week% ( REM バックアップローテーション CALL :FileRotate REM フルバックアップ CALL :Backup normal FULL ) ELSE ( REM 差分バックアップ CALL :Backup differential %weekname% ) ENDLOCAL GOTO :EOF REM *********************************** REM バックアップ :Backup CALL :SetMakeFileName 1 %2 SET backup_type=%1 SET backup_file=%filename% SET backup_job=%JOB_ID% SET backup_name=BACKUP %YYMMDD% %HHMMSS% SET backup_desp=バックアップ 時刻[%YYMMDD% %HHMMSS%] 方法[%backup_type%] IF /I "X%backup_type%"=="Xnormal" IF /I "X%backup_with_sys%"=="XYES" SET buckup_dirs=systemstate %buckup_dirs% %SystemRoot%\system32\ntbackup.exe backup %buckup_dirs% /V:%backup_verify% /r:%backup_restriction% /rs:no /hc:off /l:%backup_log_lv% /j "%backup_job%" /N "%backup_name%" /D "%backup_desp%" /m %backup_type% /F "%backup_file%" IF NOT ERRORLEVEL 1 GOTO :EOF REM バックアップ失敗 GOTO :EOF REM *********************************** REM バックアップローテーション :FileRotate EVENTCREATE /S %COMPUTERNAME% /U Administrator /T INFORMATION /ID 1 /D "バックアップファイルをローテーションします。JobID=%JOB_ID%" FOR /L %%I IN (%generation%, -1, 2) DO CALL :FileRotateSub %%I GOTO :EOF REM *************** REM ローテーション :FileRotateSub SET to=%1 SET /A fm=%to% - 1 rem echo Rotate: %fm% -^> %to% REM フルバックアップ分 CALL :FileRotateMove %fm% %to% FULL REM 差分バックアップ分 IF /I NOT "X%difference_generation%"=="XYES" GOTO :EOF CALL :SetWeekName 0 CALL :FileRotateMove %fm% %to% %weekname% CALL :SetWeekName 1 CALL :FileRotateMove %fm% %to% %weekname% CALL :SetWeekName 2 CALL :FileRotateMove %fm% %to% %weekname% CALL :SetWeekName 3 CALL :FileRotateMove %fm% %to% %weekname% CALL :SetWeekName 4 CALL :FileRotateMove %fm% %to% %weekname% CALL :SetWeekName 5 CALL :FileRotateMove %fm% %to% %weekname% CALL :SetWeekName 6 CALL :FileRotateMove %fm% %to% %weekname% GOTO :EOF REM *************** REM ファイルリネーム :FileRotateMove CALL :SetMakeFileName %1 %3 SET fm_file=%filename% CALL :SetMakeFileName %2 %3 SET to_file=%filename% rem echo Move: %fm_file% -^> %to_file% IF EXIST %to_file% del %to_file% IF NOT EXIST %fm_file% GOTO :EOF FOR %%F in (%to_file%) DO SET to_file_=%%~nF%%~xF ren %fm_file% %to_file_% GOTO :EOF REM *********************************** REM バックアップファイル名を設定する (ret:%filename%) :SetMakeFileName SET filename=%save_path%\%save_file%_%1_%2.bkf rem echo FileName: %filename% GOTO :EOF REM *************** REM 曜日の番号を設定する(日=0) (ret:%weekdays%) :SetWeekNum SET ymd=%1 REM 年月日の分割 SET yy=%ymd:~0,4% SET mm=%ymd:~5,2% SET dd=%ymd:~8,2% REM 月日の数値化(8進数対策) SET /a mm=1%mm%-100 SET /a dd=1%dd%-100 REM 曜日番号 IF %mm% LEQ 2 (SET /a yy=yy-1 && SET /a mm=mm+12) SET /a weekdays=yy + yy/4 - yy/100 + yy/400 + (13*mm+8)/5 + dd SET /a weekdays=weekdays %% 7 rem echo DATE: Date=%ymd% WeekDays=%weekdays% SET ymd= SET yy= SET mm= SET dd= GOTO :EOF REM *************** REM 曜日の名前を設定する(日=0) (ret:%weekname%) :SetWeekName SET weekname=unknown IF %1 EQU 0 SET weekname=Sun IF %1 EQU 1 SET weekname=Mon IF %1 EQU 2 SET weekname=Tue IF %1 EQU 3 SET weekname=Wed IF %1 EQU 4 SET weekname=Thu IF %1 EQU 5 SET weekname=Fri IF %1 EQU 6 SET weekname=Sat rem echo DATE: WeekDays=%1 Week=%weekname% GOTO :EOF REM *********************************** |
最終更新時間:2008年11月17日 23時35分00秒 指摘や意見などあればSandBoxのBBSへ。
backup.bat