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