Windowsの「robocopy」コマンドでフォルダをバックアップ/同期させる

Windows

Windowsでファイルをバックアップするには、2つのフォルダの内容を同期させるrobocopyコマンドが利用できる。 robocopyではフォルダの同期機能をはじめ、さまざまなオプションを指定してのコピーができる。 2つのフォルダの内容を完全に同期させるには/mirオプションを利用する。 robocopyコマンドとは 2つのフォルダの内容を同期させ、ファイルやフォルダの内容を同じ状態に保つ機能は、ファイルサーバのバックアップや個人的な
データのバックアップ、リモートオフィス同士でのデータの同期など、システム管理のさまざまな場面で利用される。

このような用途に利用できるコマンドとして、copyやxcopyコマンドがある。

フォルダの同期に利用できるツールとしては、この他にも「robocopy.exe」というコマンドラインツールがある。 robocopyは、もともとはリモートのファイルサーバ同士でファイルやフォルダ、ユーザープロファイルデータなどを同期させるために作られたコマンドである。

その名前は「Robust File Copy」の略であり、堅固(robust)で確実なファイルコピーという意味を持つ。具体的な機能の例を以下に記す。
・エラー時の再試行回数の制限や待ち時間の指定
・ネットワーク切断時のコピーの中断と再開
・属性やセキュリティ設定のコピー
・ファイルサイズや変更時刻などを限定してのコピー
・コピー先にある余分なファイルの削除
・256文字を超える長いパス名の処理
・動作ログの記録
・作業内容やオプション設定などをジョブとして保存

例として、下記コマンドをメモ帳などに記載して拡張子batファイルとして保存し、起動すると実行できる。
この例は C:\Users\user\Documents フォルダの内容を d:\backup フォルダにミラーラングするものである。

ROBOCOPY “C:\Users\user\Documents” “d:\backup” /MIR /XO /XA:SH /NP /NDL /R:0 /W:0 /FFT
オプションの意味
【/MIR】 ミラーリングコピーする (/Eと/PURGEを指定したのと同じになります)
【/XO】 改変がないファイルを除外します。
【/XA:属性】 属性の部分に除外したい属性のファイルを指定する。 (システムファイルなら【/XA:S】としますが、【/XA:SH】のように複数指定も可です)
【/NP】 進捗を表示しない。
【/NDL】 フォルダ名をログに出力しない。
【/R:n】 コピーに失敗したときにリトライする回数で、n の部分が任意の回数となります。
【/W:n】リトライの間の待ち時間(秒数)で、n の部分が任意の秒数となります。(デフォルトは30秒)
/FFT FAT ファイル時間 (2秒の粒度) を想定します。


robocopyのヘルプを参照するには
robocopyコマンドの使い方やオプションは、コマンドプロンプトで「robocopy /?」を実行すると表示される。
c:\>robocopy /?

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

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

------------------------------------------------------------------------------- 開始: 2020年8月1日 16:27:34

 使用法:: ROBOCOPY コピー元 コピー先 [ファイル [ファイル]...]

 [オプション]

コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。

コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。

