robocopy のエラー戻り値の調査結果(8とか11)

robocopy はWindowsに標準で装備された便利なファイル同期コマンドです。特に便利なのが /mir オプションによる二つのフォルダの同期機能です。
同期に失敗した場合にはrobocopy はエラーコードを戻します。このエラーコードがどのようなケースでどのような値を戻すのか確認してみました。2022年1月作成

戻り値の取得

robocopy の戻り値の取得方法を紹介します。コマンドプロンプト、及びPowershell での取得方法に関して説明します。

(1)コマンドプロンプト

コマンドプロンプトはERRORLEVEL 変数で取得が可能です。

C:\>robocopy d:\temp\1 d:\temp\2 /w:1 /r:0 /mir /mt:5 /np /e /nfl /ndl
C:\>echo %ERRORLEVEL%
8

(2)Powershell

Powershellでは変数 LASTEXITCODE で取得が可能です。

PS>robocopy d:\temp\1 d:\temp\2 /w:1 /r:0 /mir /mt:5 /np /e /nfl /ndl
PS> $LASTEXITCODE
8

参考:【Powershell】robocopy 実行時の戻り値判定

エラーの種類

robocopy のエラーの戻り値は次の通りです。robocopy の結果は エラーコードの AND 値となります。

リターン
コード
エラーの内容(英語) 意味  
0 No errors occurred and no files were copied. エラーは発生しませんでした。ファイルはコピーされていません。 スキップ
1 One of more files were copied successfully. 1個以上のファイルが正常にコピーされました。 コピー済み
2 Extra files or directories were detected. Examine the log file for more information. Extra files が検出されました。これは同期元には存在しませんが、同期先には存在するファイルです。オプションによっては(同期元には存在しないため)同期先のファイルが削除されてしまう点に注意してください。 Extras
4 Mismatched files or directories were detected. Examine the log file for more information. 一致しないファイル/フォルダが検出されました。例えば同期元のファイル名がtestであり同期先にtest という名前のフォルダがある場合、同期元と同期先でタイプが異なるためこのエラーが発生します。

robocopy を /mir オプションで実行するとrobocopy 内部では最初に同期すべきファイルの一覧が作成され、その後に実際のコピーが行われるようです。リストアップされた後にファイルが削除された場合はエラーコード11が戻るようです。
不一致
8 Some files or directories could not be copied and the retry limit was exceeded. 何個かのファイル/フォルダがコピーされませんでした。

以下のような理由が考えられます。
・ファイルが読み取りロックされており読み取りに失敗した。
・/mir オプションで実行した場合、同期中に(例えばユーザ操作により)同期元ファイルが削除されて結果として同期できなかった。
失敗 
16 Robocopy did not copy any files. Check the command line parameters and verify that Robocopy has enough rights to write to the destination folder. robocopy は0個のファイルをコピーしました。robocopy のパラメータに誤りがあるか、あるいは書き込み先にアクセス権があることを確認してください。指定されたドライブが存在しない、ネットワーク経由で同期する場合にネットワークに障害が発生しているなども考えられます。 -

(例1)例えば同期元と同期先が全く同一構成だった場合、0個のファイルがコピーされるためリターンコードは 0 となります。

(例2)
すべて差分が正常に同期された場合はリターンコードは 1が戻ります。

(例3)
1個のファイルがロックされていて、それ以外のファイルが正常に同期された場合はリターンコードは 1 + 8 で 9 が戻ります。

(例4)
1個のファイルがロックされていて、それ以外のファイルが既に同期済みでコピーされなかった場合は リターンコードは 8 が戻ります。

参考:秀丸エディタで読み取りロックする Powershell でファイルを読み取りロックする

(例5)
ファイル読み取りロックにより一部のファイルの同期に失敗し、かつ Extra files が存在する場合はリターンコードは 1 + 2 + 8 で 11が戻ります。

参考

robocopy でファイルがスキップされる原因と対処

【Powershell】robocopy 実行時の戻り値判定

robocopy で特定のフォルダを除外する


[戻る]