从 linux 的 powershell 调用命令获取退出代码

Posted

技术标签:

【中文标题】从 linux 的 powershell 调用命令获取退出代码【英文标题】:Get exitcode from powershell invoke-command from linux 【发布时间】:2021-12-04 11:20:39 【问题描述】:

/usr/bin/pwsh -command Invoke-Command -Hostname PC -UserName boss -FilePath ./check.ps1 -ArgumentList "A","25","10"

所以我正在使用 bash shell 从 Ubuntu 运行这个命令。调用命令正在与 ssh 连接。 check.ps1 的最后一行是“Exit 2”。但是退出代码总是返回 0。有什么建议可以得到正确的退出代码吗?我想将此命令用作 Nagios 检查。

【问题讨论】:

你如何检查退出代码? 【参考方案1】:

不幸的是,从 PowerShell 7.2 开始,任何运行空间外代码,尤其是包括远程处理调用,中继脚本/进程退出代码。

因此,您脚本的exit 2 命令对/usr/bin/pwsh 进程报告的退出代码没有影响。

即使 PowerShell 会话中,此退出代码也不适用于运行空间外调用[1],所以 - 不幸的是 - 你唯一的选择是您的脚本输出所需的退出代码,使 PowerShell 会话捕获它,并使用 exit 调用中继,该调用是传递给 CLI 的 PowerShell 代码的直接部分-command参数。

在最简单的情况下,如果您修改脚本以输出所需的退出代码并假设该退出代码是脚本的唯一输出,您可以使用:

/usr/bin/pwsh -command 'exit (Invoke-Command -Hostname PC -UserName boss -FilePath ./check.ps1 -ArgumentList A, 25, 10)'

[1] 对于 in-runspace 调用,退出代码由 使用exit 的脚本以及外部程序设置 /em>(进程)反映在automatic $LASTEXITCODE variable中。

【讨论】:

【参考方案2】:

对于它的价值,我相信如果你的脚本有异常,退出代码将非零。例如,我的 check.ps1 只有“get-childitem foo”,而 foo 不存在。这是来自cmd的,但我相信效果是一样的。

pwsh -command Invoke-Command -computername localhost check.ps1 -args A,25,10
Get-ChildItem: Cannot find path 'C:\Users\js\Documents\foo' because it does not exist.

echo %errorlevel%
1

【讨论】:

以上是关于从 linux 的 powershell 调用命令获取退出代码的主要内容,如果未能解决你的问题,请参考以下文章

powershell 具有常量块的Powershell函数模板,您可以在从命令行调用和添加任何类型的参数时覆盖它

我如何使用需要从命令提示符/批处理文件引用的参数调用PowerShell Start-Process命令?

从 MATLAB 调用 Powershell 不会移动到 MATLAB 中的下一行

无法从 PowerShell 运行 bcp 命令

从 C# 异常调用的 PowerShell AddCommand

有没有办法从 Powershell 抑制所有命令行输出,包括错误