首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell从rabbitmqctl获得输出并解析异常

Powershell从rabbitmqctl获得输出并解析异常
EN

Stack Overflow用户
提问于 2020-07-14 09:33:47
回答 1查看 118关注 0票数 0

我打电话给来自Powrshell的兔子:

代码语言:javascript
复制
$out = (& $path ($arguments -split " ") )
Write-Host $out

通过正确的路径,输出有一个成功的消息:

代码语言:javascript
复制
Clearing policy "<policyname>" on vhost "<vhost>" ...

如果路径不正确,我将得到一个例外:

代码语言:javascript
复制
....
    + CategoryInfo          : NotSpecified: (Error::String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
Parameter does not exist

消息Clearing policy丢失了。停止执行时,$_.Exception.Message为空。

代码语言:javascript
复制
try {
   $ErrorActionPreference = 'Stop'
   ...
}
catch {
    Write-Warning $_.Exception.Message
}

有没有办法同时获得Clearing policy消息和最后一行Parameter does not exist

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-14 15:23:33

tl;dr:将错误流重定向到stdout,并将每个元素转换为string:

代码语言:javascript
复制
$out = (& $path ($arguments -split " ") 2>&1) | % ToString

在执行外部程序(如rabbitmqctl)时,不会收到任何异常。您可以在不同的流(主要是stdoutstderr)中获得输出,您的外部程序将返回一个错误代码,但当然不是例外,PowerShell可以处理。

我想您正在使用PowerShell ISE。为什么?因为与PowerShell不同,PowerShell ISE有一种奇怪的行为,如果它被迫打印文本,就会抛出异常,这是从外部程序的错误流中接收到的。

您可以使用以下命令复制它:

代码语言:javascript
复制
where.exe nonExistentExecutable.bla

在PowerShell中,它将输出一些文本,说明它无法找到具有该模式的文件。在PowerShell ISE中,您将得到一个NativeCommandError异常,它包含来自错误流的文本。

这里的关键是,如果大多数可执行文件必须报告错误,则它们将写入错误流。where.exe也是如此,在您的情况下rabbitmqctl也是如此。不能像这样捕获错误流:

代码语言:javascript
复制
$out = (& $path ($arguments -split " ") )

这将只捕获成功流(又名stdout)。错误流将被转发到控制台,ISE将抛出一个异常。你的案子就是这样。要捕获错误流,请将其重定向到stdout

代码语言:javascript
复制
$out = (& $path ($arguments -split " ") 2>&1)

现在,$out肯定会捕获结果,无论是成功消息还是错误消息。在出现错误流的情况下,每一行都将被一个[System.Management.Automation.ErrorRecord]包装,甚至PowerShell (如ISE)也会以异常的形式输出。要防止这种情况,请将每个元素转换为string:

代码语言:javascript
复制
$out = (& $path ($arguments -split " ") 2>&1) | % ToString

这不会对成功信息产生负面影响,因此在任何情况下都可以使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62892125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档