Получение ROBOCOPY для возврата «правильного» кода выхода?

Можно ли попросить ROBOCOPY выйти с кодом выхода, который указывает на успех или неудачу?

Я использую ROBOCOPY как часть моих конфигураций сборки TeamCity, и чтобы добавить шаг, чтобы просто отключить код выхода из ROBOCOPY, мне кажется глупым.

В основном, я добавил следующее:

EXIT /B 0 

К скрипту, который выполняется.

Однако это, конечно, маскирует любые реальные проблемы, которые ROBOCOPY вернется.

В принципе, я хотел бы иметь коды выхода 0 для SUCCESS и non-zero для FAILURE вместо битовой маски, возвращаемой ROBOCOPY.

Или, если я не могу этого сделать, есть ли простая последовательность командных команд, которые переведут битовую маску ROBOCOPY на аналогичное значение?

Как здесь , Robocopy имеет следующие биты кода выхода, которые составляют код выхода:

0 × 10 Серьезная ошибка. Robocopy не копировал файлы. Это либо ошибка использования, либо ошибка из-за недостаточных прав доступа в исходных или целевых каталогах.

0 × 08 Некоторые файлы или каталоги не могут быть скопированы (произошли ошибки копирования и превышен лимит повтора). Проверьте эти ошибки дальше.

0 × 04 Определены некоторые несоответствующие файлы или каталоги. Изучите журнал вывода. Возможно, необходимо домашнее хозяйство.

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

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

0 × 00 Ошибок не было, и копирование не производилось. Деревья исходного и целевого каталогов полностью синхронизированы.

Просто добавьте инструкции if / else, которые EXIT /B 0 когда возвращаемое значение равно 1 или, может быть, 0, и EXIT /B 1 противном случае. Даже если файлы могли быть скопированы, есть что-то неправильное, что потребует ручного вмешательства.

TechNet предлагает этот однострочный конвертер для преобразования в традиционный код выхода:

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

Или это, чтобы полностью игнорировать код выхода (т. Е. Не волнует, если он не удался или преуспел):

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

Запуск от Jenkins нужен как ( ) и /B Если вы хотите игнорировать уровень ошибки 1,2,3,4:

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

На этой странице вы можете добавить раздел в пакетный файл, который использует список кодов ошибок для вывода ошибок и запуска различных разделов кода:

 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 

Я использую это:

 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 

Некоторые плакаты выше пропустили тонкость битовой маски. В частности, парадокс пропустил, что уровень ошибки 3 указывает на полностью успешную копию.

Обратите внимание, что бит 0x01, если установлен, указывает, что некоторые файлы были скопированы, даже если были другие сбои. Таким образом, любые нечетные номера ошибок всегда указывают, что по крайней мере некоторые файлы были скопированы. Обратите также внимание, что бит 0x02 просто указывает, что в месте назначения есть файлы, которые отсутствуют в источнике. Это произойдет, если используется переключатель / E, и файлы были удалены из источника с момента предыдущей копии. Это не должно происходить, если используется переключатель / MIR, потому что это должно удалять файлы в месте назначения, чтобы зеркалировать источник (но я не тестировал это).

Таким образом, оба уровня ошибок 1 И 3 указывают на успешное копирование файлов без ошибок. Также errorlevels 0 AND 2 указывают, что пункт назначения обновлен и файлы не были скопированы.

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

Если errorlevel 16 echo Backup failed – см. Причину выше и перейти

Если errorlevel 8 echo Все не очень хорошо – резервное копирование неполное и goto сделано

Если errorlevel 4 echo Все не очень хорошо – некоторые файлы были несогласованы и переделаны

Если errorlevel 3 echo Резервное копирование завершено успешно и выполнено

Если errorlevel 2 echo Резервное копирование уже обновлено – файлы не копируются и не выполняются

Если errorlevel 1 echo Резервное копирование завершено успешно и выполнено

Если errorlevel 0 echo Резервное копирование уже обновлено – файлы не копируются и не выполняются

Я решил не беспокоиться о «дополнительных» файлах.

Я не знаю, что такое ошибка «несоответствия», потому что она еще не произошла, но я разрешил ее на всякий случай.

Я согласен с гостем Джоном – вы действительно хотите указать ошибку, если результат на самом деле 8 или выше.

Поэтому для сопоставления результата robocopy с результатом 0 (успех) или 1 (неудачей), подходящим для использования в задании агента SQL, я использую следующее:

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

Для TeamCity я использую это, и он работает очень хорошо. Благодаря вкладам от MikeWyatt, DaoCacao и Яна Скляренко. Мне просто нужно было увидеть полный рабочий пример, чтобы визуализировать ответ.

 (robocopy .\Artifacts\Fitnesse %FitDestinationFolder% /MIR) IF %%ERRORLEVEL%% LEQ 3 set errorlevel=0 IF %%ERRORLEVEL%% NEQ 0 EXIT /b %%ERRORLEVEL%% EXIT 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 
  • Как Robocopy определяет, «файл изменен»,
  • Могут ли Robocopy отслеживать файлы с увеличением времени менее одной минуты?
  • Robocopy - копирование каталога в другой каталог
  • Давайте будем гением компьютера.