Robocopyを使ったバックアップをしよう

意外と簡単、Robocopyを使ったバックアップをしよう

先日の記事でWindowsのバックアップを取り上げましたが、Windows標準のバックアップでは、リストア手順を踏まなければならず、データの取り出しという点で面倒があります。システム全体ではなく、一部のデータだけをバックアップしておいて、必要になったら、すぐに戻したいという場合があります。
データを手動でコピーしておくという方法もありますが、同じデータの上書き時にいちいち確認されるのも面倒で、少し効率化できないものかと思っていたところ、robocopyというWindows標準のコマンドがあることを知りました。
とっくに知っているという方には、何を今更という感じかと思いますが。

robocopyとは

robocopyはWindows上のフォルダを同期することができるコマンドです。
同期するということは、コピー元になるフォルダ(含むフォルダ内のデータ)とコピー先となるフォルダを同じ状態にすることができるものです。同じデータを持つという点で、ファイルのバックアップとして使用することができます。

robocopyはWindows VISTA( XPやWindows Server 2003など)以前のOSでは標準では実装されてなく、 OSのリソースキットから入手できるコマンドだったようです。
robocopyコマンドは、サーバのデータ移行を目的として作られたコマンドということで、高機能でコマンドを動作させると表示されるメッセージ「Windowsの堅牢性の高いファイルコピー」を実現するそうです。

robocopyでできること

  • エラー時の再試行
  • ネットワーク切断時のコピーの中断と再開
  • 属性やセキュリティ設定のコピー
  • ファイルサイズを限定してのコピー
  • コピー先にある余分なファイルの削除
  • 256文字を超える長いパス名の処理
  • 動作ログの記録
  • コピーの進行状態の常時表示
  • ジョブによる同期作業内容の定義
  • コピー時の占有帯域制御

robocopyの使い方

robocopyはコマンドで実行します。

  • [スタートメニュー]-[全てのプログラム]-[アクセサリー]-[コマンドプロンプト]を選択する
  • [スタートメニュー]-[プログラムとファイルの検索]にcmd.exeと入力する
  • [WINDOWSキー]+Rで[プログラムとファイルの検索]にcmd.exeと入力する

などで、コマンドプロンプトを起動します。

robocopyコマンド

実はrobocopyは多機能なので、オプションも沢山あります。今回は一部のデータのバックアップのみ簡単にバックアップすることを目的としているため、シンプルなコマンドのみです。

> robocopy "コピー元" "コピー先" /COPYALL /MIR /XA:SH /R:3 /W:5

オプション

/COPYALL ファイル情報をすべてコピーする
/MIR     ディレクトリをミラーリングする
/XA:SH   アーカイブビットの付与されているデータをコピーして、アーカイブビットをクリア
/R:3     コピーが失敗した時のリトライ回数
/W:5     リトライする間隔の設定(デフォルト値は30秒)

実際にrobocopyを実行する

robocopy "C:\TESTFOLDER" "C:\temp\backup" /COPYALL /MIR /XA:SH /R:3 /W:5

このコマンドでは、Cドライブ直下にあるフォルダ TESTFOLDER をCドライブのtempにbackupというフォルダを作成してコピーするというコマンドになります。TESTFOLDERとbackupを同期するという動きになります。

本来の目的からすると、コピー先は別のドライブに指定するべきです。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: Mon Jun 05 14:28:54 2017

   コピー元 : C:\TESTFOLDER\
   コピー先 : C:\temp\backup\

   ファイル: *.*
        
   オプション: *.* /S /E /COPYALL /PURGE /MIR /XA:SH /R:3 /W:5 

------------------------------------------------------------------------------

      新しいディレクトリ          6  C:\TESTFOLDER\
        新しいファイル           348413    test1.png
  0%  
 37%  
 75%  
 99%  
 99%  
100%  
        新しいファイル            16288    test2.png
  0%  
100%  
        新しいファイル           117434    test3.png
  0%  
100%  
        新しいファイル             9162    test4.png
  0%  
100%  
        新しいファイル            19426    test5.png
  0%  
100%  
        新しいファイル            69391    test6.png
  0%  
