結論

robocopyは、違うファイルだけをコピーするWindows標準のコマンドです。基本形は robocopy 元 先 /E、/MIR はコピー先も消します。

この記事でわかること

  • オプション早見表45項目と目的別のコマンド例9本
  • /MIRで消える3つの失敗と、/Lで確かめる手順
  • 終了コード0〜16の全表と、ERROR 5・32の直し方

2026年10月23日更新|Microsoft Learn・rsync 3.2.7で対応を確認

robocopy は、コピー元とコピー先を比べて、無いファイルとサイズ・日時の違うファイルだけをコピーします。コピー先にだけあるファイルは、/MIR か /PURGE を付けたときだけ消します。

flowchart TD
    A[コピー元と<br>コピー先を比べる] --> B{元だけ・<br>違う}
    B -->|はい| C[コピー]
    B -->|同じ| D[スキップ]
    A --> E{コピー先<br>だけ}
    E -->|/MIR| F[削除]

急いでいる人向けに、よく調べられることの答えを先にまとめます。

やりたいこと 書き方 詳しい節
フォルダーを中身ごとコピー robocopy C:\src D:\dst /E 基本の書式
コピー元と同じにする(消える) robocopy C:\src D:\dst /MIR /MIR の注意
実行前に何が起きるか見る 上のコマンドに /L を足す /MIR の注意
上書きしない /XC /XN /XO 目的別の例
フォルダー・ファイルを除外 /XD node_modules /XF *.tmp オプション早見表
速くする /MT:16 /NP /LOG:ログ 速くするには
待ち続けないようにする /R:1 /W:1 再試行
成功か失敗かの判定 終了コードが 8 以上なら失敗 終了コード
毎日決まった時刻に動かす バッチを schtasks で登録 タスクスケジューラ

