Robocopy导致成功时退出(1)

11

我正在尝试在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,而 Jenkins 认为构建已失败。
我该如何“捕获”这个返回值而不使构建失败?

3
  1. 为什么要使用 call 命令来调用 robocopy
  2. 可以这样做:if ErrorLevel 8 (exit /B 1) else (exit /B 0)(意思是:如果 ErrorLevel 大于或等于 8(表示实际错误),则以 ErrorLevel1 的状态退出脚本,否则以 ErrorLevel0 的状态退出脚本)...
- aschipfl
太棒了,它起作用了,谢谢!如果您将此写为答案,我会接受。 2. 因为xcopy会提示我源是文件还是文件夹,而robocopy则不会。我只想要最简单的递归文件夹复制,覆盖并且没有提示。 - Gulzar
aschipfl 的意思是,当你可以直接运行 robocopy 时,就不需要 call robocopy。我们只会 call 其他批处理文件或批处理标签。顺便说一句,最好使用 robocopy,因为 xcopy 已经被弃用了,尽管它仍然可以工作。 - Gerhard
哦,谢谢,已经移除了该调用。 - Gulzar
1
PS!! 最好使用双引号来set变量,包括实际的变量名而不仅仅是值。例如:set "src=C:\code\EPMD\Installer\inno setup\Output" 然后在使用时也要加上双引号 robocopy "%src%" "%dst%" /MIR /E /is /it,否则"会成为字符串的一部分。虽然对于路径来说这不是什么大问题,但对于其他变量可能会成为一个问题。 - Gerhard
1个回答

7

Robocopy 命令 使用退出代码(或ErrorLevel)来指示复制操作的结果,其中小于 8 的值并不意味着发生错误;您可以在后续进行转换:

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从调用脚本中调用exit?这有什么意义吗?我希望它根本不要退出。 - Gulzar
2
在PowerShell中的等效代码为:if ($lastexitcode -lt 8) { exit 0 } else { exit 1 } - Éric Bergeron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接