Я пытаюсь вызвать этот код в 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
внутренне, и Дженкинс думает, что сборка не удалась.
Как я могу «поймать» это возвращаемое значение и не завершить сборку?
замечательно, что сработало, спасибо! если вы напишете это как ответ, я приму. 2. потому что xcopy подсказывает мне, является ли src файлом или папкой, а robocopy - нет. Я просто хотел самую простую рекурсивную копию папки с перезаписью и без подсказки.
aschipfl означает, что нет необходимости call robocopy
когда вы можете просто запустить robocopy
мы только call
другие пакетные файлы или пакетные метки. Кстати, лучше использовать robocopy
, так как xcopy
устарело, хотя оно все еще работает.
Ой. Спасибо, убрал звонок
PS!! Предпочтительнее set
переменные с двойными кавычками, включая фактическое имя переменной, а не только значение. set "src=C:\code\EPMD\Installer\inno setup\Output"
затем используйте двойные кавычки в использовании robocopy "%src%" "%dst%" /MIR /E /is /it
иначе "
становится частью строки.. хотя это не имеет большого значения с путями, но с другими переменными может стать проблемой.
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 выходят из вызывающего скрипта? Почему это имеет смысл? Я хочу, чтобы он вообще не выходил
1. Почему ты
call
robocopy
? 2. Вы можете сделать это:if ErrorLevel 8 (exit /B 1) else (exit /B 0)
(значение: еслиErrorLevel
больше или равно8
(что указывает на реальную ошибку), выйдите из скрипта сErrorLevel
из1
, в противном случае выйдите из скрипта сErrorLevel
из0
)...