確認環境:robocopy の書式・オプション・既定値・終了コードは、Microsoft Learn の「robocopy」(英語版 2025年3月17日更新・日本語版)と「Return codes that are used by the Robocopy utility」(2026年2月12日更新)、Microsoft のブログのアーカイブ「Robocopy exit codes」、Azure Files の「RoboCopy を使った移行」の解説で確かめました。タスクスケジューラは schtasks /create・Register-ScheduledTask、エラー番号は Win32 のシステム エラー コードのページで確かめています。コピー・ミラー・試運転・除外・失敗の動きは、Ubuntu 24.04.4 LTS の rsync 3.2.7 で同じ操作を実行して対応づけ、robocopy の終了コードの決まりを Python 3.11.15 で実装して rsync の結果に当てはめました。パスの引用符の解釈は、Microsoft Learn に書かれた規則を Python で実装し、ページの例6件と一致することを確かめてから使っています(確認日 2026年10月23日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「robocopyの使い方|オプション早見表・/MIRの注意と終了コード」

robocopyとは(読み方・できること)

この節では、robocopy が何で、copy・xcopy と比べて何ができるかが分かります。

robocopy(ロボコピー)は、Windows に最初から入っているファイルコピーのコマンドです。 名前は「Robust File Copy(堅牢なファイルコピー)」の略で、1996年に Windows NT 4.0 Resource Kit の道具として出て、Windows Vista・Windows Server 2008 から標準で入っています。コマンド プロンプトでも PowerShell でも動きます。PowerShell では $ で始まる名前($RECYCLE.BIN など)が変数として読まれるので、'$RECYCLE.BIN' のように単一引用符で囲みます。

1違うファイルだけコピーする

2回目からは、無いファイルとサイズ・日時の違うファイルだけをコピーする。同じファイルは飛ばす。

2コピー先を同じ状態にする

/MIR で、コピー元に無いファイルをコピー先から消し、2つのフォルダーをそろえる。

3失敗しても続ける

開けないファイルは再試行し、それでも失敗したら飛ばして次へ進む。ネットワークが切れても途中から再開できる(/Z)。

4結果を数で返す

コピーした・余分があった・失敗した、を終了コードとログの集計で返す。定期実行の判定に使える。

ほかにも、アクセス権(ACL)や所有者のコピー、複数スレッドでの並列コピー(/MT)、帯域の制限(/IPG)、変化を見張って自動で再実行(/MON・/MOT)、オプションの保存(/SAVE・/JOB)ができます。

copy・xcopy との違い(概要)

copy は「1つ以上のファイルをコピーする」コマンドで、Microsoft Learn の copy のページでは、サブフォルダーまで全部コピーするなら xcopy を使うよう書かれています。xcopy はフォルダーごとコピーできますが、コピー先にだけあるファイルを消すミラーや、失敗したファイルの再試行はありません。詳しい比較は後の「xcopy・copy・rsync との違い」の表にまとめました。

robocopyの基本の書式と最初のコピー

この節では、書式の意味と、フォルダーを中身ごとコピーする最初のコマンドが分かります。

robocopy <コピー元> <コピー先> [<ファイル>[ ...]] [<オプション>]
部分 意味 書かないと
コピー元 コピー元のフォルダーのパス 書く(必須)
コピー先 コピー先のフォルダーのパス 書く(必須)。無ければ作られる
ファイル コピーするファイル名。* ? が使える *.*(全部)
オプション /E /MIR など。大文字・小文字どちらでもよい 1階層目のファイルだけ

コピー元とコピー先には、ファイルではなくフォルダーを書きます。 1つのファイルだけをコピーするときは、フォルダーを2つ書き、3つ目にファイル名を書きます。

:: フォルダーの中身を、サブフォルダー(空のものも)ごとコピー
robocopy C:\work\project D:\backup\project /E

:: 1つのファイルだけ(report.xlsx)をコピー
robocopy C:\work\project D:\backup\project report.xlsx

:: 拡張子で絞る(.jpg と .jpeg だけ。/S で空のフォルダーは作らない)
robocopy C:\photos D:\photos *.jpg *.jpeg /S
1

オプションなしは1階層目だけ

サブフォルダーはコピーされない。フォルダーごとなら /E(空のフォルダーも)か /S(空のフォルダーは除く)を付ける。

2

コピー元の「中身」がコピーされる

C:\work\project の中身が D:\backup\project の中に入る。project フォルダーの名前はコピー先に自分で書く。

3

2回目からは違うものだけ

同じファイルは飛ばされ、新しいファイルと変わったファイルだけがコピーされる。

ヘルプは robocopy /? で表示されます。

どのファイルがコピーされるか(差分の判定)

robocopy は、ファイルを「クラス」に分けて、コピーするかを決めます。Microsoft Learn のファイル選択のオプションに出てくる名前と、ログの表示の対応です。

クラス どんなファイルか 既定の動き
Lonely(ログは New File) コピー元にだけある コピーする(/XL で除外)
Newer コピー元のほうが日時が後 コピーする(/XN で除外)
Older コピー元のほうが日時が前 コピーする(/XO で除外)
Changed 日時が同じでサイズが違う コピーする(/XC で除外)
Same 日時もサイズも同じ スキップ(/IS で含める)
Tweaked 属性だけが違う スキップ(/IT で含める)
Extra(*EXTRA File) コピー先にだけある 残す(/MIR・/PURGE で削除)
Mismatched(*Mismatch) 同じ名前でファイルとフォルダー 不一致として数える

既定では「コピー元が新しいとき」ではなく「違うとき」にコピーします。 コピー先で編集して日時が後になったファイルも、コピー元の内容で上書きされます。上書きを避けたいときは /XO(コピー元のほうが日時が前なら除外)を付けます。

rsync も既定では「サイズか更新日時が違えばコピーする」決まりなので、同じ状況を作って確かめました。コピー先のファイルを後の日時で書き換えておき、コピーの試運転(-n)をした結果です。

【既定(コピー先のほうが新しい)】
>f.st...... a.txt          ← 日時が前のコピー元で上書きする
【--update(robocopy の /XO 相当)】
(何も出ない)              ← 上書きしない
【--ignore-existing(/XC /XN /XO 相当)】
>f+++++++++ b.txt          ← 新しいファイルだけコピー。a.txt は dst-edited のまま

パスの書き方(引用符と末尾の \ に注意)

空白を含むパスは " で囲みます。引用符で囲んだパスの最後に \ を付けると、パスが壊れます。 Microsoft の C の実行時ライブラリは、\" を「文字としての "」と読む決まり(Microsoft Learn「Parsing C command-line arguments」)だからです。この決まりを Python で書き、ページに載っている6つの例がすべて同じ結果になることを確かめてから、robocopy の引数に当てはめました。

"C:\My Files\" "D:\Backup\My Files\" /MIR
  → 3個: C:\My Files" D:\Backup\My | Files" | /MIR      ← コピー元とコピー先がつながった
"C:\My Files" "D:\Backup\My Files" /MIR
  → 3個: C:\My Files | D:\Backup\My Files | /MIR        ← 正しい
"C:\My Files\\" "D:\Backup\My Files\\" /MIR
  → 3個: C:\My Files\ | D:\Backup\My Files\ | /MIR      ← \ を2つ書けば末尾の \ が残る

1つ目は、コピー元が C:\My Files" D:\Backup\My、コピー先が Files" という、存在しないパスになりました。引用符で囲むときは、末尾の \ を付けません。 ドライブのルートを指すときは D:\ を引用符で囲まずに書きます。

よく使うオプション早見表

この節では、よく使うオプションの意味と既定値が、目的別の一覧で分かります。既定値は Microsoft Learn の robocopy のページで確かめました。

コピーのしかた

オプション 意味 補足
/S サブフォルダーもコピー(空は除く)
/E サブフォルダーもコピー(空も含む) フォルダーごとならこれ
/LEV:n 上から n 階層までコピー
/MIR ミラー(/E + /PURGE) コピー先だけのものを消す
/PURGE コピー元に無いものをコピー先から消す
/MOV ファイルを移動(コピー後に元を消す) フォルダーは残る
/MOVE ファイルとフォルダーを移動
/Z 再開可能モード 途中で切れても続きから
/B バックアップ モード 管理者で実行。ACL を越えて読む
/ZB /Z で、アクセス拒否なら /B に切り替え
/J バッファーを使わない入出力 大きいファイル向け
/MT:n n スレッドで並列コピー 既定 8。1〜128
/IPG:n パケットの間をあける 遅い回線の帯域を空ける
/CREATE フォルダー構成と0バイトのファイルだけ作る
/SL シンボリックリンクをリンクのままコピー

何をコピーするか(属性・権限)

オプション 意味 既定
/COPY:フラグ ファイルの何をコピーするか DAT
/DCOPY:フラグ フォルダーの何をコピーするか DA
/SEC アクセス権もコピー(/COPY:DATS)
/COPYALL 全部コピー(/COPY:DATSOU)
/NOCOPY 何もコピーしない(/PURGE と使う)

フラグは、D=データ、A=属性、T=タイムスタンプ、S=NTFS のアクセス権(ACL)、O=所有者、U=監査の情報、X=代替データ ストリームを飛ばす、です。/DCOPY では E=拡張属性も指定できます。既定の /COPY:DAT ではアクセス権はコピーされません。 ファイルサーバーの移行のように権限ごと移すときは /COPY:DATSO や /COPYALL を使います。

選ぶ・除外する

オプション 意味 例
/XD フォルダー フォルダーを除外 /XD node_modules .git
/XF ファイル ファイルを除外(* ? 可) /XF *.tmp ~$*
/XO コピー元のほうが日時が前なら除外 上書きを防ぐ
/XN コピー元のほうが日時が後なら除外
/XC 日時が同じでサイズが違えば除外
/XX コピー先だけのもの(Extra)を除外 /MIR でも消さない
/XJ ジャンクションを除外 ループを防ぐ
/MAXAGE:n n 日(または日付)より前のものを除外 /MAXAGE:7
/MINAGE:n n 日(または日付)より後のものを除外
/MAX:n /MIN:n サイズ(バイト)の上限・下限
/A /M アーカイブ属性のあるものだけ /M は属性を外す
/FFT FAT の時刻の精度(2秒)で比べる NAS で毎回コピーされるとき

/XD・/XF は、名前を空白で区切って続けて書けます。/XD node_modules .git のように1つの /XD に並べます。

再試行・ログ・ジョブ

オプション 意味 既定
/R:n 失敗したときの再試行の回数 1,000,000
/W:n 再試行までの待ち時間(秒) 30
/L 一覧だけ(コピー・削除・時刻の変更をしない) 試運転に使う
/LOG:ファイル ログに書く(上書き)
/LOG+:ファイル ログに書く(追記)
/UNILOG:ファイル Unicode でログに書く /UNILOG+ は追記
/TEE 画面とログの両方に出す
/NP 進み具合(%)を出さない
/NFL /NDL ファイル名・フォルダー名を出さない
/NJH /NJS 先頭の見出し・最後の集計を出さない
/V スキップしたファイルも出す
/FP /TS フルパス・タイムスタンプを出す
/SAVE:名前 /JOB:名前 オプションを保存・読み込み .RCJ ファイル

既定の再試行は、1つのファイルで最長347日待つ

100万回/R の既定値失敗したファイルの再試行の回数
30秒/W の既定値再試行までの待ち時間
347日掛け算した最長の待ち30,000,000 秒

/R と /W を書かないと、使用中のファイルが1つあるだけで、robocopy はそこで止まったように見えます。 定期実行では必ず /R:1 /W:1 のように小さい値を書きます。Azure Files の移行ガイドでは、ファイルが使用中で失敗したと考えられるときは再試行を0か1回にし、次の回の実行で拾う方針が書かれています。/REG を付けると、そのときの /R と /W をレジストリーに保存して既定値にできます。

/MIRの使い方と危険(消える)・/Lで確かめる手順

この節では、/MIR が何を消すか、よくある3つの失敗、実行前に /L で確かめる手順が分かります。

/MIR は「/E + /PURGE」で、コピー元に無いファイルとフォルダーを、コピー先から削除します。 削除したファイルはごみ箱に入りません。バックアップ先を /MIR でそろえると、コピー元で間違って消したファイルも、次の実行でバックアップ先から消えます。

バックアップ先をどうそろえるか

/Eコピー先だけのファイルは残る。消したファイルも取り戻せる。そのぶんコピー先は増え続ける
→
/MIRコピー元と同じになる。コピー元で消したもの・パスの指定を間違えたときの対象も、コピー先から消える

履歴を残したいなら /E、同じにしたいなら /MIR を、/L で確かめてから

/MIR で起きた3つの失敗(rsync で再現)

robocopy の /MIR と同じ動き(コピーして、コピー先だけのものを消す)は、rsync の -a --delete です。robocopy の /L に当たる試運転は -n です。8個のファイルがあるコピー先に対して、試運転で何が消えるかを見ました(*deleting が削除される予定のもの)。

失敗1:コピー元の階層を間違えた(C:\src\docs を D:\dst に /MIR した場合)

*deleting   olddir/z.txt
*deleting   olddir/
*deleting   node_modules/pkg/index.js
*deleting   node_modules/pkg/
*deleting   node_modules/
*deleting   img/logo.png
*deleting   img/
*deleting   empty/
*deleting   docs/old/memo.txt
*deleting   docs/old/
*deleting   docs/report.txt
*deleting   docs/new.txt
*deleting   docs/extra.txt
*deleting   docs/cache.tmp
*deleting   docs/
>f+++++++++ cache.tmp
>f+++++++++ new.txt
>f+++++++++ report.txt
cd+++++++++ old/
>f+++++++++ old/memo.txt

コピー先の8個のファイルが全部消え、docs の中身がコピー先の1階層目に置かれる予定になりました。 Azure Files の移行ガイドにも、/MIR ではコピー元とコピー先のフォルダーの階層を正確に合わせること、合っていないと大規模な削除と再コピーが起きることが書かれています。

失敗2:コピー元とコピー先を逆に書いた(コピー元にだけある今日のファイル today.txt があるとき)

*deleting   docs/today.txt
.d..t...... docs/
>f+++++++++ docs/extra.txt
cd+++++++++ olddir/
>f+++++++++ olddir/z.txt

バックアップ先をコピー元にしてしまうと、まだバックアップしていない作業中のファイルが消え、代わりにバックアップ先にだけあったファイルが作業フォルダーに入ってきます。

失敗3:コピー先にだけ置いたファイル

バックアップ先に手で置いたメモ(docs/extra.txt)や、別の処理が作ったフォルダー(olddir)は、コピー元に無いので /MIR で消える予定になりました。

*deleting   olddir/z.txt
*deleting   olddir/
*deleting   docs/extra.txt

robocopy では、コピー先だけのものを消さずに残す /XX があります。除外の扱いは robocopy と rsync で同じとは限らないので、/XD・/XF を付けた /MIR も、/L で消える一覧を見てから実行します。

/L で確かめてから実行する手順

1

本番と同じコマンドに /L を足す

robocopy C:\src D:\dst /MIR /L /TEE /LOG:C:\logs\check.log。/L ではコピー・削除・時刻の変更をしない。

2

*EXTRA の行を数える

ログの *EXTRA File・*EXTRA Dir が、/MIR で消える予定のもの。集計表の Extras 列にも数が出る。

3

消えて困るものが無いかを見る

件数が思ったより多ければ、コピー元・コピー先の階層と向きを見直す。

4

/L を外して実行する

/NP /NFL /NDL を付けているときは、試運転では外すと一覧が出る(Azure Files の移行ガイドの注意)。

Buffalo の NAS の FAQ でも、コピーをせずに差分だけを比べる方法として /L /E /R:1 /FP /LOG:... の形が案内されています。

rsync には削除の上限があり、robocopy には無い

rsync には --max-delete=件数 で削除の数に上限をかける仕組みがあります。失敗1の状態に --max-delete=3 を付けて実行すると、上限で削除が止まり(9件はスキップ)、終了コード 25 で終わりました。

Deletions stopped due to --max-delete limit (9 skipped)
rsync error: the --max-delete limit stopped deletions (code 25) at main.c(1356) [sender=3.2.7]

それでも olddir/z.txt と node_modules/pkg/index.js は消え、docs の中身はコピー先の1階層目にコピーされたので、元の状態には戻りません。robocopy のオプションの一覧に、削除の件数の上限はありません。robocopy で消しすぎを防ぐ方法は、/L での試運転と、パスを変数にしないで書くことです。

目的別のコマンド例(ミラー・バックアップ・移動・差分)

この節では、よくある目的ごとに、そのまま書き換えて使えるコマンドが分かります。

:: 1. フォルダーを中身ごとコピー(空のフォルダーも)
robocopy C:\work D:\backup\work /E /R:1 /W:1

:: 2. ミラー(コピー元と同じにする。消える)。先に /L で確かめる
robocopy C:\work D:\backup\work /MIR /R:1 /W:1 /NP /LOG:C:\logs\mirror.log

:: 3. 上書きしない(コピー先に無いファイルだけコピー)
robocopy C:\work D:\backup\work /E /XC /XN /XO

:: 4. 開発フォルダーを、生成物を除いてコピー
robocopy C:\dev\app D:\backup\app /E /XD node_modules .git bin obj /XF *.tmp *.log

:: 5. 7日以内に更新したファイルだけをコピー
robocopy C:\work D:\backup\recent /S /MAXAGE:7

:: 6. 移動(コピー後にコピー元から消す。フォルダーごと)
robocopy C:\inbox D:\archive /MOVE /E

:: 7. フォルダー構成だけをコピー(ファイルはコピーしない)
robocopy C:\template D:\new /E /XF *

:: 8. ファイルサーバーの移行(権限・所有者も。管理者で実行)
robocopy \\old-server\share \\new-server\share /MIR /B /COPY:DATSO /DCOPY:DAT /MT:16 /R:2 /W:1 /NP /NFL /NDL /XD "System Volume Information" /UNILOG:C:\logs\migrate.log

:: 9. オプションを保存して、次から呼び出す
robocopy C:\work D:\backup\work /MIR /R:1 /W:1 /SAVE:daily /QUIT
robocopy /JOB:daily
  • 7 の /XF * は、すべてのファイルを除外して、フォルダーだけを作る書き方です。0バイトのファイルも作るなら /CREATE です。
  • 8 は、Azure Files の移行ガイドで勧められているオプションの組み合わせを、サーバー間の移行に当てはめたものです。ガイドでは /MT は最初のコピーで 8〜20、その後の /MIR の実行ではマシンの CPU のスレッド数に近づけるよう書かれています。
  • 9 の /SAVE は、Microsoft Learn によると、コピー・再試行・ログのオプションをすべて /SAVE より前に書きます。保存先は .RCJ のファイルです。/QUIT はコマンドラインを処理して終わる(パラメーターを見るため)ので、コピーはされません。

ドライブ全体をミラーするとき

ドライブのルート(E:\ など)を対象にすると、隠しフォルダーの $RECYCLE.BIN(ごみ箱)や System Volume Information でアクセス拒否(ERROR 5)が出ることがあります。Microsoft Learn の Q&A では、これらを /XD で除外する形が案内されています。

robocopy E:\ F:\ /MIR /R:1 /W:1 /XD $RECYCLE.BIN "System Volume Information"

Microsoft Learn の説明では、いまの robocopy は /PURGE・/MIR のとき、コピー元とコピー先の1階層目にある System Volume Information を自動で飛ばします。ごみ箱のフォルダーは自動では飛ばされないので、/XD に書きます。

robocopyを速くするには(/MT・ログの出し方)

この節では、コピーが遅いときに見るオプションと、逆に遅くなるオプションが分かります。

書き方 効果 出典の説明
/MT:n 複数のファイルを並列にコピー 既定 8。1〜128
/LOG:ファイル 画面への出力を減らす /MT のときはログに出すと速い
/NP 進み具合(%)を出さない 表示は速さを大きく落とす
/NFL /NDL ファイル名・フォルダー名を出さない 速くなる
/J バッファーなしの入出力 大きいファイル向け
/Z /ZB 再開可能モード 記録が増えて大きく遅くなる

Azure Files の移行ガイドでは、/Z と /ZB は「Use cautiously(注意して使う)」とされ、不安定なネットワークのときだけ勧められています。小さいファイルが多いときは /MT、大きいファイルが少ないときは /J が効く場面です。 /MT は /IPG・/EFSRAW と一緒には使えません。

robocopyのログの読み方

この節では、ログの3つの部分(見出し・ファイルごとの行・集計表)の読み方と、エラーの行の見つけ方が分かります。

ログは /LOG:ファイル(上書き)か /LOG+:ファイル(追記)で残します。画面にも出すなら /TEE を足します。

robocopy C:\work D:\backup\work /MIR /R:1 /W:1 /NP /TEE /LOG+:C:\logs\backup.log

ログは上から次の3つの部分でできています。

見出しとファイルの行

見出し:開始日時・コピー元・コピー先・オプション(/NJH で消える)

フォルダーの行:New Dir・*EXTRA Dir と件数

ファイルの行:New File・Newer・Older・*EXTRA File・*Mismatch とサイズ

集計表とエラー

最後の表:Dirs・Files・Bytes・Times ごとの件数(/NJS で消える)

ERROR の行:エラー番号と、何をしていたかとパス

同じファイル(same)は /V のときだけ出る

ファイルの行の見方

ログの表示 意味 対応する rsync -i の表示
New File コピー元にだけある。コピーした >f+++++++++
Newer コピー元のほうが日時が後。コピーした >f..t......
Older コピー元のほうが日時が前。コピーした >f..t......(サイズも違えば >f.st......)
*EXTRA File コピー先にだけある *deleting(削除するとき)
New Dir 新しく作ったフォルダー cd+++++++++
*Mismatch 同じ名前でファイルとフォルダー could not make way で失敗(23)

表示の語は、RoboSharp(robocopy のログを読む公開のライブラリ)の英語版の設定と、Microsoft Learn のファイル選択のオプションの名前で確かめました。英語以外の Windows では語が訳されて出ることがあり、RoboSharp にはドイツ語版の設定(ERROR が FEHLER)があります。日本語の Windows のログでは、Buffalo の FAQ に「コピー済み」欄の説明があります。

最後の集計表の見方

hahndorf.eu で公開されている、実際のログの集計表です。

            Total    Copied   Skipped  Mismatch    FAILED    Extras
 Dirs :     13796         1     13794         0         1         0
Files :   4011310     14482   3996828         0         0         3
Bytes : 283.661 g   1.378 g 282.283 g         0         0    33.9 k
Times :   0:15:15   0:08:03                       0:00:00   0:07:12
列 意味 この例の読み方
Total 調べた数 ファイル 4,011,310 個
Copied コピーした数 14,482 個・1.378 GB
Skipped 同じなので飛ばした数 3,996,828 個
Mismatch ファイルとフォルダーの食い違い 0
FAILED 失敗した数 フォルダー 1 個
Extras コピー先にだけある数 ファイル 3 個

まず FAILED 列が 0 かを見て、0 でなければログを ERROR で検索します。 この例のフォルダー1個の失敗は、ログの中の次の行が原因でした。

2018/11/13 20:29:22 ERROR 5 (0x00000005) Accessing Source Directory K:\data\export-2017\05\20\ Access is denied.

ERROR の行は「日時・ERROR 番号(16進)・何をしていたか・パス・Windows のエラー文」の順に並びます。番号の意味は、後の「よくあるエラー」の表で引けます。

rsync のログとの対応

rsync で --log-file と --stats を付けたときの集計(ファイル6・フォルダー7を全部コピー)です。

Number of files: 13 (reg: 6, dir: 7)
Number of created files: 13 (reg: 6, dir: 7)
Number of deleted files: 0
Number of regular files transferred: 6
Total file size: 2,073 bytes

robocopy の集計表の Copied に当たるのが「transferred」、Extras を消した数に当たるのが「deleted files」です。rsync には Skipped・FAILED の列は無く、失敗は終了コードとエラーの行で分かります。

robocopyの終了コード(0〜16)の意味と判定

この節では、終了コードの意味、成功と失敗の分かれ目、バッチ・PowerShell での判定の書き方が分かります。

robocopy の終了コードは、5つの意味を持つ数(1・2・4・8・16)の足し算です。8 以上なら、少なくとも1つ失敗しています。 0 と 1 はどちらも成功です。

flowchart TD
    A[終了コード] --> B{8 以上}
    B -->|はい| C[失敗あり<br>ERROR を見る]
    B -->|いいえ| D{0}
    D -->|はい| E[変更なし]
    D -->|いいえ| F[成功<br>1〜7]
値 意味(ビット) 出典
0 コピーも失敗も不一致も無い(変更なし) Microsoft Learn
1 ファイルをコピーした Microsoft Learn
2 コピー先にだけあるもの(Extra)がある Microsoft Learn
4 不一致(Mismatch)がある Microsoft のブログのアーカイブ
8 コピーできなかったものがある(再試行の上限を超えた) Microsoft Learn
16 重大なエラー。何もコピーしていない Microsoft のブログのアーカイブ

Microsoft Learn の表は 0・1・2・3・5・6・7・8 で、「8 以上は少なくとも1つの失敗」と書かれています。4 と 16 の意味は、Microsoft のブログのアーカイブ「Robocopy exit codes」(2008年)にあり、16 は「コマンドラインのパラメーターと、コピー先への書き込みの権限を確かめる」よう書かれています。

0〜16 の全表(計算した結果)

1・2・4・8・16 の足し算を、Python で 0〜16 まで分解した結果です。

値 判定 中身
0 成功 変更なし
1 成功 コピーした
2 成功 Extra あり
3 成功 コピーした+Extra あり
4 成功 Mismatch あり
5 成功 コピーした+Mismatch あり
6 成功 Extra あり+Mismatch あり
7 成功 コピーした+Extra あり+Mismatch あり
8 失敗 失敗あり
9 失敗 コピーした+失敗あり
10 失敗 Extra あり+失敗あり
11 失敗 コピーした+Extra あり+失敗あり
12 失敗 Mismatch あり+失敗あり
13 失敗 コピーした+Mismatch あり+失敗あり
14 失敗 Extra あり+Mismatch あり+失敗あり
15 失敗 コピーした+Extra あり+Mismatch あり+失敗あり
16 失敗 重大なエラー

同じ操作を rsync で実行して、終了コードを対応づける

rsync の終了コードは「0=成功」で、コピーしたかどうかでは変わりません。そこで、rsync を -i(変更の一覧を出す)付きで実行し、その出力を robocopy の決まり(コピーしたら 1、コピー先だけのものがあれば 2、一部が失敗なら 8、1つもコピーできなければ 16)で採点する Python のプログラムを書いて、7つの状況を実行しました。

状況 rsync の終了コード robocopy の決まりで採点
初めてコピー 0 1(成功)
もう一度実行(変更なし) 0 0(成功)
コピー先にだけ old.txt 0 2(成功)
新しいファイル+old.txt 0 3(成功)
ミラー(old.txt を消す) 0 3(成功)
読めないファイルが1つ 23 9(失敗)
コピー元のフォルダーが無い 23 16(失敗)

ミラーの行は、消したものを Extra として数える決まりで採点しました。読めないファイルの状況は、権限の無いユーザー(nobody)で rsync を動かして作り、次のエラーが出ました。

rsync: [sender] send_files failed to open ".../s2/secret.txt": Permission denied (13)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1356) [sender=3.2.7]

