Windows Serverで動作する、バックアップ+世代管理してくれるバッチファイル | 成長の果実

成長の果実

不完全でも良いから前に進む。

特定のフォルダの完全バックアップを毎日取得+世代管理したく、色々なフリーソフトを試したのだけれど、何故かどのソフトも世代管理機能だけが機能しない・・・

バックアップはできるが世代管理機能が動作しないため、常に上書き保存状態で困ったことに。


Windows Server 2008 R2 Foundation x64で試したのだけど、このOSがいけないのか、それともWindows Server 2008自体が問題なのかは不明。



おとなしく有料版使えば良かったのかもしれないが、自作することにした。


実装する機能は以下の三点。

・指定したフォルダの完全コピー
・取得日毎にYYYYMMDD名でフォルダを作成し、その中にバックアップを格納する
・世代管理機能(YYYYMMDDフォルダの数を管理する)



そして作ったのが下記のgenerationBackup.batというバッチファイル。

一応Windows Server 2008 R2 SP1 x64, Windows Server 2008 R2 Foundation x64で動作確認した。
ただのDOSコマンドなので恐らくどのバージョンのWindowsでも動くと思う。


◎generationBackup.bat

@echo off
REM ============================================================================
REM batch-name: generationBackup.bat
REM about: 指定された世代数分(日別)、対象フォルダの完全バックアップを取得する。
REM check of operation: Windows Server 2008 R2 SP1 x64, Windows Server 2008 R2 Foundation x64
REM auther: tetsuco
REM create: 2011/10/18
REM change: -
REM ============================================================================
REM ■動作内容
REM 1. バックアップフォルダ直下に、バックアップ実施日の日付名(YYYYMMDD)でフォルダが作成される。(以下、YYYYMMDDフォルダ)
REM 2. YYYYMMDDフォルダ直下にバックアップ対象フォルダの完全バックアップが取得される。
REM 3. バックアップフォルダ直下にYYYYMMDDフォルダが世代管理数よりも多く存在した場合、日付の古い順に削除される。
REM ----------------------------------------------------------------------------
REM ■使用方法
REM 1. 当バッチファイルをタスク・スケジューラにてタスクを新規作成する。
REM 2. タスク・スケジューラにて当バッチファイルを実行したい時刻を設定する。
REM 3. 指定された時刻に当バッチファイルが実行される。
REM ----------------------------------------------------------------------------
REM ■設定変更方法
REM 「要設定: 」とコメントのある箇所が、設定変更する箇所。
REM 1. 30行目: 「set _bkupFolder=」にバックアップ先のフォルダを設定する。
REM 2. 35行目: 「set _generation」に世代管理数を設定する。世代管理数が7の場合は7日保存。
REM 3. 50行目: 「 xcopy」(バックアップ)対象のフォルダを記述。
REM 例)xcopy c:\kyoyu\src1 %_bkupFolder%\%_presentDate%\src1 /E /V /C /I /H /R /O /Y
REM バックアップ元: c:\kyoyu\src1
REM バックアップ先: %_bkupFolder%\%_presentDate%\src1
REM 備考: バックアップ元のsrc1をコピーする場合、バックアップ先もsrc1の名前でコピーする
REM ============================================================================

REM ==================================================================
REM 要設定: バックアップフォルダを設定
REM ==================================================================
set _bkupFolder=c:\kyoyu\backup

REM ==================================================================
REM 要設定: 世代管理数(日別)を設定
REM ==================================================================
set _generation=7

REM ==================================================================
REM 現在の日付取得(YYYYMMDD)
REM ==================================================================
set _presentDate=%date:~-10,4%%date:~-5,2%%date:~-2,2%

REM ==================================================================
REM バックアップフォルダの中に、YYYYMMDDの名前でフォルダを作成(世代管理)
REM ==================================================================
md %_bkupFolder%\%_presentDate%

