題 讓ROBOCOPY返回“正確的”退出代碼?


是否有可能要求ROBOCOPY退出並指出成功或失敗的退出代碼?

我正在使用ROBOCOPY作為我的TeamCity構建配置的一部分,並且必須添加一個步驟來使ROBOCOPY的退出代碼靜音對我來說似乎很愚蠢。

基本上,我添加了這個:

EXIT /B 0

到正在運行的腳本。

然而,這當然掩蓋了ROBOCOPY將返回的任何實際問題。

基本上,我希望SUCCESS的退出代碼為0,FAILURE的退出代碼為非零,而不是ROBOCOPY現在返回的位掩碼。

或者,如果我不能擁有它,是否有一個簡單的批處理命令序列可以將ROBOCOPY的位掩碼轉換為類似的值?


111
2018-05-07 13:03


起源


還應注意,前8個退出代碼(0-7)顯然不是錯誤狀態: stackoverflow.com/questions/16533843/psake-and-robocopy-failing - longda


答案:


按照 這裡,Robocopy具有以下退出代碼位,構成退出代碼:

0×10嚴重錯誤。 Robocopy沒有復制任何文件。由於源或目標目錄上的訪問權限不足,這可能是使用錯誤或錯誤。

0×08無法複製某些文件或目錄(發生了複製錯誤並超出了重試限制)。進一步檢查這些錯誤。

0×04檢測到一些不匹配的文件或目錄。檢查輸出日誌。家政可能是必要的。

0×02檢測到一些額外的文件或目錄。檢查輸出日誌。可能需要一些家政服務。

0×01成功複製了一個或多個文件(即新文件已到達)。

0×00未發生錯誤,未進行複制。源目標樹和目標目錄樹完全同步。

只需添加if / else語句即可 EXIT /B 0 當返回值為1或0時,和 EXIT /B 1 除此以外。即使文件可能已被複製,也存在需要手動干預的錯誤。


43
2018-05-07 13:34





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

93
2018-06-18 05:26



尼斯。 robocopy命令周圍需要括號,但使用包裝器腳本保存了我。 - TheCodeKing
我無法將這個單行程用作TeamCity中的命令行構建步驟。我不得不把它移到另一條線上。我還將/ B參數添加到exit命令,儘管我不認為這是必需的。 - MikeWyatt
對於Teamcity部署(而不僅僅是Teamcity),鍵入以下內容非常有用: IF %ERRORLEVEL% LEQ 3 set errorlevel=0 並在下一行: if %errorlevel% neq 0 exit /b %errorlevel% (如果批處理文件包含多個操作,而不僅僅是robocopy),因為OK代碼小於3。 ss64.com/nt/robocopy-exit.html - DaoCacao
在TeamCity中,你應該逃避 ERRORLEVEL 使用double %%,如下所示:%% ERRORLEVEL %%。否則,它認為它是TeamCity構建參數。 - Yan Sklyarenko
什麼是 ^& 做? ss64 說逃脫,但在我看來它不應該逃脫? - mlhDev


從Jenkins運行它需要兩者 ( ) 和 /B。如果要忽略錯誤級別1,2,3,4:

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

17
2018-05-07 13:35



LSS 8可能會更好:) - Ivan


這一頁 您可以在批處理文件中添加一個部分,該部分使用錯誤代碼列表輸出錯誤並運行不同的代碼段:

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

13
2018-05-07 14:54





我用這個:

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
2018-04-03 23:56





上面的一些海報錯過了比特掩碼的微妙之處。特別是paradroid錯過了錯誤級別3表示完全成功的副本。

請注意,如果設置了位0x01,則表示即使存在其他故障,也會復制某些文件。因此,任何奇數編號的錯誤級別始終表示至少已復制了一些文件。 另請注意,位0x02僅表示目標處的文件不存在於源中。如果使用/ E開關並且自上一次復制以來已從源中刪除文件,則會發生這種情況。如果使用/ MIR開關不應該發生,因為它應該刪除目標處的文件以鏡像源(但我沒有對此進行測試)。

因此,錯誤級別1和3都表示成功複製文件沒有錯誤。 錯誤級別0和2也表示目標是最新的,沒有復製文件。

為了我的簡單備份,我想出了以下內容:

如果errorlevel 16 echo備份失敗 - 請參閱上面的原因並轉到完成

if errorlevel 8 echo All不好 - 備份不完整和轉到完成

如果errorlevel 4 echo一切都不好 - 有些文件不匹配並且完成了

如果errorlevel 3 echo備份成功完成並轉到完成

如果errorlevel 2 echo Backup已經是最新的 - 沒有文件複製和轉到完成

如果errorlevel 1 echo備份成功完成並轉到完成

如果errorlevel 0 echo備份已經是最新的 - 沒有文件複製和轉到完成

我選擇不打擾'額外'文件。

我不知道“不匹配”的錯誤是什麼,因為它還沒有發生,但我允許它以防萬一。


8
2017-10-24 03:36





我同意Guest John - 如果結果實際為8或更高,你真的只想表示錯誤。

因此,要將robocopy結果映射到適合在SQL代理作業中使用的0(成功)或1(失敗)結果,我使用此:

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

6
2018-02-05 01:01





對於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

2
2018-06-21 23:49



我在POST-BUILD事件中使用了類似的robocopy腳本。因此依賴庫被複製到消費的.exe應用程序項目中 - 這些項目僅通過控制/服務定位器模式進行引用。 - bkwdesign


這裡有一個關於如何將完成的文件從Visual Studio 2010+複製到另一個文件夾的示例,因為Visual Studio期望良好副本上的0不是1。

cmd /c (robocopy $(TargetDir) X:\$(TargetName) $(TargetFileName) $(TargetFileName).config *.dll *.json *.xml /xx) ^& IF %ERRORLEVEL% LEQ 1 exit 0 

0
2017-11-08 22:20





在它之前為gitlab ci添加cmd / c。

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

否則EXIT 0會在此時關閉CI管道。


0