Robocopy の /MIR は便利ですが、考え方を間違えると「同期したかった」ではなく「消してはいけない物まで消えた」になりやすいコマンドです。結論から言うと、Robocopy のミラーで消してはいけない物を守るには、守りたい対象を「ソースにもある不要物」「宛先にだけ置く物」「宛先ディレクトリの ACL」「削除伝播そのものを止めたい物」に分けて考えるのが最短です。/XD と /XF は同期対象から外すための除外、/XX は宛先にしかない extra を削除しないための除外、宛先ディレクトリのセキュリティ設定を残したいなら /MIR ではなく /E /PURGE が判断材料になります。(Microsoft Learn)
この記事では、/MIR の仕様差、除外スイッチの使い分け、向く運用、失敗しやすいポイント、代替策までを実務目線で整理します。読み終えるころには、「このケースで何を除外すべきか」「そもそも /MIR を使うべきか」を迷わず決めやすくなります。
先に判断表を見る
| 守りたいもの | まず考える手段 | 向いているケース | 注意点 |
|---|---|---|---|
| ソースにもある不要物 | /XD /XF | cache、temp、ログ、生成物を最初から同期対象外にしたい | 「削除しない」ではなく「対象から外す」発想 |
| 宛先にだけ置く物 | /XX または保存場所の分離 | 宛先側でだけ運用メモや一時資料を持つ | /XX は extra 全体を残すので真のミラーではなくなる |
| 宛先ディレクトリの ACL | /E /PURGE | データ構造は合わせたいが、宛先ルートの権限は残したい | /MIR だと宛先ディレクトリのセキュリティ設定を上書きする |
| 削除伝播そのもの | /MIR を外して /E | バックアップ、退避、事前シード | 余分なファイルの掃除は別運用になる |
この整理は、Microsoft Learn の /MIR、/PURGE、/E、/XD、/XF、/XX の定義に基づいています。Robocopy では「同期対象から外す」と「宛先から消さない」が別スイッチです。ここを同じ意味で扱わないことが一番大事です。(Microsoft Learn)
/MIR の仕様で先に押さえるべきこと
/MIR はディレクトリツリーをミラーし、公式には /E + /PURGE 相当です。/PURGE は「ソースに存在しなくなった」宛先ファイルやディレクトリを削除します。つまり Robocopy は、その時点で見えているソースを正として purge します。パスの指定ミス、権限不足、ソースの一時的な見え方の崩れがある状態で /MIR を実行すると、意図せず宛先が削られる理由はここにあります。さらに、/MIR は宛先ディレクトリのセキュリティ設定を上書きしますが、/PURGE を /E と組み合わせる場合は宛先ディレクトリのセキュリティ設定を上書きしない、と公式に分けて説明されています。(Microsoft Learn)
ボリューム直下を扱う場合は、もう一段注意が必要です。現在の公式ドキュメントでは、/PURGE または /MIR をボリュームのルートで使っても、トップレベルの System Volume Information は対象から外れるようになっています。一方で、Microsoft の移行手順では今でも $RECYCLE.BIN と System Volume Information を明示的に /XD で除外しています。さらに、デバイスのルートからコピーすると、宛先ディレクトリが hidden と system 属性を引き継ぐ点も見落としやすい落とし穴です。(Microsoft Learn)
消してはいけない物をどう見分けるか
ソースにも存在し、最初から同期したくない物
アプリの cache、temp、生成ログのように、ソースにはあるがミラーに混ぜたくない物は /XD と /XF の領域です。/XD はディレクトリ名・パス一致の除外、/XF はファイル名・パス一致の除外で、/XF では *.log のようなワイルドカードが使えます。実務では、ディレクトリは名前だけでなくフルパス寄りで書くほうが安全です。名前だけだと、同名フォルダが別階層にあったときに想定より広く外しやすいからです。ジャンクションを辿って想定外の範囲まで入らないよう、/XJ もセットで考える価値があります。(Microsoft Learn)
robocopy "D:\Data" "\\backup01\Data" /MIR /XD "D:\Data\cache" "D:\Data\temp" /XF "*.tmp" "*.log" /XJ /R:2 /W:5 /LOG:"C:\Logs\data-mirror.log"
ボリューム直下を同期するジョブなら、公式の移行例にならって $RECYCLE.BIN と System Volume Information を明示的に外す設計も検討できます。特に「共有のルートをそのままコピーする」運用では、システムフォルダーを最初からコピー対象に入れないほうがログも読みやすくなります。(Microsoft Learn)
宛先にだけ置く物を残したいなら、/XX か保存場所の分離
運用メモ、現地作業で置いた一時資料、宛先側でだけ生成される補助ファイルは、Robocopy の用語では extra です。Microsoft Learn でこの要件に最も直接対応しているのが /XX で、宛先にある extra files and directories を除外し、extra files を除外しても宛先から削除しないと明記されています。つまり、「宛先にしかない物を消させたくない」という要求に対して、意味がまっすぐ一致するのは /XX です。(Microsoft Learn)
ただし、/XX は「特定の1フォルダだけ残す」のではなく、extra 全体を残します。時間が経つほど宛先側の余剰物が蓄積し、本来の mirror から離れます。少数の“絶対に消してはいけない物”を守りたいだけなら、スイッチでひねるより保存場所を分けるほうが運用はきれいです。
E:\
├─ MirrorData ← robocopy /MIR の対象
└─ KeepLocal ← 手置きファイル。/MIR の対象外
robocopy "D:\Data" "E:\MirrorData" /MIR /R:2 /W:5 /LOG:"C:\Logs\mirror.log"
どうしても同じ宛先配下に置きたい事情があるなら、次善策として /XX を使います。
robocopy "D:\Data" "E:\MirrorData" /MIR /XX /R:2 /W:5 /LOG:"C:\Logs\mirror-soft.log"
この形は便利ですが、厳密には「完全ミラー」ではありません。チーム内では「/MIR を使っているが、extra は残す運用」と明示しておくと、後から見た人が挙動を誤解しにくくなります。
宛先ディレクトリの ACL を守りたいなら、/MIR より /E /PURGE
見落としやすいのが権限です。公式ドキュメントでは /MIR は /E + /PURGE 相当としつつ、宛先ディレクトリのセキュリティ設定を上書きする点だけは明確に別扱いです。一方で、/PURGE を /E と併用する場合は、宛先ディレクトリのセキュリティ設定を上書きしないとされています。つまり、「データ構造は mirror に寄せたいが、宛先ルートの ACL は現地設定を残したい」という要件なら、/MIR を機械的に選ばないほうが安全です。(Microsoft Learn)
robocopy "D:\Data" "E:\Data" /E /PURGE /R:2 /W:5 /LOG:"C:\Logs\data-purge.log"
「/MIR と /E /PURGE は同じ」と覚えていると、この ACL 差分を見落とします。ミラーの成否だけでなく、権限設計まで含めて選ぶのが実務では重要です。
削除伝播そのものが不要なケース
バックアップ、退避、移行前の事前シードでは、「ソースから消えたものまで宛先から消す必要はない」ことが珍しくありません。その場合は /MIR を外し、まず /E を基準に考えるほうが素直です。/E は空ディレクトリを含むサブディレクトリをコピーし、/PURGE を付けない限り extra の削除は走りません。さらに、既存ファイルを一切上書きしたくないなら、Microsoft Learn の例どおり /XC /XN /XO を加えると、宛先にすでにあるファイルは新旧や変更有無に関係なくスキップできます。(Microsoft Learn)
robocopy "D:\Data" "E:\Backup" /E /R:2 /W:5 /LOG:"C:\Logs\backup-update.log"
robocopy "D:\Data" "E:\Backup" /E /XC /XN /XO /R:2 /W:5 /LOG:"C:\Logs\backup-seed.log"
前者は「追加・更新はしたいが、削除は伝播させない」運用向きです。後者は「まず存在しない物だけ足したい」初回投入や退避向きです。後者では既存ファイルの更新も止まるので、そこを混同しないようにしてください。(Microsoft Learn)
本番前に必ずやる確認
Robocopy の事故は、本番コマンドをいきなり叩いたときに起きます。最初の1回は、次の確認を挟むだけでかなり安全になります。
- まずは
/L /X /V /FP /LOG:付きで dry-run します。/Lは一覧表示だけで、コピー・削除・タイムスタンプ変更を行いません。/Xは extra を報告し、/Vはスキップ項目も出し、/FPはフルパスを出します。Microsoft Learn でもログファイルの作成を強く推奨しています。(Microsoft Learn) /Rと/Wは必ず明示します。既定では/Rが 100 万回、/Wが 30 秒なので、ロックファイルや一時障害で想像以上に長く粘ります。(Microsoft Learn)- 最終ミラーの直前は、ソース側の書き込みを止めます。Microsoft の移行手順でも、最終同期前に SMB 共有を無効化するか少なくとも読み取り専用にしてから、最後の
/MIRを実行しています。(Microsoft Learn) - 終了コードの判定を誤らないようにします。Robocopy は 0〜7 がすべて「即エラー」ではなく、8 以上が少なくとも1件の失敗を示します。スケジューラやバッチで単純に
ERRORLEVEL 1を失敗扱いにすると、正常系まで異常通知しやすくなります。(Microsoft Learn)
dry-run 用の型は、まずこれで十分です。
robocopy "D:\Data" "E:\MirrorData" /MIR /L /X /V /FP /R:2 /W:5 /LOG:"C:\Logs\mirror-preview.log"
バッチやタスクスケジューラで回すなら、終了コードは次のように扱うと誤判定を減らせます。
robocopy "D:\Data" "E:\MirrorData" /MIR /R:2 /W:5 /LOG:"C:\Logs\mirror.log"
set RC=%ERRORLEVEL%
if %RC% GEQ 8 exit /b %RC%
exit /b 0
迷ったらこの順で決める
Robocopy のミラーで消してはいけない物を除外したいときは、まず「その物はソースにもあるのか、宛先にだけあるのか」を分けてください。ソースにもある不要物なら /XD と /XF、宛先にだけある保管物なら /XX か保存場所の分離、宛先ディレクトリの ACL を守りたいなら /E /PURGE、削除伝播自体が不要なら /MIR を外して /E を選ぶ、という4択で考えると整理しやすくなります。(Microsoft Learn)
最初にやるべき作業は、いまのコマンドに /L /X /V /FP /LOG を足して、EXTRA と除外対象がどう見えているかを確認することです。その上で、宛先だけに残したい物が mirror root の中に混ざっているなら、スイッチを増やす前にフォルダ構成を見直してください。Robocopy のミラーは強力ですが、「全部まとめて除外」と考えず、守りたい物の性質ごとに分けるだけで事故率はかなり下がります。

コメント