少し古い情報だけれど、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がどの操作に失敗したのかを判定するには、

戻り値ではなく、ここのエラーメッセージの部分を取得するように

バッチファイルなり何なりで、作り込みをする必要がある。