You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:24:14