読めたほうの ok.txt はコピーされ、secret.txt だけが失敗しました。robocopy でも同じように、失敗したファイルを飛ばして最後まで進み、終了コードの 8 のビットで知らせます。 途中で止まらないので、終了コードを見ない運用では失敗に気づけません。

robocopy の終了コード

ビットの足し算(1・2・4・8・16)

コピーしたら 1。0 以外でも成功がある

8 以上が失敗

rsync の終了コード

原因ごとの番号(1・23・24・25 など)

コピーしても 0

0 以外が失敗(24 は消えたファイルの警告)

rsync 3.2.7 のソース(errcode.h・log.c)で確かめた主な番号は、1=syntax or usage error、23=some files/attrs were not transferred、24=some files vanished before they could be transferred、25=the --max-delete limit stopped deletions、30=timeout in data send/receive です。

バッチで判定する

if errorlevel 8 は「直前の終了コードが 8 以上なら」という意味です(Microsoft Learn の if のページ)。比べる演算子の GEQ(以上)・LSS(未満)でも書けます。

@echo off
robocopy C:\work D:\backup\work /MIR /R:1 /W:1 /NP /LOG+:C:\logs\backup.log
set RC=%ERRORLEVEL%
if %RC% GEQ 8 (
  echo [%date% %time%] robocopy 失敗 終了コード=%RC% >> C:\logs\backup-error.log
  exit /b %RC%
)
exit /b 0

