Windows で バックアップ といえば、 xcopy
を使ったバッチ処理がお手軽で便利だと思います。
ですが…ここでは、xcopy
に限らず robocopy
コマンドでのバックアップも、そのサンプルコードを記載しています。
目次
全件 単純コピー
おそらく一番想像しやすい、基本となる xcopy
の サンプルコード です。
同じ場所にバックアップするのであれば、更新分(差分)のみ処理されます。
一応補足ですが、"更新ファイルのみ"とはいえ、初回はすべてバックアップされ、以降は差分のみバックアップ(上書き)されるコードになります。
注意点は、バックアップ元でファイル削除しても、バックアップ先は削除されない点です。
完全に同じ状況にしたい場合、ミラーリング を検討してください。
@echo off
cd /d "%~dp0"
rem ----------------------------------------------
rem バックアップ元ディレクトリ
set SOURCE_DIR=D:\data
rem バックアップ先ディレクトリ
set TARGET_DIR=\\SERVER\backup\data
rem ----------------------------------------------
rem バックアップ処理(xcopy)
rem /D:月-日-年 指定された日付以降に変更されたファイルをコピーします。
rem 日付が指定されなかったときは、コピー元の日付がコピー先の日付より
rem 新しいファイルだけをコピーします。
rem /E ディレクトリまたはサブディレクトリが空であってもコピーします。
rem /C エラーが発生してもコピーを続けます。
rem /I 指定されたコピー先が存在せず、コピーするファイルが複数の場合、
rem コピー先をディレクトリとしてコピーします。
rem /H 隠しファイルやシステム ファイルもコピーします。
rem /R 読み取り専用ファイルを上書きします。
rem /K 属性をコピーします。指定しない場合、読み取り専用属性はリセット
rem されます。
rem /Y 既存のファイルを上書きする前に確認のメッセージを表示しません。
xcopy "%SOURCE_DIR%" "%TARGET_DIR%" /d /e /c /i /h /r /k /y
exit
日付ごとにフォルダを作って指定フォルダをバックアップ
xcopy
を使ったバックアップに少し手を加えて、日付ごとにフォルダを作ってバックアップします。
また、一定日数より古くなったフォルダは削除する処理も含まれています。
@echo off
cd /d "%~dp0"
rem ----------------------------------------------
rem バックアップ元ディレクトリ
set SOURCE_DIR=D:\data
rem バックアップ先ディレクトリ
set TARGET_DIR=\\SERVER\backup
rem 保存期間
set STORE_DATE=10
rem ----------------------------------------------
rem 日付を取得
set DATE_STR=%date:~-10,4%%date:~-5,2%%date:~-2,2%
rem バックアップ先
set TARGET_DIR=%TARGET_DIR%\%DATE_STR%
rem バックアップ処理(xcopy)
rem /D:月-日-年 指定された日付以降に変更されたファイルをコピーします。
rem 日付が指定されなかったときは、コピー元の日付がコピー先の日付より
rem 新しいファイルだけをコピーします。
rem /E ディレクトリまたはサブディレクトリが空であってもコピーします。
rem /C エラーが発生してもコピーを続けます。
rem /I 指定されたコピー先が存在せず、コピーするファイルが複数の場合、
rem コピー先をディレクトリとしてコピーします。
rem /H 隠しファイルやシステム ファイルもコピーします。
rem /R 読み取り専用ファイルを上書きします。
rem /K 属性をコピーします。指定しない場合、読み取り専用属性はリセット
rem されます。
rem /Y 既存のファイルを上書きする前に確認のメッセージを表示しません。
xcopy "%SOURCE_DIR%" "%TARGET_DIR%" /d /e /r /y /i /k
rem 古いファイルの削除処理
forfiles /P "%TARGET_BASE_DIR%" /D -%STORE_DATE% /C "cmd /c rmdir /s /q @path"
exit
日付と連番を付与して指定ファイルをバックアップ
指定したファイルに対して「ファイル名 + 日付 + 連番 (filename_YYYYMMDD_NN)」という名前を付けてバックアップを行うバッチです。
連番は被らないようにファイルの存在チェックを行って若い番号を振るようにしています。
@echo off
cd /d "%~dp0"
setlocal enabledelayedexpansion
rem ----------------------------------------------
rem バックアップ元ディレクトリ
set SOURCE_DIR=D:\data
rem バックアップ先ディレクトリ
set TARGET_DIR=\\SERVER\backup
rem バックアップするファイル一覧
call :BACKUP "ファイル1.txt"
call :BACKUP "ファイル2.txt"
rem ----------------------------------------------
goto :END
rem --------------------------------------------------------
rem SET_TARGET_FILENAME
rem バックアップ先ファイル名を生成、TARGET_FILENAME へパスを設定
rem 引数 なし
rem --------------------------------------------------------
:SET_TARGET_FILENAME
rem 日付を取得
set DATE_STR=%date:~-10,4%%date:~-5,2%%date:~-2,2%
for /L %%i in (1, 1, 99) do (
set NUM=%%i
rem 連番の生成(= カウンター数値を0埋め)
if %%i LSS 10 (
set NUM=0!NUM!
)
rem バックアップファイル名の生成(= 元ファイル名 + 日付 + 連番)
set FILENAME=%~n1_%DATE_STR%_!NUM!%~x1
rem バックアップディレクトリ + バックアップファイル名
set TARGET_FILENAME=%TARGET_DIR%\!FILENAME!
if not exist "!TARGET_FILENAME!" goto :EOF
)
goto :EOF
rem --------------------------------------------------------
rem BACKUP
rem 指定されたファイル名をバックアップ
rem 引数1 バックアップしたいファイル名
rem --------------------------------------------------------
:BACKUP
rem バックアップ元ファイル名を設定
set SOURCE_FILENAME=%SOURCE_DIR%\%~1
rem バックアップ先ファイル名を設定
call :SET_TARGET_FILENAME %1
rem COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B] 送り側 [/A | /B]
rem [+ 送り側 [/A | /B] [+ ...]] [受け側 [/A | /B]]
rem
rem 送り側 コピーするファイル (複数可) を指定します。
rem /A ASCII テキスト ファイルとして扱います。
rem /B バイナリ ファイルとして扱います。
rem /D 受け側のファイルが暗号化が解除されて作成されるようにします。
rem 受け側 新しいファイルのディレクトリまたはファイル名 (複数可) を指定し
rem ます。
rem /V 新しいファイルが正しく書き込まれたか検査します。
rem /N MS-DOS 形式以外の名前のファイルをコピーするときに、利用可能な
rem らば、短いファイル名を使用します。
rem /Y 受け側の既存のファイルを上書きする前に確認のメッセージを表示し
rem ません。
rem /-Y 受け側の既存のファイルを上書きする前に確認のメッセージを表示し
rem ます。
rem /Z ネットワーク ファイルを再起動可能モードでコピーします。
rem /L 送り側がシンボリック リンクの場合は、送り側リンクが指し示す
rem 実際のファイルではなく、リンクをターゲットにコピーします。
echo %~1 → %FILENAME%
copy %SOURCE_FILENAME% %TARGET_FILENAME%
goto :EOF
:END
endlocal
ミラーリング
初回は全ファイルバックアップなので時間がかかります。
2回目以降は差分のみ処理されます。
また、バックアップ元でファイル削除するとバックアップ先も削除されます(ミラーリング)。
@echo off
cd /d "%~dp0"
rem ----------------------------------------------
rem バックアップ元ディレクトリ
set SOURCE_DIR=D:\data
rem バックアップ先ディレクトリ
set TARGET_DIR=\\SERVER\backup
rem ----------------------------------------------
rem ミラーリング(robocopy)
rem /MIR :: ディレクトリ ツリーをミラー化します (/E および /PURGE と
rem 同等)。
robocopy "%SOURCE_DIR%" "%TARGET_DIR%" /mir
exit