Windows で ファイル を バックアップ する バッチ

0 件のコメント

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