我打电话给来自Powrshell的兔子:
$out = (& $path ($arguments -split " ") )
Write-Host $out通过正确的路径,输出有一个成功的消息:
Clearing policy "<policyname>" on vhost "<vhost>" ...如果路径不正确,我将得到一个例外:
....
+ CategoryInfo : NotSpecified: (Error::String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Parameter does not exist消息Clearing policy丢失了。停止执行时,$_.Exception.Message为空。
try {
$ErrorActionPreference = 'Stop'
...
}
catch {
Write-Warning $_.Exception.Message
}有没有办法同时获得Clearing policy消息和最后一行Parameter does not exist?
发布于 2020-07-14 15:23:33
tl;dr:将错误流重定向到stdout,并将每个元素转换为string:
$out = (& $path ($arguments -split " ") 2>&1) | % ToString在执行外部程序(如rabbitmqctl)时,不会收到任何异常。您可以在不同的流(主要是stdout和stderr)中获得输出,您的外部程序将返回一个错误代码,但当然不是例外,PowerShell可以处理。
我想您正在使用PowerShell ISE。为什么?因为与PowerShell不同,PowerShell ISE有一种奇怪的行为,如果它被迫打印文本,就会抛出异常,这是从外部程序的错误流中接收到的。
您可以使用以下命令复制它:
where.exe nonExistentExecutable.bla在PowerShell中,它将输出一些文本,说明它无法找到具有该模式的文件。在PowerShell ISE中,您将得到一个NativeCommandError异常,它包含来自错误流的文本。
这里的关键是,如果大多数可执行文件必须报告错误,则它们将写入错误流。where.exe也是如此,在您的情况下rabbitmqctl也是如此。不能像这样捕获错误流:
$out = (& $path ($arguments -split " ") )这将只捕获成功流(又名stdout)。错误流将被转发到控制台,ISE将抛出一个异常。你的案子就是这样。要捕获错误流,请将其重定向到stdout
$out = (& $path ($arguments -split " ") 2>&1)现在,$out肯定会捕获结果,无论是成功消息还是错误消息。在出现错误流的情况下,每一行都将被一个[System.Management.Automation.ErrorRecord]包装,甚至PowerShell (如ISE)也会以异常的形式输出。要防止这种情况,请将每个元素转换为string:
$out = (& $path ($arguments -split " ") 2>&1) | % ToString这不会对成功信息产生负面影响,因此在任何情况下都可以使用。
https://stackoverflow.com/questions/62892125
复制相似问题