重定向powershell的stderr并获取退出状态

问题描述 投票:0回答:1

我正在尝试使用

Powershell

检查 Docker 是否正在运行

我编写了以下 powershell 片段:

docker info
echo $? 

如果 Docker 引擎未运行,则此代码片段返回 False;如果运行,则返回 True。到目前为止,一切都很好。现在我想抑制 docker info 的所有输出。我尝试过以各种方式做到这一点,例如:

(docker info) 2>&1>$null
echo $? 

这会抑制所有输出,但也会更改退出变量的输出。

正确的做法是什么?

powershell redirect
1个回答
0
投票

解决方案#1:

如果使用 PowerShell 5.1,请尝试以下操作:

$(
   docker info
   $Results = $?
) 2>&1>$null
ECHO $Results

解决方案#2:

切换到 PowerShell 7.4.1 或更高版本。

根据我的实验,PowerShell 5.1 的行为似乎与 PowerShell 7.4.1 不同(并且可能与版本 6 及更高版本不同)。

测试方法:

我没有 docker,但我发现以下代码在 Docker Engine 运行时产生了与描述相同的结果:

CMD /C "ECHO;Test & EXIT 0"
ECHO $?

这产生了与 Docker 引擎未运行时相同的结果。

CMD /C "ECHO;Test & EXIT 1"
ECHO $?

在 PowerShell 5.1 中,此代码具有与所描述的相同的问题,但在 PowerShell 7.4.1 中则正常(如果找到了 Docker,则替换为

0
,如果未找到,则替换为非零值。):

(CMD /C "ECHO;Test & EXIT <ExitCode>") 2>&1>$null

但这在 PowerShell 5.1 和 7.4.1 中都按预期工作

$(
   CMD /C "ECHO;Test & EXIT 1"
$Results = $?
) 2>&1>$null
$Results
© www.soinside.com 2019 - 2024. All rights reserved.