ファイル :: コピーするファイル (名前/ワイルドカード: 既定値は「*.*」です)
::
:: コピー オプション:
::
/S :: サブディレクトリをコピーしますが、空のディレクトリはコピーしません。
/E :: 空のディレクトリを含むサブディレクトリをコピーします。
/LEV:n :: コピー元ディレクトリ ツリーの上位 n レベルのみをコピーします。
/Z :: 再起動可能モードでファイルをコピーします。
/B :: バックアップ モードでファイルをコピーします。
/ZB :: 再起動可能モードを使用します。アクセスが拒否された場合、バックアップ モードを使用します。
/J :: バッファーなし I/O を使用してコピーします (大きなファイルで推奨)。
/EFSRAW :: 暗号化されたすべてのファイルを EFS RAW モードでコピーします。
/COPY:コピーフラグ :: ファイルにコピーする情報(既定値は/COPY:DAT)。
(copyflags : D=データ、A=属性、T=タイムスタンプ、X=代替データ ストリームをスキップ)。
(S= セキュリティ =NTFS ACL、O= 所有者情報、U= 監査情報)。
/SEC :: セキュリティと共にファイルをコピーします (/COPY:DATS と同等)。
/COPYALL :: ファイル情報をすべてコピーします (/COPY:DATSOU と同等)。
/NOCOPY :: ファイル情報をコピーしません (/PURGE と共に使用すると便利)。
/SECFIX :: スキップしたファイルも含むすべてのファイルのファイル セキュリティを修正します。
/TIMFIX :: スキップしたファイルも含むすべてのファイルのファイル時刻を修正します。
/PURGE :: 既にコピー元に存在しないコピー先のファイル/ディレクトリを削除します。
/MIR :: ディレクトリ ツリーをミラー化します(/Eおよび/PURGE と同等)。
/MOV :: ファイルを移動します (コピー後にコピー元から削除)。
/MOVE ::ファイルとディレクトリを移動します (コピー後にコピー元から削除)。
/A+:[RASHCNET] :: コピーされたファイルに指定の属性を追加します。
/A-:[RASHCNET] :: コピーされたファイルから指定の属性を削除します。
/CREATE :: ディレクトリ ツリーと長さ 0 のファイルのみを作成します。
/FAT :: 8.3 FAT ファイル名のみを使用してコピー先ファイルを作成します。
/256 :: 256 文字を超える非常に長いパスのサポートをオフにします。
/MON:n :: コピー元を監視し、n 回を超える変更があった場合に再度実行します。
/MOT:m :: コピー元を監視し、m 分後に変更があった場合に再度実行します。
/RH:hhmm-hhmm :: 実行時間 - 新しいコピーを開始できる時刻です。
/PF :: 実行時間をファイルごと (パスごとではない) に確認します。
/IPG:n :: 低速回線で帯域幅を解放するためのパケット間ギャップ(ミリ秒)。
/SJ :: 接合のターゲットとしてではなく接合として Junctions をコピーします。
/SL::リンクのターゲットとしてではなくリンクとしてシンボリック リンクをコピーします。
/MT[:n] :: n個のスレッドのマルチスレッド コピーを実行します (既定値 8)。
  n は 1 から 128 までの値である必要があります。
 このオプションは、/IPG および /EFSRAW オプションと互換性がありません。
  パフォーマンス向上のため、/LOG オプションを使用して出力をリダイレクトします。
/DCOPY:コピーフラグ :: ディレクトリにコピーする情報 (既定値は /DCOPY:DA)。
 (copyflags : D=データ、A=属性、T=タイムスタンプ、E=EA、X=代替データ ストリームをスキップ)。
/NODCOPY :: ディレクトリ情報をコピーしません (既定では /DCOPY:DA が実行されます)。
/NOOFFLOAD :: Windows のオフロードをコピーするメカニズムを使用せずに、ファイルをコピーします。
/COMPRESS :: ファイル転送中にネットワーク圧縮を要求します (適用可能な場合)。
::
:: ファイル選択オプション:
::
/A :: アーカイブ属性が設定されているファイルのみをコピーします。
/M :: アーカイブ属性のあるファイルのみをコピーし、リセットします。
/IA:[RASHCNETO] :: 指定されたいずれかの属性が設定されているファイルのみを含みます。
/XA:[RASHCNETO] :: 指定されたいずれかの属性が設定されているファイルを除外します。
/XF file [ファイル]... ::
  指定された名前/パス/ワイルドカードに一致するファイルを除外します。