最後に exit /b 0 を書くのは、robocopy の 1〜7(成功)を、呼び出し元に 0 として返すためです。 Microsoft の Windows HPC Server 2008 のドキュメントには、robocopy が成功でも 0 以外を返すので、ジョブの管理の仕組みが「失敗」と記録する例と、IF %ERRORLEVEL% LEQ 1 exit 0 で 0 に直す書き方が載っています。CI のジョブや監視の仕組みも、多くは「0 以外は失敗」と扱います。

PowerShell で判定する

PowerShell では、直前に動かしたプログラムの終了コードが $LASTEXITCODE に入ります。

robocopy C:\work D:\backup\work /MIR /R:1 /W:1 /NP /LOG+:C:\logs\backup.log
$rc = $LASTEXITCODE
if ($rc -ge 8) {
    Write-Error "robocopy 失敗: 終了コード $rc"
    exit $rc
}
"成功: 終了コード $rc(1=コピー, 2=Extra, 4=Mismatch の和)"
exit 0

PowerShell 自体のコマンドの一覧は、関連記事「PowerShellコマンド一覧|用途別50選とbash対応表・実行例付き」で扱っています。

タスクスケジューラでrobocopyを定期実行する

この節では、上のバッチを毎日決まった時刻に動かす登録のしかたと、つまずきやすい点が分かります。

