Robocopy вызывает exit(1) в случае успеха

Я пытаюсь вызвать этот код в jenkins

rem copy installation to output folder
set src = "C:\code\EPMD\Installer\inno setup\Output"
set dst = "c:/test_installs/Calibration/%version_name%"
call robocopy %src% %dst% /MIR /E /is /it

Код запускается и работает, создавая новый файл в папке назначения.

Это заставляет robocopy возвращать 1, как указано в документации.

Затем он вызывает exit 1 внутренне, и Дженкинс думает, что сборка не удалась.

Как я могу «поймать» это возвращаемое значение и не завершить сборку?

1. Почему ты callrobocopy? 2. Вы можете сделать это: if ErrorLevel 8 (exit /B 1) else (exit /B 0) (значение: если ErrorLevel больше или равно 8 (что указывает на реальную ошибку), выйдите из скрипта с ErrorLevel из 1, в противном случае выйдите из скрипта с ErrorLevel из 0)...

aschipfl 21.05.2019 10:51

замечательно, что сработало, спасибо! если вы напишете это как ответ, я приму. 2. потому что xcopy подсказывает мне, является ли src файлом или папкой, а robocopy - нет. Я просто хотел самую простую рекурсивную копию папки с перезаписью и без подсказки.

Gulzar 21.05.2019 11:51

aschipfl означает, что нет необходимости call robocopy когда вы можете просто запустить robocopy мы только call другие пакетные файлы или пакетные метки. Кстати, лучше использовать robocopy, так как xcopy устарело, хотя оно все еще работает.

Gerhard 21.05.2019 12:05

Ой. Спасибо, убрал звонок

Gulzar 21.05.2019 12:06

PS!! Предпочтительнее set переменные с двойными кавычками, включая фактическое имя переменной, а не только значение. set "src=C:\code\EPMD\Installer\inno setup\Output" затем используйте двойные кавычки в использовании robocopy "%src%" "%dst%" /MIR /E /is /it иначе " становится частью строки.. хотя это не имеет большого значения с путями, но с другими переменными может стать проблемой.

Gerhard 21.05.2019 12:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
3 182
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

robocopy команда использует код выхода (или ErrorLevel) для указания результата действия копирования, где значение меньше 8 не означает, что произошли ошибки; вы можете постконвертировать это ErrorLevel:

rem /* Note the changed quotation, so the quotes do no longer become part of the variable values;
rem    this does not change much in the situation at hand when you quote the values later then,
rem    but it will simplify potential concatenation of multiple variable values a lot: */
set "src=C:\code\EPMD\Installer\inno setup\Output"
set "dst=c:/test_installs/Calibration/%version_name%"
rem // Now the values become quoted; regard that the superfluous `call` has been removed:
robocopy "%src%" "%dst%" /MIR /E /IS /IT
rem // This handles the exit code (`ErrorLevel`) returned by `robocopy` properly:
if ErrorLevel 8 (exit /B 1) else (exit /B 0)

Если вы не хотите сразу выходить из пакетного сценария после robocopy, вы можете просто сделать это:

set "src=C:\code\EPMD\Installer\inno setup\Output"
set "dst=c:/test_installs/Calibration/%version_name%"
robocopy "%src%" "%dst%" /MIR /E /IS /IT
rem // Terminate the script in case `robocopy` failed:
if ErrorLevel 8 exit /B 1
rem // Here we land when case `robocopy` succeeded;
rem Do some further actions here...
rem ...
rem // Finally explicitly force a zero exit code:
exit /B 0

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

Gulzar 21.05.2019 12:38

Другие вопросы по теме