/XD dir [ディレクトリ]... ::
指定された名前/パスに一致するディレクトリを除外します。
/XC :: 変更されたファイルを除外します。
/XN :: 新しいファイルを除外します。
/XO :: 古いファイルを除外します。
/XX :: コピー先にだけ存在するファイルとディレクトリを除外します。
/XL :: コピー元にだけ存在するファイルとディレクトリを除外します。
/IS :: 同一ファイルを含みます。
/IT :: 異常なファイルを含めます。
/MAX:n :: 最大ファイル サイズ - n バイトより大きいファイルを除外します。
/MIN:n :: 最小ファイル サイズ - n バイトより小さいファイルを除外します。
/MAXAGE:n :: 最長ファイル有効期間 - n 日より古いファイルを除外します。
/MINAGE:n :: 最短ファイル有効期間 - n 日より新しいファイルを除外します。
/MAXLAD:n :: 最大最終アクセス日 - n で指定する値以後に使用していないファイルを除外します。
/MINLAD:n :: 最小最終アクセス日 - n で指定する値以後に使用されたファイルを除外します。
 (n < 1900 の場合、n = n 日です。それ以外は、n = YYYYMMDDの日付です)。
/FFT :: FAT ファイル時間 (2 秒の粒度) を想定します。
/DST :: 1 時間の DST 時間差を補正します。
/XJ:: シンボリック リンク (ファイルとディレクトリの両方) と接合ポイントを除外します。
/XJD:: ディレクトリのシンボリック リンクと接合ポイントを除外します。
/XJF :: ファイルのシンボリック リンクを除外します。
/IM :: 変更されたファイルを含めます (変更日時が異なる)。
::
:: 再試行オプション:
::
/R:n :: 失敗したコピーに対する再試行数: 既定値は 1,000,000。
/W:n :: 再試行と再試行の間の待機時間: 既定値は、30 秒です。
/REG :: /既定の設定としてレジストリに R:n と /W:n を保存します。
/TBD :: 共有名が定義されるのを待ちます (再試行エラー 67)。
/LFSM :: 空き領域不足モードで動作し、コピーの一時停止と再開を有効にします (「注釈」を参照)。
/LFSM:n[KMG] :: 下限サイズを n [K:kilo,M:mega,G:giga] バイトで指定した /LFSM。
::
:: ログ オプション:
::
/L :: リストのみ - いずれのファイルにも、コピー、タイムスタンプの追加、または削除を実施しません。
/X :: 選択されたファイルのみではなく、余分なファイルをすべて報告します。
/V :: スキップされたファイルを示す詳細出力を作成します。
/TS :: 出力にコピー元ファイルのタイム スタンプを含めます。
/FP :: 出力にファイルの完全なパス名を含めます。
/BYTES :: サイズをバイトで出力します。
/NS :: サイズなし-ファイル サイズをログに記録しません。
/NC :: クラスなし - ファイル クラスをログに記録しません。
/NFL ::ファイル リストなし-ファイル名をログに記録しません。
/NDL :: ディレクトリなし-ディレクトリ名をログに記録しません。
/NP :: 進行状況なし- コピーの完了率を表示しません。
/ETA ::コピーするファイルの推定完了時刻を表示します。
/LOG:ファイル:: ログ ファイルに状態を出力します(既存のログを上書きします)。
/LOG+:ファイル :: ログ ファイルに状態を出力します(既存のログ ファイルに追加します)。
/UNILOG:ファイル :: ログ ファイルに UNICODE で状態を出力します (既存のログを上書きします)。
/UNILOG+:ファイル :: ログ ファイルに UNICODE で状態を出力します (既存のログに追加します)。
/TEE :: コンソール ウィンドウとログ ファイルに出力します。
/NJH :: ジョブ ヘッダーがありません。
/NJS :: ジョブ要約がありません。
/UNICODE :: 状態を UNICODE で出力します。
::
:: ジョブ オプション:
::
/JOB:ジョブ名 :: 名前の付いたジョブ ファイルからパラメーターを取得します。
/SAVE:ジョブ名 :: 名前の付いたジョブ ファイルにパラメーターを保存します。
/QUIT :: コマンド ラインの処理後に終了します (パラメーターの表示のため)。
/NOSD :: コピー元ディレクトリを指定しません。
/NODD :: コピー先ディレクトリを指定しません。
/IF :: 後続のファイルを含みます。
::
:: 注釈 :
::
ボリュームのルート ディレクトリに対して /PURGE または /MIR を使用すると、これまでは、
robocopy は要求された操作をシステム ボリューム情報ディレクトリ内のファイル
にも適用していました。この動作は変更されました。
どちらかを指定すると、robocopy はその名前を持つファイルまたはディレクトリを
(コピー セッションの最上位レベルのソースと宛先ディレクトリで) スキップします。
変更されたファイルの分類は、コピー元とコピー先両方の
ファイル システムが変更タイムスタンプ (NTFS など)をサポートしていて、
コピー元とコピー先のファイルの変更日時が異なり、しかし
それ以外は同じ場合に適用されます。これらのファイルは既定ではコピーされません。/IM を指定して、
それらを含めます。
/DCOPY:E フラグは、拡張属性コピーをディレクトリに対して試行することを要求します。現時点では robocopy が継続されます
   (ディレクトリの EA をコピーできなかった場合)。このフラグは/COPYALL 内。
