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

C++使用system API调用PowerShell脚本时errno未被正确设置

问题原因分析

1. errno的设计逻辑决定不会同步子进程退出码

errno是C标准库定义的全局变量,仅用于记录C标准库函数自身执行时发生的系统级错误。对于system函数来说,只有出现「无法创建子进程」「无法启动shell执行命令」这类system本身调用失败的场景时,才会设置errno。
你当前场景中PowerShell进程可以正常启动、运行直至退出,system函数本身执行是成功的,所以errno始终为0属于正常行为,子进程的自定义退出码完全不会影响errno的取值。

2. system函数返回值的解析方式错误

system的返回值不等于子进程的退出码,而是waitpid系统调用返回的进程状态编码,必须通过指定宏解析才能拿到真实的子进程退出码:

  • 跨平台通用解析逻辑:先通过WIFEXITED宏判断进程是否为正常退出,确认正常退出后再用WEXITSTATUS宏取出子进程的退出码
  • Windows平台也可直接将system返回值右移8位,得到子进程退出码
    你直接打印system返回值的方式是错误的,拿到的不是脚本的实际退出码。

3. PowerShell脚本的退出码设置逻辑有误

你写的ExitWithCode函数中,$host.SetShouldExit()仅在PowerShell交互式宿主场景下生效,非交互模式通过-File参数调用脚本时,必须直接给exit语句传递退出码才会被外部进程捕获。你当前代码中的exit没有携带参数,默认返回的退出码就是0,这也是你拿到的结果和预期不符的核心原因之一。
正确的脚本写法参考:

#-------------------------------------------------------------------------------
function ExitWithCode {
#-------------------------------------------------------------------------------
  param($exitcode)
  $host.SetShouldExit($exitcode)
  exit $exitcode
}
ExitWithCode -exitcode 1

内容的提问来源于stack exchange,提问作者Aryaman Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:12:01