Robocopyで大量のファイルをコピーしていると、途中でエラーが出て処理が止まり、朝になったらほとんど進んでいなかった……ということは珍しくありません。この記事では、エラーが出ても途中で止まらず「失敗したファイルは飛ばして残りを確実にコピーする」ための設定と運用のコツを、実務目線で詳しく解説します。
Robocopyでエラーが出てもコピーを止めない設定と運用テクニック
Windows標準のファイルコピーコマンド「Robocopy」は、高速・高機能な一方で、一部のファイルでエラーが発生すると、その再試行が延々と続き、処理全体が止まったように見えることがあります。
特に、次のようなケースで問題になりがちです。
- コピー途中でファイルが削除されてしまった
- 一時的なロックやアクセス拒否が発生した
- ネットワークドライブの一部だけ一時的に応答しなくなった
このような状況で「エラーが出たファイルは諦めてよいので、とにかく最後まで走り切りたい」ときに有効なのが、次の設定です。
robocopy "C:\source" "D:\destination" /R:0 /W:0
この記事では、この設定が何を意味するのか、どのような場面で有効か、ログの取り方や終了コードの扱いまで含めて、丁寧に解説していきます。
Robocopyが「エラーで止まってしまう」理由
まず、なぜRobocopyがエラーで止まってしまうように見えるのか、仕組みから整理しておきます。
エラー時の再試行を制御する /R と /W オプション
Robocopyには、エラーが発生した際の動作を決める重要なオプションが2つあります。
| オプション | 意味 | 既定値 | 挙動の概要 |
|---|---|---|---|
/R:n | コピーエラー時の再試行回数 | 1000000(100万回) | 指定回数だけ同じファイルのコピーをやり直す |
/W:n | 再試行までの待ち時間(秒) | 30 秒 | 失敗するたびに指定秒数だけ待機して再試行 |
既定値では、1つのエラーだけで「最大100万回 × 30秒」再試行される設定になっており、現実的ではありません。実際には途中でCtrl+Cで止めてしまったり、タスク スケジューラの実行時間制限に引っかかったりします。
さらに、指定した再試行回数をすべて使い切ると、その時点でRobocopyは終了し、その後ろのファイルは一切処理されません。これが「途中のファイルでエラーが出たせいで、後続のファイルがまったくコピーされていなかった」という状況を生みます。
典型的なトラブル例
よくあるトラブルを簡単に整理すると次の通りです。
| 状況 | 原因 | よくある結果 |
|---|---|---|
| コピー中にファイルが削除される | アプリケーションやユーザーがファイルを削除 | 「ファイルが見つかりません」エラーに対して再試行を繰り返し、その時点でRobocopyが終了 |
| 一部のファイルがアクセス拒否 | アクセス権不足/一時的なロック | 同じファイルへの再試行が続き、想定より処理が長引く |
| ネットワーク共有の一部が不安定 | ネットワーク障害・NASの負荷など | 特定のディレクトリで固まり、後続のディレクトリに到達しない |
このような場合、「失敗したファイルは諦めるので、とにかく最後まで回しておきたい」というニーズが強くなります。そのための最もシンプルな解決策が、次に説明する /R:0 /W:0 です。
エラーを即スキップして処理を続行する設定:/R:0 /W:0
「エラーが発生したら即座にそのファイルをスキップし、残りのファイルのコピーを続けたい」という目的であれば、次のようなオプション設定が有効です。
| やりたいこと | 推奨スイッチ | 効果 |
|---|---|---|
| エラー発生ファイルは諦めて即スキップし、処理を継続したい | /R:0 /W:0 | 再試行 0回・待ち時間 0秒。失敗したファイルをただちに飛ばし、残りのファイルを処理し続ける。 |
/R:0 /W:0 を指定したときの挙動
- 何らかの理由でファイルコピーが失敗した場合、そのファイルに対する再試行を一切行わない
- 失敗したファイルは「コピーできなかった」としてログに記録される
- Robocopy自体は処理を継続し、残りのすべてのファイルについてコピーを続ける
実際のコマンド例は次のようになります。
robocopy "C:\source" "D:\destination" /R:0 /W:0
この設定により、エラーで処理全体が止まってしまうリスクを大幅に減らすことができます。その代わり、「失敗したファイルはコピーされない」ことを前提に運用設計をする必要があります。
公式ドキュメントに現れない挙動について
/R:0 による「エラーが出ても再試行せず即スキップして続行する」挙動は、公式ドキュメントでは明確に「エラーを無視して続行」とは書かれていません。しかし、Windows 10 / 11 および Windows Server 2016 以降に付属するRobocopyで実際に確認されている挙動です。
本番運用に投入する前に、必ずテスト用フォルダーや検証環境で動作確認を行うことを強くおすすめします。
ログと表示を最適化するおすすめスイッチ
/R:0 /W:0でエラーをスキップするとしても、どのファイルが失敗したかを把握できなければ、トラブルシューティングが困難です。そこで重要になるのがログの取り方と表示の最適化です。
最低限おさえておきたいログ関連オプション
| オプション | 役割 | おすすめの使いどころ |
|---|---|---|
/LOG:ファイル名 | ログを指定したファイルに出力する | タスク スケジューラやバッチ処理での運用時は必須レベル |
/TEE | ログファイルに書き出しつつ、コンソールにも同時表示 | 手動実行で進捗を確認しながら、ログも残したい場合 |
/NFL | ファイル名のログ出力を抑制 | ファイル数が非常に多いときにログを簡潔にしたい場合 |
/NDL | ディレクトリ名のログ出力を抑制 | フォルダー構成が深く、ディレクトリ行が多くて読みにくい場合 |
/NP | 進捗率(パーセント表示)を出力しない | ログファイルをよりスリムにしたいとき |
例えば、夜間バッチで使う場合の典型的なコマンドは次のようになります。
robocopy "C:\source" "D:\destination" ^
/R:0 /W:0 ^
/LOG:C:\logs\robocopy_backup.log /TEE ^
/NFL /NDL /NP
/NFL と /NDL を使うかどうかは好みですが、ファイル数が数十万〜数百万レベルになると、これらを付けることでログサイズをかなり抑えられます。
テスト実行に便利な /L オプション
いきなり本番のデータに対してコマンドを実行するのが不安な場合は、/L オプションが有効です。
/L:実際にはコピーせず、「コピーするつもり」のファイル一覧だけを表示
例えば次のようにすると、実際のコピーは行わず、「この設定だと何が起きるか」を事前に確認できます。
robocopy "C:\source" "D:\destination" /R:0 /W:0 /L /LOG:C:\logs\robocopy_test.log
ログを見て、コピー対象や除外設定が想定通りになっているか確認してから本番実行するのがおすすめです。
アクセス拒否や一時的なロックを想定する場合の追加オプション
/R:0 /W:0は「エラーが出たファイルは諦める」前提の設定です。ただし、状況によっては「一時的なロックさえ避けられれば、ちゃんとコピーしたい」というケースもあります。
/Z(再開可能モード)と /B(バックアップモード)
特に共有フォルダーやサーバー間コピーなどでは、次のオプションの併用を検討すると成功率が上がります。
| オプション | 意味 | 効果 |
|---|---|---|
/Z | 再開可能モード(restartable mode) | コピー途中で接続が切れても、後で再開できるよう情報を保持する |
/B | バックアップモード | 管理者権限とバックアップ権限を利用して、より多くのファイルにアクセス可能 |
例として、次のようなコマンドが考えられます。
robocopy "\\server\share\source" "D:\backup" ^
/R:0 /W:0 /Z /B ^
/LOG:C:\logs\night_backup.log
これにより、共有フォルダーの一時的な不安定さや、一部ファイルのアクセス権の問題に対して、ある程度耐性を持たせることができます。それでもコピーできないファイルはスキップされますが、その分「処理全体が止まる」リスクは下がります。
失敗したファイルだけを後から再試行する二段構え運用
/R:0 /W:0の最大のメリットは、失敗したファイルの有無に関係なく、とにかく全体を最後まで処理できることです。一方で、「失敗したファイルを本当に諦めて良いのか?」という問題は残ります。
そこで現実的な運用としておすすめなのが、次のような「二段構え」の運用です。
- まずは
/R:0 /W:0で全体を高速に一巡させる - ログを確認し、失敗したファイル(またはフォルダー)を特定する
- 必要に応じて対象を絞った再コピーを、通常の再試行設定(例:
/R:3 /W:5)で行う
1回目:全体をざっと流すコマンド例
robocopy "C:\source" "D:\destination" ^
/MIR /R:0 /W:0 ^
/LOG:C:\logs\backup_first_pass.log
/MIR:ミラーリング(削除も反映)を行う例。環境に応じて/Eなどに変更してもよい- この実行で、コピーできるものは一通りコピーされ、コピーできなかったファイルがログに残る
2回目:ログを元に再試行用のコマンドを作る
ログを開くと、「アクセスが拒否されました」「ファイルが見つかりません」などのエラー行が出力されているはずです。そこから再試行したいフォルダーやファイルを選び、例えば次のように再コピー用のコマンドを別途実行します。
robocopy "C:\source\重要データ" "D:\destination\重要データ" /R:3 /W:5 /LOG:C:\logs\backup_retry.log
このように、「全体は /R:0 /W:0 でとにかく流す」「重要な部分だけ後からしっかり再試行する」という二段構えによって、安全性と処理完了性のバランスをとることができます。
バッチやタスク スケジューラでの終了コードの扱い
Robocopyは、処理結果に応じてさまざまな終了コード(exit code)を返します。バッチファイルやタスク スケジューラから呼び出す場合は、終了コードの意味を理解し、「どこまでを成功とみなすか」を決めておくことが重要です。
代表的なRobocopyの終了コード
主な終了コードの意味は、おおよそ次のように整理できます(ここでは代表的なものだけ取り上げます)。
| コード | 意味(概要) | 一般的な扱い |
|---|---|---|
0 | コピー対象なし/変更なし(完全に同一) | 成功 |
1 | 一部のファイルを新規コピーまたは更新コピーした | 成功 |
2 | ファイルやディレクトリが追加され、一部スキップも発生した | 環境により成功とみなすか判断 |
3〜 | さまざまな警告・エラー | 基本的には要確認 |
特にバッチ処理では、終了コード0と1をともに「成功」とみなす設定にしておくと、実運用上のトラブルを避けやすくなります。終了コード1は「ファイルを正常にコピーした」という意味を含んでおり、エラーではありません。
バッチファイルでの簡単な判定例
終了コードを確認して成否を判定するシンプルなバッチファイル例を示します。
@echo off
set SRC=C:\source
set DST=D:\destination
set LOG=C:\logs\robocopy.log
robocopy "%SRC%" "%DST%" /R:0 /W:0 /LOG:"%LOG%"
set RC=%ERRORLEVEL%
rem 0 と 1 は成功とみなす
if %RC% LEQ 1 (
echo Robocopy 成功(終了コード %RC%)
exit /B 0
) else (
echo Robocopy でエラーが発生しました(終了コード %RC%)
exit /B %RC%
)
このようにしておくと、タスク スケジューラ側から見たときに「0 or 1 なら成功」と判断できるようになり、正常完了しているにもかかわらず「失敗」と誤判定されることを防げます。
PowerShellから実行する場合の例
PowerShellからRobocopyを実行する場合も、終了コードの扱いは同様です。
$src = "C:\source"
$dst = "D:\destination"
$log = "C:\logs\robocopy_ps.log"
robocopy $src $dst /R:0 /W:0 /LOG:$log
$rc = $LASTEXITCODE
if ($rc -le 1) {
Write-Host "Robocopy 成功(終了コード $rc)"
exit 0
}
else {
Write-Host "Robocopy エラー(終了コード $rc)"
exit $rc
}
スクリプトの出口で exit 0 と exit $rc を適切に使い分けることで、監視ツールやタスク スケジューラからの判定が安定します。
エラーの種類別・考え方のまとめ
最後に、「エラーを無視して続行する」際に意識しておきたい、代表的なエラーのパターンと考え方を整理します。
| パターン | よくある原因 | おすすめの考え方・対処 |
|---|---|---|
| ファイルが見つからない | コピー中にファイルが削除された/移動された | /R:0 /W:0でスキップし、必要ならログから対象を特定して再コピー。 |
| アクセスが拒否されました | 権限不足/別プロセスによるロック | 権限を見直す、管理者権限で実行する、/Bの検討。一時的なロックが多い場合は、二段構えで再試行する。 |
| パスが長すぎる | パスの総文字数が制限を超過 | フォルダー構造を整理するか、長いパス対応設定を検討。Robocopy側だけで完全には解決しない。 |
| ネットワーク関連のエラー | ネットワーク不調/NASの負荷/セッション切断 | /Zで再開可能モードを利用しつつ、やはり全体を /R:0 で流し、後で重要な部分だけ再試行する運用が現実的。 |
どのエラーも、「全体を止めるべきレベルなのか」「一時的なものとしてスキップしてよいのか」を決めるのがポイントです。/R:0 /W:0 はその判断を「とりあえずスキップして全体を終わらせる」方向に振る設定と言えます。
実際の運用シナリオ例:夜間バックアップでの活用
最後に、実務でよくある「夜間にファイルサーバーのバックアップを取る」シナリオを例に、Robocopyの設定イメージをまとめます。
要件の例
- 夜間2:00〜5:00の間にバックアップを完了させたい
- 一部のファイルがロックされていても、とにかく全体のコピーを優先したい
- 失敗したファイルは翌日ログを見て確認し、必要なら手動で対処する
推奨コマンド例
robocopy "D:\Data" "E:\Backup\Data" ^
/MIR /R:0 /W:0 /Z /B ^
/LOG:C:\logs\night_backup.log /TEE ^
/NP
この設定では、次のような特徴があります。
- ミラーリング:
/MIRにより、削除も含めて「バックアップ先をソースと同じ構成にする」 - エラーは即スキップ:
/R:0 /W:0で、エラーが出たファイルに固執せず処理を継続 - 接続断への耐性:
/Zや/Bによって、一部の不安定さや権限問題にある程度耐える - ログ保全:
/LOGで詳細ログを残し、翌日失敗ファイルを確認できる
この運用に加えて、週1回などの頻度で「重要フォルダーだけ再試行」するバッチを別途用意しておくと、さらに安心感が高まります。
まとめ:Robocopyの「止まらないコピー」で夜間バッチを安定させる
Robocopyは非常に強力なコピーコマンドですが、既定設定のまま使うと、たった1つのエラーで処理全体が長時間足止めされることがあります。
この記事で紹介したポイントをおさらいすると、次のようになります。
/R:0 /W:0を指定すると、エラーが発生したファイルを即スキップし、残りのファイルのコピーを継続できる- ログをきちんと残すために、
/LOGと/TEE、状況に応じて/NFL /NDL /NPなどを組み合わせる - アクセス拒否やネットワークの不安定さが予想される場合は
/Zや/Bの併用を検討する - まずは
/R:0 /W:0で全体を流し、必要な部分だけ後から再試行する「二段構え」の運用が現実的 - バッチやPowerShellから実行する場合は、終了コード0と1を成功とみなすように判定ロジックを組むと安定する
「エラーが出たら終わり」のコピーから、「エラーが出ても走り切る」コピーに変えるだけで、夜間バッチや定期バックアップの信頼性は大きく向上します。まずはテスト環境で /R:0 /W:0 を試し、自分の環境に最適な組み合わせを探してみてください。

コメント