少し古い情報だけれど、Robocopyの戻り値で苦労したので。
■Robocopyとは
RobocopyはWindows標準で入っている※コピーコマンドで、
オプションも多く、やりたいことが手軽にできるので非常に便利。オプションについては以下を参照のこと。
<TechNet:Robocopy>
https://technet.microsoft.com/ja-jp/library/cc733145(v=ws.10).aspx
(※Windows Server 2003ではリソースキットのインストールが必要)
さてこのRobocopyだけど、戻り値が微妙。
一回限りのサーバー移行や、個人のパソコンのデータバックアップであれば、戻り値はあまり気にしなくて良いのだけれど、
サーバー運用で利用する場合は、ちょっと気を付けたい。
■Robocopyの戻り値の意味
Windows Server 2003リソースキットに付属しているRobocopyのマニュアルを確認すると、戻り値の説明がある。
このマニュアルはインターネットでrobocopy.docを検索すると出てくるので、誰でも見ることができる。
------(マニュアル抜粋)--------
Alternatively, full details of the return code could be reported as follows:
if errorlevel 16 echo ***FATAL ERROR*** & goto end
if errorlevel 15 echo FAIL MISM XTRA COPY & goto end
if errorlevel 14 echo FAIL MISM XTRA & goto end
if errorlevel 13 echo FAIL MISM COPY & goto end
if errorlevel 12 echo FAIL MISM & goto end
if errorlevel 11 echo FAIL XTRA COPY & goto end
if errorlevel 10 echo FAIL XTRA & goto end
if errorlevel 9 echo FAIL COPY & goto end
if errorlevel 8 echo FAIL & goto end
if errorlevel 7 echo MISM XTRA COPY & goto end
if errorlevel 6 echo MISM XTRA & goto end
if errorlevel 5 echo MISM COPY & goto end
if errorlevel 4 echo MISM & goto end
if errorlevel 3 echo XTRA COPY & goto end
if errorlevel 2 echo XTRA & goto end
if errorlevel 1 echo COPY & goto end
if errorlevel 0 echo --no change-- & goto end
---------(抜粋ここまで)----------
Robocopyを使って何度かコピーを試してみたところ、おおよそ以下のような意味であるようだった。
※Windows 2003 server リソースキット付属のRobocopyXP010で確認。後続のバージョンでは戻り値が変わっているかもしれないので、使う際は確認が必要。
0 差分がなかった。
1 差分があったのでコピー操作をして、成功した。
2 コピー元にないファイルがコピー先にあったので削除操作をして、成功した。
3 差分があったのでコピー操作をした&コピー元にないファイルがコピー先にあったので削除操作をして、成功した。
4 ファイルミスマッチがあった。
5 ファイルミスマッチがあった&差分ファイルがあったのでコピー操作をして、成功した。
・・(中略)・・
8 差分がなかったが、操作に失敗した。
9 差分があったのでコピー操作をしたが、失敗した。
11 差分があったのでコピー操作をした&コピー元にないファイルがコピー先にあったので削除操作をしたが、失敗した。
・・(以下略)・・
つまり、Robocopyの戻り値は、ディレクトリコピー同士のミラーリングを行ったような場合に
"一回のコピー全体でどのような操作をしたか、その操作群はどれも失敗なしで完了したか"を表すもので、
コピーは成功したけど削除は失敗した、といったような、各操作の成否判別には使えないものとなっている。
■どのようなエラーで失敗したかを知るために
成功したか失敗したかを判定するだけなら、8以上でエラーとすれば事足りるけれど、
サーバー運用の場合だと、「どの操作で失敗したのか」を知りたい場合があると思う。
例えば、削除に失敗しただけなら対応を急ぐ必要はないけど、
コピーに失敗してたら即対応しなきゃいけない、とか。
ではどの操作が失敗したのか?という情報は取れないかというと、そんなことはない。
その情報はRobocopyのログに吐かれている。
参考までにRobocopyのログ。(※XP010が手元になかったので最新バージョンのログです。XP010だと少し表示が違います)
(ログここから)
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2016年8月11日 19:25:04
コピー元 : C:\Users\XXXXXX\XXXX\フォルダ1\
コピー先 : C:\Users\XXXXXX\XXXX\フォルダ2\
ファイル: *.*
オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30
------------------------------------------------------------------------------
1 C:\Users\XXXXXX\XXXX\フォルダ1\
*EXTRA File 14.7 m test.pdf
2016/08/11 19:25:04 エラー 32 (0x00000020) 余分なファイルを削除しています C:\Users\XXXXXX\XXXX\フォルダ2\test.pdf
プロセスはファイルにアクセスできません。別のプロセスが使用中です。
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 0 1 0 0 0
ファイル: 1 0 1 0 0 1
バイト: 0 0 0 0 0 14.71 m
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
終了: 2016年8月11日 19:25:04
----------------------------------
(ログここまで)
上記のログだと、以下の2行がエラーに関するメッセージになる。
2016/08/11 19:25:04 エラー 32 (0x00000020) 余分なファイルを削除しています C:\Users\XXXXXX\XXXX\フォルダ2\test.pdf
プロセスはファイルにアクセスできません。別のプロセスが使用中です。
つまり、Robocopyがどの操作に失敗したのかを判定するには、
戻り値ではなく、ここのエラーメッセージの部分を取得するように
バッチファイルなり何なりで、作り込みをする必要がある。