Windows環境でフォルダのバックアップを取る際、単純なファイルコピーでは「バックアップ元で削除されたファイルがバックアップ先に残り続けてしまう」という問題に直面することがよくあります。
この問題を解決し、バックアップ元とバックアップ先の状態を完全に一致させる「ミラーリング(同期・削除追従)」を実現するのが、Windows標準コマンドのRobocopyに搭載されている/MIRオプションです。
本記事では、Robocopy /MIRコマンドの基本的な使い方から、安全かつ効果的に運用するための注意点、具体的な実行手順までを、実用的なサンプルコードを交えて徹底解説します。
Robocopy /MIRとは?完全同期の仕組み
Robocopy(Robust File Copy)は、Windowsに標準搭載されている高機能なファイルコピーコマンドです。多くのオプションが用意されており、ネットワーク経由でのコピー、中断からの再開、セキュリティ情報の保持など、通常のコピーコマンドでは難しい高度な操作が可能です。
その中でも特に強力なのが/MIRオプションです。
- 新規・更新ファイルのコピー: バックアップ元に新しく追加されたファイルや更新されたファイルをバックアップ先にコピーします。
- 削除追従: バックアップ元から削除されたファイルやフォルダを、バックアップ先からも削除します。
これにより、バックアップ元とバックアップ先が常に鏡合わせのように完全に同期された状態を保つことができます。これは、例えば「本番環境のデータを開発環境に定期的に同期する」「重要なドキュメントフォルダを外部ストレージに常に最新の状態でバックアップする」といったシーンで非常に役立ちます。
【最重要】Robocopy /MIRを使う上での注意点
/MIRオプションは非常に強力ですが、その分、使い方を誤るとバックアップ先のデータが意図せず削除される可能性があります。以下の注意点を必ず守って使用してください。
注意点1: 実行前に必ずテスト(ドライラン)を行う
初めて/MIRを実行する際は、必ずテストモード(ドライラン)で実行し、どのような変更が行われるかを事前に確認してください。これには以下のオプションが役立ちます。
/L: コピー、削除、変更されるファイルの一覧を表示するだけで、実際には何も実行しません。/ETA: 予想される転送時間も表示します(/Lと併用可)。
実行例(ドライラン):
robocopy "C:\SourceFolder" "D:\BackupFolder" /MIR /L /ETA
このコマンドを実行し、出力されるログを注意深く確認してください。意図しない削除やコピーがないか、特に「削除」の対象となるファイルやフォルダに問題がないかを徹底的にチェックすることが重要です。
注意点2: バックアップ元とバックアップ先のパスを間違えない
robocopy 源フォルダ 宛先フォルダ /MIRという形式でコマンドを実行します。もし「源フォルダ」と「宛先フォルダ」を逆にしてしまうと、本来のバックアップ元(源フォルダ)のデータが、古いバックアップ先(宛先フォルダ)の状態に上書き・削除されてしまうという悲惨な結果を招きます。コマンド入力時はパスの順番を何度も確認してください。
注意点3: 適切なオプションの組み合わせ
/MIRは/E(空のディレクトリもコピー)と/PURGE(宛先から源にないものを削除)を組み合わせたものと同等ですが、さらに細かな制御のために他のオプションも併用することが推奨されます。
/COPYALL: すべてのファイル情報(属性、タイムスタンプ、セキュリティ情報、所有者情報、監査情報)をコピーします。これにより、完全なバックアップが実現します。/R:3 /W:10: コピー失敗時のリトライ回数を3回、リトライ間隔を10秒に設定します。ネットワーク経由でのコピーなどで安定性を高めます。/NP: コピーの進捗状況をパーセンテージで表示しません。ログファイルに出力する際に、ログが見やすくなります。/LOG:"C:\Logs\Robocopy_Backup.log": 実行結果をログファイルに出力します。問題発生時の調査や、定期実行の履歴管理に不可欠です。/TEE: ログをファイルに出力すると同時に、コンソールにも表示します。/XD "フォルダ名": 指定したフォルダをコピー対象から除外します。例えば、一時ファイルが大量にあるフォルダなどを除外することで、コピー時間を短縮できます。/XF "ファイル名": 指定したファイルをコピー対象から除外します。
Robocopy /MIR コマンドの実践手順とサンプル
基本のミラーリングコマンド
最もシンプルなミラーリングコマンドです。まずはこの形でドライランを行い、動作を確認しましょう。
robocopy "C:\SourceData" "D:\BackupData" /MIR /L /ETA
問題なければ/L /ETAオプションを削除して実行します。
robocopy "C:\SourceData" "D:\BackupData" /MIR
ログ出力付きの完全ミラーリング
実運用ではログ出力が必須です。エラー発生時の原因特定や、正常終了の確認に役立ちます。
@echo off
set "SOURCE_DIR=C:\SourceData"
set "DEST_DIR=D:\BackupData"
set "LOG_DIR=C:\RobocopyLogs"
set "LOG_FILE=%LOG_DIR%\Robocopy_Backup_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.log"
REM ログディレクトリが存在しない場合は作成
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
echo %DATE% %TIME% - Robocopy Mirroring Start
echo Source: %SOURCE_DIR%
echo Destination: %DEST_DIR%
echo Log File: %LOG_FILE%
echo ----------------------------------------------------
robocopy "%SOURCE_DIR%" "%DEST_DIR%" /MIR /COPYALL /R:3 /W:10 /NP /LOG:"%LOG_FILE%" /TEE
if %ERRORLEVEL% le 1 (
echo.
echo %DATE% %TIME% - Robocopy Mirroring Completed Successfully or with minor differences.
) else (
echo.
echo %DATE% %TIME% - Robocopy Mirroring Completed with Errors. Check log file for details.
)
echo ----------------------------------------------------
echo.
pause
解説:
@echo off: コマンドの表示をオフにします。set "VARIABLE=VALUE": 変数を設定します。パスはダブルクォーテーションで囲むことで、スペースを含むパスにも対応できます。LOG_FILE: 日付と時刻を含むユニークなログファイル名を生成します。if not exist "%LOG_DIR%" mkdir "%LOG_DIR%": ログフォルダが存在しない場合に作成します。/TEE: ログをファイルに出力すると同時に、コンソールにも表示します。if %ERRORLEVEL% le 1: Robocopyの終了コード(ERRORLEVEL)を確認しています。- 0: ファイルのコピーや変更がなく、正常終了。
- 1: 一部のファイルがコピーされたが、エラーなし。
- 2: スキップされたファイルが存在するが、エラーなし。
- 8: コピーエラーが発生したが、リトライにより解決。
- 16: 深刻なエラー。コピー元・先のフォルダが見つからないなど。
一般的に、0または1であれば成功とみなせます。
pause: コマンドプロンプトがすぐに閉じないように一時停止します。バッチファイルを直接実行する場合に便利です。
特定のファイルやフォルダを除外してミラーリング
一時ファイルやログファイルなど、バックアップに含めたくないものがある場合に便利です。
@echo off
set "SOURCE_DIR=C:\ProjectData"
set "DEST_DIR=D:\ProjectBackup"
set "LOG_FILE=C:\RobocopyLogs\ProjectBackup.log"
robocopy "%SOURCE_DIR%" "%DEST_DIR%" /MIR /COPYALL /R:3 /W:10 /NP /LOG:"%LOG_FILE%" /TEE ^
/XD "temp" "cache" ".git" ^
/XF "*.tmp" "*.log" "*.bak"
if %ERRORLEVEL% le 1 (
echo.
echo Project Data Mirroring Completed Successfully.
) else (
echo.
echo Project Data Mirroring Completed with Errors.
)
pause
解説:
^: コマンドを複数行に分割するためのエスケープ文字です。/XD "temp" "cache" ".git":temp、cache、.gitという名前のフォルダをコピー対象から除外します。/XF "*.tmp" "*.log" "*.bak": 拡張子が.tmp、.log、.bakのファイルをコピー対象から除外します。ワイルドカードが使用可能です。
Robocopy /MIRの自動化
上記のバッチファイルを作成したら、Windowsのタスクスケジューラに登録することで、指定した時間に自動的にバックアップを実行させることができます。
タスクスケジューラの設定手順は以下の通りです。
- 「スタート」メニューから「タスクスケジューラ」を検索して起動します。
- 「操作」メニューから「タスクの作成」を選択します。
- 「全般」タブでタスク名(例:
Daily_Robocopy_Backup)と説明を入力します。 - 「トリガー」タブで「新規」をクリックし、実行したいスケジュール(例: 毎日午前3時)を設定します。
- 「操作」タブで「新規」をクリックし、「操作」を「プログラムの開始」に、「プログラム/スクリプト」に作成したバッチファイルのパス(例:
C:\Scripts\DailyBackup.bat)を入力します。 - 必要に応じて他のタブ(「条件」「設定」など)も確認し、「OK」をクリックしてタスクを保存します。
タスクスケジューラで実行する場合は、pauseコマンドは不要です。また、実行ユーザーの権限にも注意してください。必要なフォルダへのアクセス権限を持つユーザーで実行するように設定しましょう。
まとめ
Robocopy /MIRコマンドは、Windows環境でバックアップ元とバックアップ先を完全に同期させるための強力なツールです。
その強力さゆえに、誤った使い方をするとデータ損失のリスクも伴いますが、本記事で解説した「ドライランでの事前確認」「パスの正確な指定」「適切なオプションの組み合わせ」「ログの取得」といった注意点を守れば、安全かつ効率的なバックアップ運用が可能です。
ぜひ、あなたの業務や開発環境にRobocopy /MIRを活用し、データの信頼性と管理の手間を大幅に向上させてください。


コメント