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以上は失敗
- コピー元とコピー先を逆にしない。コピー先は専用の別ドライブにする


