ROBOCOPYを取得して「適切な」終了コードを返しますか?


121

ROBOCOPYに成功または失敗を示す終了コードで終了するように依頼することはできますか?

TeamCityビルド構成の一部としてROBOCOPYを使用していますが、ROBOCOPYからの終了コードを黙らせるためのステップを追加する必要があるのは愚かなことです。

基本的に、私はこれを追加しました:

EXIT /B 0

実行中のスクリプトに。

ただし、これはもちろん、ROBOCOPYが返す実際の問題を隠します。

基本的に、ROBOCOPYが現在返すビットマスクの代わりに、成功の場合は0、失敗の場合はゼロ以外の終了コードを使用したいと思います。

または、それができない場合、ROBOCOPYのビットマスクを同様の値に変換するバッチコマンドの単純なシーケンスはありますか?


2
また、第8の終了コード(0-7)は、明らかに状態をエラーではないことに留意すべきである:stackoverflow.com/questions/16533843/psake-and-robocopy-failing
longda

回答:


47

あたりとしては、ここで、Robocopyは終了コードを構成して、次の終了コードビットがあります。

0×10重大なエラー。Robocopyはファイルをコピーしませんでした。これは、使用エラーか、ソースまたは宛先ディレクトリに対するアクセス権限が不十分であるためのエラーです。

0x08一部のファイルまたはディレクトリをコピーできませんでした(コピーエラーが発生し、再試行の制限を超えました)。これらのエラーをさらに確認してください。

0x04いくつかの不一致のファイルまたはディレクトリが検出されました。出力ログを調べます。ハウスキーピングがおそらく必要です。

0x02いくつかの余分なファイルまたはディレクトリが検出されました。出力ログを調べます。いくつかのハウスキーピングが必要になる場合があります。

0x01 1つ以上のファイルが正常にコピーされました(つまり、新しいファイルが到着しました)。

0x00エラーは発生せず、コピーも行われませんでした。ソースディレクトリツリーと宛先ディレクトリツリーは完全に同期されています。

if / elseステートメントを追加するだけでEXIT /B 0、戻り値が1または多分0の場合とEXIT /B 1そうでない場合があります。ファイルがコピーされていたとしても、手動での介入が必要な問題があります。


108

TechNetでは、このワンライナーを使用して、終了コードを従来の終了コードに変換することをお勧めしています。

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0

または、終了コードを完全に無視する(つまり、失敗したか成功したかは関係ありません):

(robocopy c:\dirA c:\dirB *.*) ^& exit 0

ただし、上記の両方のコマンドは、robocopyの実行後にスクリプトを終了します。これは、特にCIビルドの問題です。このシナリオでrobocopyを使用する場合は、無関係な終了コードのエラーコードを手動で設定する必要があります。以下では、8以下のすべてのエラーコードはエラーなしに書き換えられ、可能であればスクリプトが続行されます。

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0

8
いいね robocopyコマンドを囲む括弧が必要ですが、ラッパースクリプトを使用して保存しました。
TheCodeKing

このワンライナーをTeamCityのコマンドラインビルドステップとして機能させることができませんでした。別の行に移動する必要がありました。/ B引数もexitコマンドに追加しましたが、これは必須ではないと思います。
マイクワイアット

チームシティーの展開(とだけでなく、チームシティー)の場合には、入力するのに便利ですIF %ERRORLEVEL% LEQ 3 set errorlevel=0し、次の行に:if %errorlevel% neq 0 exit /b %errorlevel%OKコードは少ないし、3であるため、(バッチファイルは、いくつかの操作だけでなく、robocopyをで構成されている場合)ss64.com/nt/robocopy -exit.html
DaoCacao

6
TeamCityでは、ERRORLEVEL%% ERRORLEVEL %%のように、with%をエスケープする必要があります。それ以外の場合、TeamCityビルドパラメーターであると見なされます。
ヤンスクリャレンコ

2
何をし^&ますか?ss64はエスケープと言いますが、エスケープすべきではないと思われますか?
mlhDev

19

Jenkinsから実行するには、( )との両方が必要/Bです。エラーレベル1、2、3、4を無視する場合:

(robocopy XXX YYY) ^& IF %ERRORLEVEL% LEQ 4 exit /B 0

2
LSS 8はさらに良いかもしれません:)
イヴァン

13

