Як РОБОКОПІЯ повертає "належний" код виходу?


121

Чи можна попросити РОБОКОПІЮ вийти з кодом виходу, який вказує на успіх чи невдачу?

Я використовую ROBOCOPY як частину моєї конфігурації збірки TeamCity, і мені потрібно додати крок, щоб просто заглушити код виходу з ROBOCOPY для мене дурним.

В основному я додав це:

EXIT /B 0

до сценарію, який виконується.

Однак це, мабуть, маскує будь-які реальні проблеми, до яких повернеться РОБОКОПІЯ.

В основному, я хотів би мати вихідні коди 0 для SUCCESS і ненульових для FAILURE замість бітової маски, яку ROBOCOPY повертає зараз.

Або, якщо я не можу цього мати, чи є проста послідовність команд партії, які перевели битову маску ROBOCOPY на подібне значення?


2
Слід також зазначити , що перші 8 кодів виходу (0-7), по- видимому , не помилка стану: stackoverflow.com/questions/16533843/psake-and-robocopy-failing
Longda

Відповіді:


47

Відповідно до цього , Robocopy має такі біти коду виходу, які складають код виходу:

0 × 10 Серйозна помилка. Робокопія не копіювала жодних файлів. Це або помилка використання, або помилка через недостатню кількість прав доступу до каталогів джерела чи призначення.

0 × 08 Деякі файли чи каталоги неможливо скопіювати (виникли помилки при копіюванні та перевищено обмеження кількості спроб). Перевірте ці помилки далі.

0 × 04 Було виявлено деякі невідповідні файли чи каталоги. Вивчіть вихідний журнал. Ведення господарства, мабуть, необхідне.

0 × 02 Деякі додаткові файли чи каталоги були виявлені. Вивчіть вихідний журнал. Може знадобитися деяке господарство.

0 × 01 Один або більше файлів успішно скопійовано (тобто нові файли надійшли).

0 × 00 Не траплялося жодних помилок і копіювання не робилося. Дерева каталогів джерела та місця призначення повністю синхронізовані.

Просто додайте, якщо / 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

Однак обидві команди, описані вище, припиняють сценарій після виконання роботокопії. Це питання особливо для CI-будівель. Якщо ви хочете використовувати роботокопію в цьому сценарії, вам потрібно встановити код помилки вручну для невідповідних кодів виходу. Нижче всі коди помилок нижче 8 будуть переписані без помилок, а сценарій буде продовжено, якщо це можливо.

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

8
Приємно. Потрібні дужки навколо команди robocopy, але врятував мене за допомогою сценарію обгортки.
TheCodeKing

Мені не вдалося змусити цей однокласник працювати як крок побудови командного рядка в TeamCity. Мені довелося перенести його на окрему лінію. Я також додав аргумент / B до команди вихід, хоча я не думаю, що це було потрібно.
MikeWyatt

Для розгортання Teamcity (і не тільки Teamcity) корисно ввести: IF %ERRORLEVEL% LEQ 3 set errorlevel=0і в наступному рядку: if %errorlevel% neq 0 exit /b %errorlevel%(якщо пакетний файл складається з декількох операцій, а не лише роботокопії), оскільки OK-коди менше 3. ss64.com/nt/robocopy -exit.html
DaoCacao

6
У TeamCity вам слід уникнути ERRORLEVELподвійного %%, як це: %% ERRORLEVEL %%. В іншому випадку він вважає це параметром збірки TeamCity.
Ян Скляренко

2
Що робить ^&? ss64 каже, що втеча, але мені здається, цього не слід уникати?
mlhDev

19

Запускати його від Дженкінса потрібно як ( )і /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

Деякі плакати вище пропустили тонкість бітової маски. Зокрема, парадороїд пропустив, що рівень помилок 3 вказує на цілком вдалу копію.

Зверніть увагу, що біт 0x01, якщо встановлено, вказує на те, що деякі файли були скопійовані, навіть якщо були інші збої. Отже, будь-які рівні помилки з непарними номерами завжди означають, що принаймні деякі файли були скопійовані. Зауважте також, що біт 0x02 просто вказує на наявність файлів у пункті призначення, які відсутні у джерелі. Це станеться, якщо використовується перемикач / E і файли були видалені з джерела з часу попередньої копії. Це не повинно статися, якщо використовується перемикач / MIR, оскільки це повинно видалити файли в пункті призначення, щоб відобразити джерело (але я цього не перевіряв).

Отже, обидва рівні помилок 1 і 3 вказують на успішне копіювання файлів без помилок. Також рівні помилок 0 І 2 вказують на те, що цільове місце оновлено та жодні файли не скопійовані.

Для чого варто, я створив наступне для простого резервного копіювання:

якщо errorlevel 16 echo Резервне копіювання не вдалося - див. причину вище & перейти

якщо errorlevel 8 echo Все не добре - резервна копія не завершена & goto done

якщо errorlevel 4 echo Все не добре - деякі файли були невідповідними & goto done

якщо errorlevel 3 echo Резервне копіювання успішно завершено & goto done

якщо errorlevel 2 echo Резервне копіювання вже оновлено - не скопійовано жодних файлів і не буде зроблено

якщо errorlevel 1 echo Резервне копіювання успішно завершено & goto done

якщо errorlevel 0 echo Резервне копіювання вже оновлено - жодних файлів не скопійовано та йти не робиться

Я вирішив не турбуватися про "зайві" файли.

Я поняття не маю, що таке "невідповідна" помилка, оскільки це ще не сталося, але я допустив це на всякий випадок.


6

Я погоджуюся з гостем Джоном - ви дійсно хочете вказати помилку лише тоді, коли результат насправді становить 8 або вище.

тому, щоб зіставити результат роботокопії на 0 (успіх) або 1 (невдалий) результат, підходить для використання в роботі SQL Agent, я використовую це:

  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

додати до нього cmd / c для gitlab ci.

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

інакше EXIT 0 закриває трубопровід CI в цій точці.


0

Приклад про те, як скопіювати готові файли з 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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.