/LFSM を使用することで、robocopy に '空き領域不足モード'での動作を要求します。
そのモードでは、次の場合にrobocopy が一時停止します。すなわち、ファイルのコピーによって
コピー先ボリュームの空き領域が '下限' 値を下回る場合です。この値は
フラグの LFSM:n[KMG] 形式によって明示的に指定できます。
/LFSM が明示的な下限値なしで指定されている場合、下限は
コピー先ボリュームのサイズの 10% に設定されます。
空き領域不足モードは、/MT、/EFSRAW、/B、および/ZB と互換性がありません。

robocopyの基本的な使い方
robocopyでは、copyやxcopyコマンドのように、引数としてコピー元とコピー先、オプションなどを指定する。


コピー元もコピー先もフォルダであり(ファイル名やワイルドカードは指定不可)、指定されたフォルダ間で、その中にあるファイルがコピーされる。コピー先として指定されているフォルダが存在しない場合は、フォルダが新規作成され、その中へコピーされる。

コピー元やコピー先には、ローカルのフォルダだけでなく(例:c:\srcfolder)、UNCによるリモートのサーバ上の共有フォルダも指定できる(例:\\server1\drivec\destfolder)。

ただしデフォルトではサブフォルダはコピーされず、さらに次の種類のファイルだけが上書きでコピーされる。

コピー先に存在しないファイル
名前が同じでも、更新日付が異なるファイル(新しいファイルだけではなく、コピー元の方が古くてもコピー対象となる)
名前と日付が同じでも、サイズが異なるファイル

xcopyコマンドに/dオプションを付けると更新されたファイルだけをコピーするが(TIPS「xcopyでファイルをバックアップする」参照)、robocopyではコピー元の方が古くてもコピーされるなど、少し挙動が異なる。

どのような種類のファイルをコピーするかは、ファイルの「クラス」に基づいて決まる。クラスとは例えば、日付が新しいか古いか、サイズが異なるか、属性が異なるか、などの状態のことを指す。どのクラスに該当するファイルをコピーするかはオプションで指定できる。

特定の拡張子やワイルドカード指定に一致するファイルのみをコピーする
robocopyをオプション指定なしで実行すると、デフォルトでは「*.*」、つまり全てのファイルがコピーの対象となる。
オプションとしてファイルのパターンを指定すると、そのパターンに合うファイルのみがコピーの対象となる。
例えばJPG/JPEG画像ファイルだけをコピーするには、次のようワイルドカード指定を追加する(パターンは複数指定可能)。

※2つのフォルダ間でJPG/JPEGファイルをコピーする例
robocopy c:\src d:\dest *.jpg *.jpeg

サブフォルダまで含めて再帰的にコピーする
robocopyに何もオプションを付けないと、指定されたフォルダ中にあるファイルだけがコピーの対象となる。これをサブフォルダも含めて全部コピー(上書き更新)するには「/s」オプションを付ける。ただし/sだけでは、空のフォルダはコピーされない。空フォルダも含めてサブフォルダをコピーするには「/e」(/s /eでも同じ)を付けて実行する。これらのオプション名はxcopyコマンドと同じである。



