ROBOCOPY가 "적절한"종료 코드를 반환하도록하려면?


121

성공 또는 실패를 나타내는 종료 코드로 종료하도록 ROBOCOPY에 요청할 수 있습니까?

TeamCity 빌드 구성의 일부로 ROBOCOPY를 사용하고 있으며 ROBOCOPY의 종료 코드를 침묵시키는 단계를 추가 해야하는 것은 어리석은 것처럼 보입니다.

기본적으로 나는 이것을 추가했다 :

EXIT /B 0

실행중인 스크립트에

그러나 이것은 물론 ROBOCOPY가 반환 할 실제 문제를 숨 깁니다.

기본적으로 ROBOCOPY가 반환하는 비트 마스크 대신 SUCCESS의 종료 코드가 0이고 FAILURE의 경우 0이 아닙니다.

또는 그것을 가질 수 없다면 ROBOCOPY의 비트 마스크를 비슷한 값으로 변환하는 일련의 간단한 배치 명령이 있습니까?


2
또한 처음 8 개 종료 코드 (0-7) 분명히 상태 에러되지 않도록주의해야한다 : stackoverflow.com/questions/16533843/psake-and-robocopy-failing
롱다

답변:


47

당으로 여기 ,있는 Robocopy는 종료 코드를 구성하는 다음과 같은 종료 코드 비트가 있습니다 :

0 × 10 심각한 오류. Robocopy는 파일을 복사하지 않았습니다. 이는 소스 또는 대상 디렉토리에 대한 액세스 권한이 부족하여 사용 오류이거나 오류입니다.

0 × 08 일부 파일 또는 디렉토리를 복사 할 수 없습니다 (복사 오류가 발생하고 재시도 한계를 초과했습니다). 이 오류를 더 확인하십시오.

0x04 일치하지 않는 일부 파일 또는 디렉토리가 발견되었습니다. 출력 로그를 검사하십시오. 하우스 키핑이 필요할 것입니다.

0 × 02 일부 추가 파일 또는 디렉토리가 발견되었습니다. 출력 로그를 검사하십시오. 일부 하우스 키핑이 필요할 수 있습니다.

0 × 01 하나 이상의 파일이 성공적으로 복사되었습니다 (즉, 새 파일이 도착했습니다).

0 × 00 오류가 발생하지 않았으며 복사가 수행되지 않았습니다. 소스 및 대상 디렉토리 트리는 완전히 동기화됩니다.

EXIT /B 0반환 값이 1 또는 0 일 때 그렇지 않으면 if / else 문을 추가하십시오 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 명령에 추가했습니다.
MikeWyatt

인 TeamCity 배포 (및뿐만 아니라 인 TeamCity)의 경우는 입력 유용 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 %%와 같이 %를 두 배로 %로 이스케이프해야합니다 . 그렇지 않으면 TeamCity 빌드 매개 변수로 간주됩니다.
Yan Sklyarenko

2
무엇을 ^&합니까? ss64 는 탈출을 말하지만 탈출해서는 안되는 것 같습니다.
mlhDev

19

Jenkins에서 실행하려면 ( )및 이 모두 필요합니다 /B. 오류 수준 1,2,3,4를 무시하려면 다음을 수행하십시오.

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

2
LSS 8이 더 나을 수도 있습니다 :)
Ivan

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 에코 백업이 실패한 경우-위의 이유를 참조하고 완료하십시오.

errorlevel 8 echo All이 제대로 수행되지 않는 경우-백업이 완료되지 않고 완료되었습니다.

errorlevel 4 echo 모두가 제대로 작동하지 않는 경우-일부 파일이 일치하지 않고 완료되었습니다

errorlevel 3 echo 백업이 성공적으로 완료되고 완료된 경우

errorlevel 2 echo 백업이 이미 최신 인 경우-파일이 복사되지 않고 완료됩니다

errorlevel 1 echo 백업이 성공적으로 완료되고 완료된 경우

오류 수준 0 에코 백업이 이미 최신 상태 인 경우 파일이 복사되지 않고 완료됩니다

나는 '추가'파일에 신경 쓰지 않기로 결정했습니다.

'일치하지 않은'오류가 아직 발생하지 않았기 때문에 무엇인지 알 수 없지만 경우를 대비하여 허용했습니다.


6

Guest John에 동의합니다. 결과가 실제로 8 이상인 경우 오류 만 표시하려고합니다.

그래서 robocopy 결과를 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 이벤트에서 비슷한 robocopy 스크립트를 사용하고 있습니다. 따라서 종속 라이브러리는 사용중인 .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이 아닌 1을 기대할 때 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.