PowerShell 技能连载 - 将 PowerShell 输出重定向到 GridView

当在 PowerShell 中输出数据时,它会静默地通过管道输出到 Out-Default 并且最终以文本的方式输出到控制台。如果我们覆盖 Out-Default,就可以改变它的行为,例如将所有 PowerShell 的输出改到一个网格视图窗口。实际中,您甚至可以区别对待正常的输出和错误信息,并且将两者显示在不同的窗口里。

以下是两个函数:Enable-GridOutputDisable-GridOutput。当您运行 Enable-GridOutput 时,它会覆盖 Out-Default 并将常规的输出显示在 “Output” 网格视图窗口,并且将错误信息转换为有用的文本,并将它输出到一个独立的 “Error” 网格视图窗口。

当运行 Disable-GridOutput 后,会去掉覆盖的效果,并且回到缺省的行为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
function Enable-GridOutput
{
function global:Out-Default
{
param
(
[Parameter(ValueFromPipeline=$true)][Object]
$InputObject
)

begin
{
$cmd = $ExecutionContext.InvokeCommand.
GetCommand('Microsoft.PowerShell.Utility\Out-GridView',
[Management.Automation.CommandTypes]::Cmdlet)

$p1 = {& $cmd -Title 'Output' }.
GetSteppablePipeline($myInvocation.CommandOrigin)
$p2 = {& $cmd -Title 'Error' }.
GetSteppablePipeline($myInvocation.CommandOrigin)

$p1.Begin($PSCmdlet)
$p2.Begin($PSCmdlet)
}

process
{
if ($_ -is [Management.Automation.ErrorRecord])
{
$info = $_ | ForEach-Object { [PSCustomObject]@{
Exception = $_.Exception.Message
Reason = $_.CategoryInfo.Reason
Target = $_.CategoryInfo.TargetName
Script = $_.InvocationInfo.ScriptName
Line = $_.InvocationInfo.ScriptLineNumber
Column = $_.InvocationInfo.OffsetInLine
}
}
$p2.Process($info)
}
else
{
$p1.Process($_)
}
}

end
{
$p1.End()
$p2.End()
}
}
}

function Disable-GridOutput
{
Remove-Item -Path function:Out-Default -ErrorAction SilentlyContinue
}
评论