トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

Source/Bat/NtBuckup

INDEX

NTBACKUP を利用したバックアップバッチ

昔、頼まれて適当に組み上げた、NTBACKUPを利用した世代管理・差分バックアップを行うバッチファイル。NTBACKUPだけでは、バックアップのスケジュールは登録できるが、ファイル名を別々にする場合はその分登録する必要があり、世代管理も出来なかったので、バッチファイルで行うように作成。「コントロールパネル」の「タスク」でスケジュール実行されることを想定してます。

特定の曜日にフルバックアップを行い、その曜日以降は、その差分をバックアップしていく(差分バックアップの対象かは、アーカイブ属性があるか)。

世代管理は、フルバックアップ時にファイルをローテーションする。差分バックアップも世代管理対象の場合は、フルバックアップと同じ世代番号となる(しない場合は上書きされていく)。

バックアップの開始・終了は、NTBACKUPがイベントログに記録する。ローテーションを行う場合は、バッチがファイルをローテーションする旨をイベントログに記録する。

バックアップバッチ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
@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