将输出和详细信息捕获到两个不同的变量中是否可行?
我的要求:
我正在使用powershell和wpf创建一个gui,它有一个richtextbox,只显示详细和错误。
例如,如果我执行get-dscconfiguration -verbose,则详细信息流应该转到richtextbox,并且该cmdlet的输出应该被赋值给变量以进行进一步的操作。
请帮我解决这个问题。谢谢!
-vinay
答案 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之间的任意数字。
如果你觉得我的方法还不错,请点击鼠标给我投票,非常感谢。