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

Linux下调用PowerShell Invoke-Command如何获取正确退出码

问题原因

PowerShell 跨 SSH 远程调用时,远程脚本的Exit语句仅会设置远程会话内的退出码,Invoke-Command默认不会将该值透传到本地 PowerShell 进程。本地pwsh进程只要没有出现致命执行错误,默认返回的退出码永远为0。

可用解决方案

方案1:调整调用命令,显式捕获远程退出码

直接修改bash内的执行命令,在PowerShell执行逻辑中显式拉取远程会话的$LASTEXITCODE并作为本地进程退出码抛出,无需修改现有check.ps1脚本:

/usr/bin/pwsh -NoProfile -NonInteractive -command '
Invoke-Command -Hostname PC -UserName boss -ScriptBlock {
    & ./check.ps1 $args
    exit $LASTEXITCODE
} -ArgumentList "A","25","10"
exit $LASTEXITCODE
'

参数说明:

  • -NoProfile、-NonInteractive:跳过用户配置加载,关闭交互模式,适合监控脚本场景,避免不可预期的执行干扰
  • 远程ScriptBlock内先执行目标脚本,再通过$LASTEXITCODE拿到脚本退出码,本地pwsh进程最终退出时复用该值,即可将正确退出码传递给bash父进程

方案2:通过标准输出传递退出码(适配Nagios场景)

如果希望保留原有调用结构,可同时适配Nagios需要返回检查说明的需求:

  1. 修改check.ps1末尾逻辑,在退出前将退出码和检查结果输出到标准输出:
# 原有检查逻辑不变
Write-Output "检查结果:XXX阈值超出告警"
$exitCode = 2
Write-Output "EXITCODE:$exitCode"
Exit $exitCode
  1. 本地bash执行命令后解析输出拿到退出码返回:
output=$(/usr/bin/pwsh -NoProfile -NonInteractive -command 'Invoke-Command -Hostname PC -UserName boss -FilePath ./check.ps1 -ArgumentList "A","25","10"')
echo "$output"
exit $(echo "$output" | grep -oP 'EXITCODE:\K\d+')

该方案可以同时将远程检查的结果文本返回给Nagios展示,退出码也完全符合要求。

注意事项
  • 上述两种方案都可以同时覆盖远程脚本返回码、本地连接错误/认证错误等场景,异常时会正确返回非0退出码
  • 用作Nagios检查时建议关闭pwsh的交互模式和配置加载,避免执行超时或额外输出干扰监控结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:45:03