サーバのバックアップ


社員さんから、「共有フォルダのデータ削除してしまったのですが、復元できませんか。。。」と無理な依頼が来たので、対策の一つとしてファイルサーバをバックアップを取ることにしました。
ファイルサーバは、社内にあるオンプレミス型のファイルサーバなので、VMWareなどの仮想サーバのようにスナップショットが取れない為、batとタスクスケジューラで定期的なバックアップを取る仕組みにしています。

バックアップbatの機能として必要な項目

ファイルをバックアップする為には、最低必要になるだろう項目をまとめてみました。
 ・バックアップ保存先のフォルダには、バックアップをした日付を入れる。
 ・実行結果のログを残す。
 ・元フォルダからバックアップフォルダにコピーをする。
 ・バックアップ保存先フォルダはバックアップを取らない。
 ・1週間経過したら、ファイルを削除する。

本記事は、項目ごとに簡単にコード説明をしています。

バッチのコード

必要な項目ごとのコード説明する前に全体のコードを先に記載します。
コードだけが必要だ!!の方は、ここと「4.1週間経過したら、ファイルを削除する。」だけを確認して欲しいです。

FileBackup.bat
rem 日付のセット
Set today=%date:~0,4%%date:~5,2%%date:~8,2%

REM ----ログファイルの作成----
Set Logfolder=%~dp0Log
md %Logfolder%
Set Logfile=%Logfolder%\FBU_%today%.log

REM ----コピー先の指定----
REM コピー先のフォルダ指定
set CopyFolder="コピー先フォルダ"
REM コピー先のフォルダ指定 日付付け
Set Copy1=%CopyFolder%\%today%
md %Copy1% | echo %Copy1%を作成しました。>> %Logfile%


REM ----フォルダーコピー----
For /d %%f in ("指定コピーフォルダ") do (
    if %%f neq “除外コピーフォルダ“ (
        set tergetCopy=%Copy1%%%f
        set tergetCopy=%tergetCopy:~4%
        REM コピーコマンド
        xcopy /D /S /R /Y /I /K %%f %Copy1%
        echo%%f』 → 『%Copy1%』 コピーしました。>> %Logfile%
    )
)

rem ----7日前の日付を取得----
call %~dp0Day.bat
echo %DT%です。
set DT=%CopyFolder%\%DT%
REM ----7日前のファイル削除----
For /d %%d in (%CopyFolder%\*) do (
    if %%d equ %DT%  (
        rd /s /q %%d|echo 2週間経過したため、「%%d」のファイルを削除しました。
    )
)

1.バックアップ保存先のフォルダには、バックアップをした日付を入れる。

初めに変数でバックアップした日付を取得します。
この日付は、バックアップフォルダの格納フォルダ名になります。

rem 日付のセット
Set today=%date:~0,4%%date:~5,2%%date:~8,2%

2.実行結果のログを残す

実行ファイルと同階層に「Log」フォルダを作成し、その中に簡易的な実行結果を記録されるようにしています。

REM ----ログファイルの作成----
Set Logfolder=%~dp0Log
md %Logfolder%
Set Logfile=%Logfolder%\FBU_%today%.log

3.元フォルダからバックアップフォルダにコピーをする、バックアップ保存先フォルダはバックアップを取らない

『set CopyFolder="コピー先フォルダ"』で指定のバックアップ保存先フォルダを指定します。
『md %Copy1% | echo %Copy1%を作成しました。>> %Logfile%』では、パイプを使うことで保存先フォルダが作成できた際にログに残すようにしています。

REM ----コピー先の指定----
REM コピー先のフォルダ指定
set CopyFolder="コピー先フォルダ"
REM コピー先のフォルダ指定 日付付け
Set Copy1=%CopyFolder%\%today%
md %Copy1% | echo %Copy1%を作成しました。>> %Logfile%

今回除外フォルダが一つだけだったので、if文一つで指定の除外フォルダを指定していますが、
複数ある場合、その分if文を追加する必要があります。

フォルダ毎コピーする為『xcopy』を使用しています。
『echo 『%%f』 → 『%Copy1%』 コピーしました。>> %Logfile%』
はログ残しように追加した行だが、コピーが失敗しても表示される為、正直センスがないので省いても良いと思う。。。

REM ----フォルダーコピー----
For /d %%f in ("指定コピーフォルダ") do (
    if %%f neq “除外コピーフォルダ“ (
        set tergetCopy=%Copy1%%%f
        set tergetCopy=%tergetCopy:~4%
        REM コピーコマンド
        xcopy /D /S /R /Y /I /K %%f %Copy1%
        echo%%f』 → 『%Copy1%』 コピーしました。>> %Logfile%
    )
)

4.1週間経過したら、ファイルを削除する。

1週間前の日付を取得し、その日付同じフォルダ名のバックアップフォルダを削除するようにしています。
ただ、月を跨ぐ日付の場合一癖ある為、下記のURLに掲載されていた「バッチで日付の操作」を参考に別batを作り、
callで7日前の日付データを取得するようにしています。
ブログ(バッチもん研究所blog)

 
削除は、フォルダパスが完全一致な物を削除する為、7日以上前のフォルダは削除することができません。
しかし、毎日稼働するので問題が無いと考えています。

rem ----7日前の日付を取得----
call %~dp0Day.bat
echo %DT%です。
set DT=%CopyFolder%\%DT%
REM ----7日前のファイル削除----
For /d %%d in (%CopyFolder%\*) do (
    if %%d equ %DT%  (
        rd /s /q %%d|echo 2週間経過したため、「%%d」のファイルを削除しました。
    )
)

最後に

コードの作り的に汚いところがあると思いますが、『誰かの参考に』、『今後の自分の参考に』と思いで書きました。
「ここをこのようにしたほうが良いよ」や「ここはいらないんじゃない」など、ご指摘頂ければとても嬉しいのですのでコメントして頂ければと思います。