Powershell捕获不同变量中的输出和详细信息

时间:2017-01-12 06:09:51

标签: wpf powershell user-interface

将输出和详细信息捕获到两个不同的变量中是否可行?

我的要求:

我正在使用powershell和wpf创建一个gui,它有一个richtextbox,只显示详细和错误。

例如,如果我执行get-dscconfiguration -verbose,则详细信息流应该转到richtextbox,并且该cmdlet的输出应该被赋值给变量以进行进一步的操作。

请帮我解决这个问题。谢谢!

-vinay

3 个答案:

答案 0 :(得分:1)

您可以将一个流捕获到一个变量或多个流到一个变量,但除此之外,您需要发送到文件并读回或过滤捕获多个流的变量。例如,要仅捕获详细输出,您可以将命令作为子表达式运行。

$VerboseOnly = $($OutputOnly= .{
    New-Item -ItemType Directory -Path c:\Test -Verbose
    Remove-Item -Path c:\Test -Verbose
    Remove-Item -Path c:\Test -Verbose
    Write-Warning "warning"
}) 4>&1

运行时,会将错误和警告对象输出到控制台,但是详细对象会保存到$ VerboseOnly中,输出对象会保存到$ OutputOnly中。

您可以重定向多个流,以下示例显示:

$VerboseAndWarning = $(
$OutputOnly = .{
    New-Item -ItemType Directory -Path c:\Test -Verbose
    Remove-Item -Path c:\Test -Verbose
    Remove-Item -Path c:\Test -Verbose
    Write-Warning "warning"
}) 4>&13>&1

此时只将错误对象写入控制台,输出System.IO.DirectoryInfo对象位于$ outputOnly中,警告和详细消息位于$ VerboseAndWarning中。然后,您可以通过使用where-object子句进行过滤来将它们拉出来。

$VerboseAndWarning | Where-Object {$_ -is [System.Management.Automation.WarningRecord]}
WARNING: warning
$VerboseAndWarning | Where-Object {$_ -is [System.Management.Automation.VerboseRecord]}
VERBOSE: Performing operation "Create directory" on Target "Destination: C:\Test".
VERBOSE: Performing operation "Remove Directory" on Target "C:\Test".

答案 1 :(得分:0)

https://stackoverflow.com/a/33002914

以上网址是对其他类似问题的回答,这些问题最有可能对您有所帮助。

他为stdout和stderr提供信息,然后在完成后将它们分开。但是,它并没有在飞行中完成。

您可以将每个人保存到自己的变量中。

答案 2 :(得分:0)

使用Where-Object(别名是符号?)是一个显而易见的方法,但它有点太麻烦了。它需要大量代码。

这样不仅会花费更长的时间,还会增加出错的概率。

其实在PowerShell中有一种更简洁的方法可以将不同的流分离到不同的变量中(我偶然想到的)。

# First, declare a method that outputs both streams at the same time.
function thisFunc {
    [cmdletbinding()]
    param()
    Write-Output 'Output'
    Write-Verbose 'Verbose'
}
# The separation is done in a single statement.Our goal has been achieved.
$VerboseStream = (thisFunc -Verbose | Tee-Object -Variable 'String' | Out-Null) 4>&1

然后我们验证这两个变量的内容

$VerboseStream.getType().FullName
$String.getType().FullName

控制台上应显示以下信息:

PS> System.Management.Automation.VerboseRecord
System.String

'4>&1' 表示将verboseStream重定向到成功流,然后可以保存到一个变量中,当然你可以把这个数字改成2到5之间的任意数字。

如果你觉得我的方法还不错,请点击鼠标给我投票,非常感谢。