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
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!