100%  

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         1         0         0         0         0
     ファイル:         6         6         0         0         0         0
      バイト:   566.5 k   566.5 k         0         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00


       速度:            14502850 バイト/秒
       速度:             829.859 MB/分

       終了: Mon Jun 05 14:28:54 2017

TESTFOLDER内にあるtest6.pngをtest6-2.pngという名前に変更して、もう一度同じコマンドを実行してみます。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: Mon Jun 05 14:35:12 2017

   コピー元 : C:\TESTFOLDER\
   コピー先 : C:\temp\backup\

   ファイル: *.*
        
   オプション: *.* /S /E /COPYALL /PURGE /MIR /XA:SH /R:3 /W:5 

------------------------------------------------------------------------------

                       6    C:\TESTFOLDER\
      *EXTRA File          69391    test6.png
        新しいファイル            69391    test6-2.png
  0%  
100%  

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         0         1         0         0         0
     ファイル:         6         1         5         0         0         1
      バイト:   566.5 k    67.7 k   498.7 k         0         0    67.7 k
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00


       速度:            13878200 バイト/秒
       速度:             794.116 MB/分

       終了: Mon Jun 05 14:35:12 2017

ファイル名が変更されて新しいファイルが存在しているため、test6-2.pngがコピーされます。そして、/MIRオプションがあるため、コピー元に存在していないファイルtest6.pngは削除されます。

test6-2.pngの内容を変更して上書き保存した状態で、もう一度同じコマンドを実行してみます。


-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: Mon Jun 05 14:41:56 2017

   コピー元 : C:\TESTFOLDER\
   コピー先 : C:\temp\backup\

   ファイル: *.*
        
   オプション: *.* /S /E /COPYALL /PURGE /MIR /XA:SH /R:3 /W:5 

------------------------------------------------------------------------------

                       6    C:\TESTFOLDER\
        より古い               69391    test6-2.png
  0%  
100%  

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         0         1         0         0         0
     ファイル:         6         1         5         0         0         0
      バイト:   566.5 k    67.7 k   498.7 k         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00


       速度:             6939100 バイト/秒
       速度:             397.058 MB/分

       終了: Mon Jun 05 14:41:56 2017

内容に変更があったtest6-2.pngがコピーされ、イメージとしては上書きされた状態になります。

付けた方がいいかもしれないオプション

Windowsでは、ジャンクションポイントという機能があります。ジャンクションポイントは、実体のファイルやフォルダを別の場所やファイルにリンクすることができる機能です。(Linuxでいうシンボリックリンクのようなもの)
robocopyでは、何も指定しなければ、このジャンクションポイントもコピーします。コピー対象にもよりますが、リンクを回って無限ループに陥る可能性があるので、/XJF /XJDのオプションを付けることで、ジャンクションポイントを除外することができます。

複数のフォルダをコピー元に指定したい

バックアップとして考えれば、複数フォルダをコピー元に指定したいのではないでしょうか?
残念ながらrobocopyでは、コピー元もコピー先も1つのフォルダしかできません。ただし、バッチファイルを作ってrobocopyで実行すれば、複数フォルダを1つのフォルダ以下にコピーすることができます。

下記はあくまでもサンプルです。一応、私の環境では動きましたが、動作は保障できません。

SET SRC=C:
SET DST=D:\backup

CALL :bkup \TESTFOLDER1
CALL :bkup \TESTFOLDER2
CALL :bkup \TESTFOLDER3
exit /b

:bkup
robocopy "%SRC%%*" "%DST%%*" /COPY:DAT /MIR /XA:SH /XJ /XJD /R:3 /W:5
exit /b

個人やSmall Officeでの使用という点では、コピー元とコピー先のデータ同期時の動作として、コピー元で削除されたデータをコピー先でも削除したり、残したりが簡単に選択できること、属性など設定でコピーするものを選択できること、ネットワークが切断された際などのエラー時の動作なども簡単に設定できる点は、利点であると言えると思います。
手動でコピーしておけばいい。という考えもありますが、robocopyコマンドをタスクスケジューラに設定することで、定期的なバックアップが自動で出来るようにもなります。

スポンサーリンク
spdsk-side
spdsk-side