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需要返回检查说明的需求:
- 修改
check.ps1末尾逻辑,在退出前将退出码和检查结果输出到标准输出:
# 原有检查逻辑不变 Write-Output "检查结果:XXX阈值超出告警" $exitCode = 2 Write-Output "EXITCODE:$exitCode" Exit $exitCode
- 本地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
相关产品推荐
相关产品推荐