このページから、エラーコードのリストを使用してエラーを出力し、コードの異なるセクションを実行するセクションをバッチファイルに追加できます。

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end
if %ERRORLEVEL% EQU 8 echo FAIL & goto end
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end
if %ERRORLEVEL% EQU 2 echo XTRA & goto end
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end
if %ERRORLEVEL% EQU 0 echo No Change & goto end


:END
REM END OF BATCH FILE

8

私はこれを使用します:

robocopy .....
call :REPORT_ERRORLEVEL
goto :EOF

:REPORT_ERRORLEVEL
echo.
if ERRORLEVEL 16 echo ***FATAL ERROR*** & goto :EOF
if ERRORLEVEL 8 echo **FAILED COPIES** & goto :EOF
if ERRORLEVEL 4 echo *MISMATCHES* & goto :EOF
if ERRORLEVEL 2 echo EXTRA FILES & goto :EOF
if ERRORLEVEL 1 echo Copy successful & goto :EOF
if ERRORLEVEL 0 echo –no change– & goto :EOF

8

上記のポスターの中には、ビットマスクの微妙な見落としがあります。特に、paradroidはerrorlevel 3が完全に成功したコピーを示していることを見逃しています。

設定されている場合、ビット0x01は、他の障害が発生した場合でも一部のファイルがコピーされたことを示すことに注意してください。したがって、奇数のエラーレベルは、少なくともいくつかのファイルがコピーされたことを常に示します。また、ビット0x02は、ソースに存在しないファイルが宛先に存在することを単に示していることに注意してください。これは、/ Eスイッチが使用され、以前のコピーが取得されてからファイルがソースから削除された場合に発生します。/ MIRスイッチが使用されている場合、ソースのミラーリングのために宛先のファイルを削除する必要があるため、これは発生しません(ただし、これはテストしていません)。

したがって、エラーレベル1と3は、エラーなしでファイルのコピーが成功したことを示します。また、エラーレベル0および2は、宛先が最新であり、ファイルがコピーされていないことを示します。

その価値のために、単純なバックアップのために次のことを思いつきました。

エラーレベル16のエコーバックアップが失敗した場合-上記の理由を確認してから完了

エラーレベル8のエコーがすべてうまくいかない場合-バックアップが完了せず、完了

エラーレベル4のエコーがすべてうまくいかない場合-一部のファイルが一致せず、完了した

エラーレベル3エコーバックアップが正常に完了し、完了した場合

エラーレベル2エコーバックアップが既に最新の場合-ファイルがコピーされず、完了

エラーレベル1エコーバックアップが正常に完了し、完了した場合

エラーレベル0エコーバックアップが既に最新の場合-ファイルはコピーされず、完了

「余分な」ファイルを気にしないことにしました。

「不一致」エラーが何であるかはまだわかりませんが、万が一に備えて許可しました。


6

ゲストジョンに同意します。実際に結果が8以上の場合にのみエラーを表示する必要があります。

したがって、SQLエージェントジョブでの使用に適したロボコピーの結果を0(成功)または1(失敗)の結果にマッピングするには、これを使用しています。

  IF %ERRORLEVEL% LSS 8 EXIT /B 0
  EXIT /B 1

2

TeamCityではこれを使用しており、非常にうまく機能しています。MikeWyatt、DaoCacao、およびYan Sklyarenkoからの入力に感謝します。答えを視覚化するのに役立つ完全な実例を参照する必要がありました。

(robocopy  .\Artifacts\Fitnesse %FitDestinationFolder% /MIR)
IF %%ERRORLEVEL%% LEQ 3 set errorlevel=0
IF %%ERRORLEVEL%% NEQ 0 EXIT /b %%ERRORLEVEL%%
EXIT 0

1
POST-BUILDイベントで同様のロボコピースクリプトを使用しています..依存ライブラリは、消費する.exeアプリケーションプロジェクトにコピーされます。これは、制御の反転/サービスロケーターパターンを介してのみ参照されます。
bkwdesign

1

gitlab ciの前にcmd / cを追加します。

cmd /c (robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0

そうでない場合、EXIT 0はその時点でCIパイプラインを閉じます。


0

Visual Studioは正常なコピーでは0ではなく0を想定しているため、完成したファイルをVisual Studio 2010+から別のフォルダーにコピーする方法の例を次に示します。

cmd /c (robocopy $(TargetDir) X:\$(TargetName) $(TargetFileName) $(TargetFileName).config *.dll *.json *.xml /xx) ^& IF %ERRORLEVEL% LEQ 1 exit 0 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.