移除@pause后PowerShell脚本返回Exit Code 1,如何获取Exit Code 0?
解决build_mech.ps1脚本在Git/GitLab流水线返回Exit Code 1的问题
问题根源
当前脚本用&连接所有cmd命令,这意味着无论前面的命令是否执行失败,都会继续执行后续命令。手动运行时最后的@pause命令退出码始终是0,会覆盖前面命令的失败码,所以脚本返回0;移除@pause后,前面cmake相关命令的失败码会被保留,导致整个cmd进程返回1,最终PowerShell脚本输出这个失败码。
解决方案
要让脚本在流水线中返回0,需要确保只有所有关键构建命令执行成功时才返回0,同时保留手动运行时的暂停功能,可按以下方式修改脚本:
# 判断是否处于Git/GitLab流水线环境(CI环境通常会设置CI环境变量为true) $isCI = $env:CI -eq 'true' # 构建cmd执行的命令序列,用&&确保前序命令成功才执行后续命令 $cmdCommands = @( "$envSetup", "dir", "cmake -G Ninja -DOPENCV_EXTRA_MODULES_PATH=../sparty/opencv_contrib/modules -DCMAKE_BUILD_TYPE=Release ..", "cmake --build ." ) # 仅在非CI环境(手动运行)添加暂停命令 if (-not $isCI) { $cmdCommands += "@pause" } # 将命令序列拼接为cmd可执行的参数 $argumentList = "/c " + ($cmdCommands -join " && ") # 启动cmd进程并等待完成 $process = Start-Process "$env:comspec" -WorkingDirectory $cmakeFolder -ArgumentList $argumentList -PassThru $process.WaitForExit() # 输出构建结果 Write-Output "Mech Result = $($process.ExitCode)" # 让PowerShell脚本同步返回cmd进程的退出码(确保流水线能捕获正确码) exit $process.ExitCode
关键修改点说明
- 用
&&替代&:&&仅当前面命令执行成功(退出码0)时才执行下一个命令,确保任何关键构建步骤失败时,整个cmd进程直接返回失败码,避免后续无意义的命令执行。 - 环境判断添加暂停:通过检测
CI环境变量,自动在手动运行时保留@pause,流水线运行时跳过,既满足手动交互需求,又不影响自动化构建。 - 同步退出码:最后添加
exit $process.ExitCode,让PowerShell脚本本身的退出码与cmd进程保持一致,确保Git/GitLab流水线能正确识别构建结果。
内容的提问来源于stack exchange,提问作者D AmaraReddy
相关产品推荐
相关产品推荐