schtasks で登録する(コマンド プロンプト)

管理者のコマンド プロンプトで、毎日 2時に SYSTEM のアカウントで動かす例です。

schtasks /create /tn "Backup\robocopy-daily" /tr "C:\scripts\backup.bat" /sc daily /st 02:00 /ru SYSTEM /rl HIGHEST /f
オプション 意味
/tn タスクの名前。フォルダー\名前 で分けられる
/tr 動かすファイル(フルパス・262文字まで)
/sc daily /st 02:00 毎日、24時間表記の時刻に
/ru SYSTEM ローカルの System のアカウントで動かす(パスワード不要)
/rl HIGHEST 最も高い権限で動かす(既定は LIMITED)
/f 同じ名前があれば上書きする

Microsoft Learn の schtasks /create の例では、SYSTEM で登録すると INFO: The task will be created under user name (NT AUTHORITY\SYSTEM). と SUCCESS: The Scheduled task MyApp has successfully been created. が表示されます。

PowerShell で登録する

$action  = New-ScheduledTaskAction -Execute "C:\scripts\backup.bat"
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
Register-ScheduledTask -TaskName "robocopy-daily" -Action $action -Trigger $trigger `
    -User "NT AUTHORITY\SYSTEM" -RunLevel Highest

定期実行で確かめること

  • 1/R と /W を小さくしたか書かないと既定の 100万回・30秒で、使用中のファイルで止まり続ける
  • 2ドライブ文字ではなく UNC パスで書いたか手で割り当てた Z: などは、タスクのアカウントから見えないことがある
  • 3共有フォルダーに、動かすアカウントの権限があるかSYSTEM はネットワークではコンピューターの資格情報で接続する
  • 4終了コード 1〜7 を 0 にして返しているかそのままだと成功したのに失敗に見える。8 以上はそのまま返す
  • 5ログを /LOG+ で追記しているか/LOG は毎回上書きなので、失敗した日のログが次の日に消える
  • 6/MIR なら、一度 /L で消える一覧を見たか定期実行は人が見ていない時刻に動くので、最初の1回は必ず確かめる

Microsoft Learn の LocalSystem アカウントの説明では、このアカウントで動くサービスは「リモートのサーバーにコンピューターの資格情報を示す」とされています。SYSTEM で動かしたタスクがファイルサーバーに書けないときは、共有フォルダーの権限にコンピューターのアカウントを足すか、権限のあるユーザーで登録します(/ru ユーザー /rp パスワード)。

Linux で同じことを cron と rsync で行う書き方は、関連記事「cronの書き方|設定例30パターンの早見表と落とし穴まとめ」で扱っています。コマンドではなく画面の操作で自動化したいときは、関連記事「Power Automate Desktopとは|使い方・無料の範囲とエラー処理」で扱っています。

よくあるエラーと直し方(ERROR 5・ERROR 32 ほか)

この節では、ログに出る ERROR の番号から、原因と直し方を引けます。エラー文は Win32 のシステム エラー コードのページの原文です。

ERROR 番号 エラー文(原文) 直し方
5 (0x00000005) Access is denied. 管理者で実行し /B か /ZB。$RECYCLE.BIN などを /XD
32 (0x00000020) The process cannot access the file because it is being used by another process. 使っているアプリを閉じる。/R:1 /W:1 で飛ばし、次回に拾う
2 (0x00000002) The system cannot find the file specified. コピー元のパスと名前を確かめる
3 (0x00000003) The system cannot find the path specified. フォルダーのパス、末尾の \ と引用符を確かめる
53 (0x00000035) The network path was not found. サーバー名・名前解決・ファイル共有の許可
67 (0x00000043) The network name cannot be found. 共有名を確かめる。/TBD で共有が現れるまで待つ
64 (0x00000040) The specified network name is no longer available. 回線の切断。/Z で再開できるようにする
112 (0x00000070) There is not enough space on the disk. コピー先の空きを増やす。/LFSM で止める
123 (0x0000007B) The filename, directory name, or volume label syntax is incorrect. パスの引用符・使えない文字
206 (0x000000CE) The filename or extension is too long. パスを短くする(robocopy は既定で長いパスに対応)
1326 (0x0000052E) The user name or password is incorrect. 先に net use で接続するか、タスクのアカウントを見直す
1314 (0x00000522) A required privilege is not held by the client. 管理者で実行。/COPYALL を /COPY:DATSO に減らして試す

ERROR 5(アクセスが拒否されました)

ERROR 5 は権限が無いときのエラーです。 次の順に確かめます。

  1. コマンド プロンプトや PowerShell を「管理者として実行」で開いたか。/B・/ZB(バックアップ モード)は管理者のコンソールが前提です(Azure Files の移行ガイド)。
  2. ドライブのルートを対象にしていないか。$RECYCLE.BIN・System Volume Information は /XD で除外します。
  3. アクセス権のコピー(/COPY の S・O・U、/COPYALL)で失敗していないか。権限ごと移す必要が無ければ、既定の /COPY:DAT に戻します。
  4. コピー先が共有フォルダーなら、共有の権限と NTFS の権限の両方で書き込みが許されているか。
:: 管理者のコンソールで、アクセス拒否ならバックアップ モードに切り替える
robocopy C:\data D:\backup\data /E /ZB /R:1 /W:1 /XD $RECYCLE.BIN "System Volume Information" /LOG+:C:\logs\backup.log

ERROR 32(ほかのプロセスが使用中)

ERROR 32 は、ほかのアプリがファイルを開いていて、読めないときのエラーです。Outlook の .pst、動いているデータベースのファイル、開いている Office の文書などで出ます。

  • 既定の /R・/W のままだと、そのファイルで最長347日待ちます。/R:1 /W:1 で飛ばし、次の実行で拾います(Azure Files の移行ガイドの考え方)。
  • そのアプリを止める時間帯にタスクを動かします。
  • データベースは、ファイルをコピーせず、そのデータベースのバックアップの機能で出力したファイルをコピーします。

Linux では事情が違います。rsync で、別のプロセスが flock -x でロックしているファイルをコピーすると、エラーにならずにコピーされました(終了コード 0)。Linux のファイルのロックは、協力し合うプログラムどうしの約束(勧告ロック)が基本で、読むことは止めないためです。Windows から Linux に置き換えると、使用中のファイルが「エラーにならずに、書きかけの状態でコピーされる」ことがあります。

robocopyとxcopy・copy・rsyncの違い

この節では、似たコマンドとの違いと、Linux・Mac の rsync との対応が分かります。

項目 robocopy xcopy copy rsync
OS Windows Windows Windows Linux・Mac 等
フォルダーごと /E・/S /E・/S できない -a
違うものだけ 既定 /D(日付が後) できない 既定
ミラー(消す) /MIR できない できない --delete
試運転 /L /L できない -n
再試行 /R・/W できない(/C で無視) できない できない
並列 /MT できない できない できない
中断から再開 /Z /Z /Z --partial
権限のコピー /COPY:DATSOU /O /X できない -A -X(-a に含まない)
終了コード ビットの和・8以上が失敗 0〜5 Learn に表なし 原因ごとの番号

xcopy の終了コードは、Microsoft Learn によると 0=エラーなくコピー、1=コピーするファイルが無い、2=Ctrl+C で中断、4=初期化のエラー、5=ディスクの書き込みエラー、です。robocopy とは数の意味が違うので、xcopy から書き換えるときは判定の式も変えます。

robocopy と rsync のオプションの対応

robocopy rsync メモ
src dst /E -a src/ dst/ rsync は src の後ろの / で中身を指す
/MIR -a --delete
/L -n(--dry-run)
/XD 名前 /XF *.tmp --exclude=名前/ --exclude='*.tmp'
/XO --update
/XC /XN /XO --ignore-existing
/MOV --remove-source-files
/MAX:n --max-size=n
/LOG:ファイル --log-file=ファイル
/V -v -i
(無し) --max-delete=n 削除の上限

いちばん違うのは、コピー元の書き方です。 robocopy はコピー元のフォルダーの中身をコピー先に入れます。rsync は src/(末尾の / あり)で中身を、src(なし)でフォルダーごとをコピーします。rsync の詳しい使い方は関連記事「rsyncの使い方|オプション一覧と目的別コピペ例(実行結果つき)」、Linux の cp との違いは関連記事「cp・rm・mvコマンドの使い方|オプション早見表とエラーの直し方」で扱っています。

よくある質問

Q. robocopyの読み方は? A. 「ロボコピー」です。Robust File Copy(堅牢なファイルコピー)の略で、Windows Vista・Windows Server 2008 から標準で入っています。

Q. robocopyで差分だけコピーするには? A. オプションを足さなくても、2回目からは無いファイルとサイズ・日時の違うファイルだけをコピーします。robocopy C:\src D:\dst /E を繰り返すと差分のコピーになります。

Q. robocopyで上書きしないようにするには? A. /XC /XN /XO を付けると、コピー先に同じ名前のファイルがあるときはコピーしません。コピー元のほうが日時が前のときだけ上書きを避けたいなら /XO だけを付けます。

Q. /MIRと/Eの違いは? A. /E はコピーするだけで、コピー先にだけあるファイルは残ります。/MIR は /E + /PURGE で、コピー元に無いファイルとフォルダーをコピー先から消します。/MIR は先に /L で消える一覧を確かめます。

Q. robocopyの終了コード1はエラーですか? A. エラーではありません。1 は「ファイルをコピーした」という成功の意味です。8 以上が失敗で、0〜7 は成功です。タスクやジョブで失敗に見えるときは、バッチで 8 未満を exit /b 0 にして返します。

Q. robocopyが遅いときは? A. /MT:16 などで並列にし、/NP・/NFL・/NDL で画面への出力を減らし、/LOG でログに出します。/Z・/ZB は記録が増えて遅くなるので、不安定な回線のときだけ使います。

Q. 特定のフォルダーやファイルを除外するには? A. フォルダーは /XD node_modules .git、ファイルは /XF *.tmp *.log のように、名前を空白で区切って続けて書きます。/XF ではワイルドカード(* ?)が使えます。

Q. robocopyでファイルを移動するには? A. /MOV はファイルだけを移動し、コピー元のフォルダーは残します。/MOVE はファイルとフォルダーを移動します。どちらもコピーしてからコピー元を消します。

Q. フォルダー構成だけをコピーするには? A. robocopy C:\src D:\dst /E /XF * で、すべてのファイルを除外してフォルダーだけを作ります。0バイトのファイルも作るなら /CREATE です。

Q. ERROR 5 (0x00000005) Access is denied. が出ます A. 権限が無いエラーです。管理者のコンソールで /B か /ZB を付け、ドライブのルートなら $RECYCLE.BIN と System Volume Information を /XD で除外します。

Q. ERROR 32 (0x00000020) が出て止まったように見えます A. ほかのアプリがファイルを使っているエラーです。/R と /W を書かないと既定の100万回・30秒で待ち続けるので、/R:1 /W:1 で飛ばし、アプリを閉じた後に再実行します。

Q. MacやLinuxでrobocopyは使えますか? A. robocopy は Windows のコマンドです。Mac・Linux で同じことをするなら rsync を使い、/MIR は rsync -a --delete、/L は -n に当たります。

まとめ

  • robocopy は robocopy コピー元 コピー先 /E でフォルダーを中身ごとコピーし、2回目からは違うファイルだけをコピーする。既定では日時が前のファイルでも上書きする(避けるなら /XO)。
  • 引用符で囲んだパスの末尾に \ を付けない。\" が文字の " になり、引数がつながる。
  • /MIR は /E + /PURGE で、コピー先にだけあるものを消す。階層の間違い・向きの間違い・コピー先にだけ置いたファイルの3つで消える。先に /L で確かめる。
  • /R と /W の既定は 100万回・30秒で、1つのファイルで最長347日待つ。定期実行では /R:1 /W:1 のように書く。
  • 終了コードは 1・2・4・8・16 の足し算。0〜7 は成功、8 以上は失敗。バッチでは 8 未満を exit /b 0 にして返す。
  • 速くするなら /MT と /NP /NFL /NDL と /LOG。/Z・/ZB は遅くなる。
  • ERROR 5 は管理者で /B・/ZB と /XD、ERROR 32 は /R:1 /W:1 で飛ばして次回に拾う。

参考・出典

確認日はいずれも 2026年10月23日です。

  • Microsoft Learn「robocopy」:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy
  • Microsoft Learn「robocopy」(日本語版):https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/robocopy
  • Microsoft Learn「Return codes that are used by the Robocopy utility in Windows Server」:https://learn.microsoft.com/en-us/troubleshoot/windows-server/backup-and-storage/return-codes-used-robocopy-utility
  • Microsoft Learn(ブログのアーカイブ)「Robocopy Exit Codes」:https://learn.microsoft.com/en-us/archive/blogs/deploymentguys/robocopy-exit-codes
  • Microsoft Learn「Migrate to SMB Azure file shares using RoboCopy」:https://learn.microsoft.com/en-us/azure/storage/files/storage-files-migration-robocopy
  • Microsoft Learn「Tasks That Complete Successfully Are Marked As Failed」(Windows HPC Server 2008):https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-hpc-server-2008/ff182367(v=ws.10)
  • Microsoft Learn「xcopy」:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy
  • Microsoft Learn「copy」:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/copy
  • Microsoft Learn「if」:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/if
  • Microsoft Learn「schtasks create」:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks-create
  • Microsoft Learn「Register-ScheduledTask」:https://learn.microsoft.com/en-us/powershell/module/scheduledtasks/register-scheduledtask
  • Microsoft Learn「about_Automatic_Variables」:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables
  • Microsoft Learn「LocalSystem Account」:https://learn.microsoft.com/en-us/windows/win32/services/localsystem-account
  • Microsoft Learn「System Error Codes (0-499)」:https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
  • Microsoft Learn「System Error Codes (1300-1699)」:https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--1300-1699-
  • Microsoft Learn「Parsing C command-line arguments」:https://learn.microsoft.com/en-us/cpp/c-language/parsing-c-command-line-arguments
  • Microsoft Learn Q&A「ERROR 5 (0x00000005) Accessing Destination Directory」:https://learn.microsoft.com/en-us/answers/questions/1302972/robocopy-dummy-needs-your-help-with-error-code-5-r
  • Buffalo「Robocopyを使用したファイル比較方法」:https://www.buffalo.jp/support/faq/detail/124145602.html
  • hahndorf.eu「Robocopy Directory Failure」:https://hahndorf.eu/blog/RobocopyDirectoryFailure.html
  • GitHub「tjscience/RoboSharp」:https://github.com/tjscience/RoboSharp
  • GitHub「RsyncProject/rsync」(v3.2.7 の errcode.h・log.c):https://github.com/RsyncProject/rsync
  • Wikipedia「Robocopy」:https://en.wikipedia.org/wiki/Robocopy

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「robocopyの使い方|オプション早見表・/MIRの注意と終了コード」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?