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が戻ります。
【Powershell】robocopy 実行時の戻り値判定
[戻る]