REM ==================================================================
REM 要設定: バックアップ対象のフォルダを、YYYYMMDDフォルダにコピー
REM [xcopyのオプション説明]
REM /E: ディレクトリまたはサブディレクトリが空であってもコピーする
REM /V: ファイルの内容が正しいか検査する
REM /C: コピー時のエラーを無視する
REM /I: コピー先のディレクトリが存在しない場合は新規にディレクトリを作成する
REM /H: 隠しファイルやシステムファイルも全てコピーする
REM /R: 読み取り専用属性のファイルも上書きコピーできるようにする
REM /K: 通常は解除される読み取り専用属性を維持したままコピーする
REM /O: ファイルの所有権やアクセス権限もそのままコピーする
REM /Y: 同名のファイルが存在する場合、上書きの確認を行わない
REM ==================================================================
xcopy c:\kyoyu\src1 %_bkupFolder%\%_presentDate%\src1 /E /V /C /I /H /R /K /O /Y
xcopy c:\kyoyu\src2 %_bkupFolder%\%_presentDate%\src2 /E /V /C /I /H /R /K /O /Y


REM ==================================================================
REM バックアップフォルダの中のYYYYMMDDフォルダ数を数える
REM ==================================================================
for /f "delims=" %%i in ('dir /b %_bkupFolder% ^| find /c /v ""') do set _folderNum=%%i

REM ==================================================================
REM 「YYYYMMDDフォルダ数 - 世代管理数」の計算結果を取得
REM ==================================================================
set /a _delFolderNum=_folderNum-_generation

REM ==================================================================
REM 遅延展開をON(FORループの中で、ループ変数を計算に使用するため。尚、変数は%でなく!を使うこと)
REM ==================================================================
setlocal enabledelayedexpansion

REM ==================================================================
REM 世代数を超過した、上から◯つ目までのフォルダを削除する(古いフォルダ順に表示されるため古いに順に削除する)
REM ==================================================================
set _cnt=0

for /f "usebackq delims= eol=" %%i in (`dir /b %_bkupFolder%`) do @(
if %_delFolderNum% GTR !_cnt! (
rd /s /q %_bkupFolder%\%%i
) else (
goto break;
)

set /a _cnt=_cnt+1
)
:break



上記バッチファイルの赤字部分は自分の環境によって変更する箇所のため、赤字部分について説明する。

1.「set _bkupFolder=c:\kyoyu\backup」について

「c:\kyoyu\backup」の部分は、取得したバックアップファイルの保存先のため、保存先のフォルダをフルパスで記述すること。


2.「set _generation=7」について

「7」の部分が世代管理数。世代管理したい日数を記述すること。
日別のため、7の場合は7日(一週間)保存、14の場合だと14日(二週間)保存となる。


3.「xcopy c:\kyoyu\src1 %_bkupFolder%\%_presentDate%\src1 /E /V /C /I /H /R /K /O /Y」について

「c:\kyoyu\src1」の部分がバックアップ元のフォルダのフルパス。
取得したいフォルダのフルパスを記述すること。

「%_bkupFolder%\%_presentDate%\src1」については、末尾の「src1」の部分が重要で、バックアップした際にリネームされるフォルダ名にあたる。

そのためバックアップ元と同じフォルダ名にしたい場合は、同じフォルダ名を記述すること。
バックアップ元と異なるフォルダ名にしたい場合は、好きなフォルダ名を記述する。


また、「xcopy c:\kyoyu\src2 %_bkupFolder%\%_presentDate%\src2 /E /V /C /I /H /R /K /O /Y」の記述もあるが、これはバックアップしたいフォルダが複数ある場合。

取得したいフォルダの数だけ「xcopy ~(略)」の記述を書いていくこと。



説明は以上だが、実際に使ってみた際の画像を貼っておこうかな。


1.赤枠の「src1」「src2」が、赤矢印先のフォルダ(backup配下)にバックアップされる予定。
成長の果実-generationBackup01

     

2.generationBackup.batを実行すると・・・

     

3.実施日のフォルダ「20111027」が作成され、そのフォルダの中に先ほどの「src1」「src2」がバックアップされた。
  そして世代管理機能(今回は7日保存)により、一番日付の古いフォルダ「20111020」も削除されている。
成長の果実-generationBackup02


想定通りの動作。問題なし!



タスク・スケジューラに登録して使うと、毎日指定した時刻にgenerationBackup.batが実行される。
こちらの動作確認まで出来ているのでたぶん大丈夫。


以上。


----------
サンプルソース:https://github.com/tetsuco/generationBackup