2つのフォルダを完全に同期させて、ミラーコピーを作る
/sオプションを使うと、コピー元のファイルやサブフォルダがコピー先へ上書き更新されるが、この場合、もしコピー先に余分なファイル(コピー元にはないファイル)があっても、そのファイルは何もされずに(削除されずに)、そのまま残ることになる。

この挙動を変更して、2つのフォルダの内容をサブフォルダも含めて完全に同期させる(同じ状態にする)には、「/mir」(ミラー)オプションを指定する。


/mirオプションを付けると、コピー元フォルダと同じ状態になるように、コピー先フォルダへファイルがコピーされる。
コピー先に不足するものがあれば新規作成されるし、日付やサイズが相違するファイルがあれば上書き更新される。
さらに、コピー先に余分なファイルやフォルダがあれば、それらは削除される。サブフォルダの内容もコピーされる(/sや/eオプションは不要。実際には、サブフォルダをコピーする/sと、余分なファイルを削除する/purgeを組み合わせたものが/mirオプション)。


/sや/eだけでは、同じコピー先に対して何度もコピーすると、コピー先に不要なファイル(=コピー元にすでに存在しないファイル)がどんどん増えていく可能性がある。だが/mirオプションを付ければ、それを抑止できる。robocopyを単なるバックアップ用途で利用するなら、このオプションが便利だろう。

ドライブ間のミラーコピーに注意
/mirオプション(もしくは/purgeオプション)を使う場合、2つのドライブ全体をコピーさせるなら注意が必要である。
例えばG:の内容をすべてH:にコピーするなら、次のようなコマンドを実行するだろう(/zもしくは/zbオプションは、ユーザーのアクセス権がないファイルもバックアップするためのオプション)。

※問題のあるドライブ間コピーのコマンド
robocopy g:\ h:\ /mir /zb

これを実行すると、H:のルートにある「\System Volume Information」というフォルダの内容をいったん削除してG:\からコピーしてきたファイルで上書きしようとする。だがこのフォルダには、各ボリュームごとの重要なメタデータ(ボリュームシャドウコピーや復元、重複除去機能などのデータ)が保存されているので、これを削除・上書きすると、ファイルシステム上のデータが壊れるなどの障害が発生することがある。

これを避けるには、ドライブのルートをミラーコピーする場合には、System Volume Informationフォルダを除外するように/xdオプションも指定する。

※正しいドライブ間コピーのコマンド
robocopy g:\ h:\ /mir /zb /xd "System Volume Information"


ログの保存
以上の例のように、robocopyを実行すると、デフォルトではコピーしているファイルの状況や転送量、何ファイルコピーしたかなど、詳細なコピーの状況が画面に表示される。「コピー済み」が実際にコピーした数、「Extras」は/mirや/purgeオプションによって削除された数である。

このログはファイルなどに残すこともできるので、タスクスケジューラに登録して自動実行する場合でも、後で実行状況を確認でき、便利である。ログをファイルに残すには「/log」オプションを指定する。

robocopyのオプションをジョブとして登録・保存する
robocopyで何度も同じコピー作業を繰り返すつもりなら(バックアップタスクとして登録する場合など)、robocopyで行う作業を「ジョブ」として用意しておくとよいだろう。

「/save」オプションを使うと、robocopy実行時に指定したフォルダやパターン指定、オプション設定などがジョブとして.RCJファイルに保存される。保存された.RCJファイルを「/job」オプションで呼び出すことにより、同じコマンドを再実行できる。




/saveオプションを付けると、その左側にあるすべてのパラメーターが指定した.RCJファイルに書き込まれる。.RCJファイルはテキストファイルなので、メモ帳などで開けば、オプション設定を変更できる。

なお/saveオプションだけだと、/saveによる保存後に、指定したパラメーターでrobocopyが1回実行される(コピーが行われる)。コピーさせずに.RCJファイルの作成だけを行いたい場合は、最後に「/quit」オプションを付加すること。

※ジョブの定義例
robocopy c:\src d:\dest /mir /save:copyjob /quit

※ジョブの実行例
robocopy /job:copyjob