robocopyでMT5のフォルダをバックアップして照合する|/MIRの削除と、ハッシュ値での確認

MT5のフォルダのバックアップは、Windows標準のrobocopyで取れます。ただし、バックアップ用のオプション/MIRは、コピー元に無いファイルをコピー先から削除します。先に/Lを付けて、何がコピー・削除されるかを一覧で確かめてから、実際に実行します。終わったら、ファイルの内容をハッシュ値で照合すると、コピーできたことを確認できます。

この記事では、テスト用のフォルダを作って、実際に動かした結果を例に、手順と注意点をまとめます。MT5の本番のフォルダには触れていません。(実測日:2026年10月19日/Windows 11)

1. /MIRと/Lの意味(Microsoftのページより)

オプション Microsoftのrobocopyのページの説明
/MIR ディレクトリツリーをミラーリングする(/Eと/PURGEに相当)
/PURGE コピー元に存在しなくなったファイルとディレクトリを、コピー先から削除する
/L ファイルをリストに表示するだけで、コピー・削除・タイムスタンプの更新はしない
/R:回数 失敗したコピーの再試行回数。既定値は1,000,000回
/W:秒 再試行の間の待ち時間。既定値は30秒
/LOG:ファイル 状態をログに書き込む(既存のログは上書き)
/XD ディレクトリ 指定したディレクトリを除外する

/Rの既定値が100万回なので、ロックされたファイルがあると、何時間も待ち続ける場合があります。Microsoftのページの例のとおり、/R:2 /W:5のように小さくします。ページには「ログファイルを作成することを強くお勧めします」とも書かれています。

2. テストで動かした結果

テスト用に、コピー元(src)とコピー先(dst)を作りました。コピー元には、EAのソース2つとCSVを置きます。コピー先には、コピー元に無いファイル(Deleted_in_src.mq5)をあらかじめ置きました。

手順1:/Lで確認する(何も変更されない)

robocopy "コピー元" "コピー先" /MIR /L /R:2 /W:5 /NP /NJH

結果は次のとおりです。

  *EXTRA File           25   Deleted_in_src.mq5
    New File            14   MyEA.mq5
    New File            14   MyInd.mq5
  New Dir          1   ...\MQL5\Files\
    New File         39880   log.csv

「*EXTRA File」が、コピー先にだけあって、/MIRで削除されるファイルです。/Lの段階では、まだ削除されていません。ここで、削除されたくないファイルが入っていないかを確認します。

手順2:/Lを外して実行する

robocopy "コピー元" "コピー先" /MIR /R:2 /W:5 /NP /NJH /LOG:backup.log

実行後のコピー先は、3つのファイル(MyEA.mq5、MyInd.mq5、log.csv)になり、Deleted_in_src.mq5は削除されていました。

手順3:ハッシュ値で照合する

$src = "コピー元のフォルダ"
$dst = "コピー先のフォルダ"
$a = Get-ChildItem $src -Recurse -File | ForEach-Object { [pscustomobject]@{ Rel = $_.FullName.Substring($src.Length); Hash = (Get-FileHash $_.FullName -Algorithm SHA256).Hash } }
$b = Get-ChildItem $dst -Recurse -File | ForEach-Object { [pscustomobject]@{ Rel = $_.FullName.Substring($dst.Length); Hash = (Get-FileHash $_.FullName -Algorithm SHA256).Hash } }
@(Compare-Object $a $b -Property Rel,Hash).Count

(コピー元・コピー先は、フルパスで、末尾の「\」なしで書きます。書き方がそろっていないと、同じファイルでも差が出ます)

差の数は0でした。ファイルの相対パスとSHA-256のハッシュ値が、すべて一致したということです。1つでも違えば、差の数が1以上になります。

手順4:もう一度実行する(変更がない場合)

同じコマンドをもう一度実行すると、ファイルはコピーされず、3つとも「Skipped(スキップ)」になりました。変更があった分だけをコピーするので、2回目以降は短時間で済みます。

3. 終了コードの見方

終了コード Microsoftのページの説明 筆者のテスト
0 ファイルはコピーされなかった。エラーも、一致しないファイルもなかった 手順4(2回目)
1 すべてのファイルが正常にコピーされた ―
2 コピー先に、コピー元に無い追加のファイルがある(コピーはされなかった) ―
3 一部のファイルがコピーされた。追加のファイルが存在した。エラーはなかった 手順1・手順2(1回目)
4〜7 一致しないファイルがある(4・5・6・7は組み合わせ)。エラーとは別なので、ログを確認する ―
8以上 コピー操作中に、少なくとも1つの障害が発生した ―

終了コード1や3が出ても、エラーではありません。8以上が出たら、コピーに失敗したファイルがあるので、ログを確認します。

4. MT5のフォルダで使う時の注意

  • コピー元とコピー先を逆にしない:/MIRは、コピー元に合わせてコピー先を作り替えます。逆にすると、本物のデータが、コピー先の古い内容に合わせて削除されます。/Lで先に確認します
  • コピー先を、専用のフォルダにする:ほかのファイルが入っているフォルダをコピー先にすると、/MIRで削除されます
  • MT5を閉じてからコピーします。開いているファイルは、コピーに失敗する場合があります(/R:2 /W:5を付けておけば、待ち続けません)
  • ヒストリカルデータなど大きいフォルダが不要なら、/XDで除外します(MT5のデータフォルダの構成はMT5のデータフォルダが大きくなる理由、移す場所はMT5の設定とEAを別のPC・VPSへ移す手順)
  • コピー先は、別のドライブにします。同じドライブ内では、ドライブが壊れた時に一緒に失われます(SSD・HDDが壊れる前後にやること)

まとめ

  • /MIRは、コピー元に無いファイルをコピー先から削除する。先に/Lで確認する
  • /Rの既定値は100万回。/R:2 /W:5とログ(/LOG)を付ける
  • コピーの後は、SHA-256で内容を照合する。テストでは差が0だった
  • 終了コードは、0〜3は正常、4〜7は不一致などを含むのでログを確認し、8以上は失敗
  • コピー元とコピー先を逆にしない。コピー先は専用の別ドライブにする