Windowsでデータ類のある特定フォルダだけの部分的なバックアップがしたい時に楽にできるバッチファイルを紹介します。
- 差分ミラーリングなので変化が無い時はコピーを行わず完了します
- 追加ソフトをインストールする必要はありません
バッチファイル本体
SET SRC=C:
SET DST=\\nas01\backup\pc01-c-drive
CALL :backup \Program Files (x86)\Steam\xxxxx\screenshots
CALL :backup \Users\user1\Documents\projects
CALL :backup \Users\user1\tool
CALL :backup \Users\user1\pki
CALL :backup \Users\user1\AppData\Roaming\Thunderbird\profiles\XXX.default
CALL :backup \Windows\System32\drivers\etc
exit /b
:backup
robocopy "%SRC%%*" "%DST%%*" /DCOPY:T /MIR /R:3 /W:5 /XD *@nobackup /XF *@nobackup*
exit /b
解説
先頭2行
SET SRC=C:
SET DST=\\nas01\backup\pc01-c-drive
コピー元(バックアップ対象)とコピー先の起点となるパスを指定します。
外付けHDDで DST=J:
などとしても良いと思います。
上記のようにネットワークドライブでも大丈夫です。
コピー先にコピー元と同じディレクトリ構造が再現されます。
バックアップ対象を指定している行
CALL :backup \Program Files (x86)\Steam\xxxxx\screenshots
後にある :backup
サブルーチンを呼び出します。
ポイントとして、スペースが含まれるパスでも クォートが不要 になっていますので、パスのコピペが楽になります。
ここをサブルーチン化すればSrc-Dstの組み合わせを変えて複数箇所へのバックアップもできそうです。
backupサブルーチン本体
:backup
robocopy "%SRC%%*" "%DST%%*" /DCOPY:T /MIR /R:3 /W:5 /XD *@nobackup /XF *@nobackup*
exit /b
robocopyを使っています。rsyncみたいなもので、Windowsに標準インストールされたのはVista以降のようです。
ここで触れて置かなければならないのが %*
の部分。
呼び出す時にクォートを省いたため、実は %1
に \Program
、%2
に Files
といったように引数が分割されてしまっているのですが、
もう1回スペースで繋げば元に戻るでしょという事で %*
で元のパスに戻ることを期待しています。
robocopyに渡す時にはちゃんとクォートで括ります。
オプションは robocopy /?
に載っていますが使ってるものだけ挙げてみます。
オプション | 意味 |
---|---|
/DCOPY:T |
タイムスタンプをコピー |
/MIR |
空ディレクトリもコピー、コピー元に存在しないファイルをコピー先で削除 |
/R:3 |
失敗時リトライ3回。デフォルトは100万回!なので実質指定必須。 |
/W:5 |
リトライ時5秒待機。 |
/XD *@nobackup /XF *@nobackup* |
フォルダ名かファイル名に「@nobackup 」が入っていたら除外 |
ユーザディレクトリ直下を指定する場合、読み取れないファイルがあるので NTUSER.DAT*
などの除外も必要になります。
運用
このやり方だと適宜パスを追加する必要があり、バックアップの存在を常に意識した方が良いのでタスクスケジューラには登録せず、クイック起動バーにこのbatファイルのショートカットを置いて気が向いた時に実行しています。
あえて手動にすることでハードディスク内を整理する動機付けにもなります。
アイコンは %SystemRoot%\system32\SHELL32.dll
の中からそれっぽいものを選びます。
更にバッチファイル自身はDropboxに入れています。
バックアップは古くからある命題なのでイメージごとやクラウドなど色々なアプローチがありますが、自分の場合これくらい原始的で素朴なバックアップが肌に合いました。