打印对象比写入主机更好的方法

时间:2009-04-24 16:57:27

标签: powershell pretty-print

我使用Write-Host分析对象,但有时候很难理解对象实际上是什么。

考虑:

Write-Host $null
Write-Host @()
Write-Host @($null, $null)

打印:

# Actually it prints nothing

我想要这样的事情:

Null
@()
@(Null, Null)

有什么建议吗?

5 个答案:

答案 0 :(得分:5)

对于此特定示例,您可以通过将它们粘贴到对象的属性中来轻松获得所需内容。为了举个例子,让我们创建一个包含三个测试的数组:

$tests = @($null,@(), @($null,$null))

function Write-Visible {
   param($InputObject) 

   New-Object PSObject -Property @{ Object=$InputObject } | 
       Out-String | Out-Host 
}

当然,Out-String | Out-Host只是为了确保我们不会将对象实际输出到管道,但行为与Write-Host相似。

现在我们可以运行测试了:

PS> Write-Visible $tests[0]

Object
------


PS> Write-Visible $tests[1]

Object
------
{}


PS> Write-Visible $tests[2]

Object
------
{$null, $null}

当然,问题在于它对于真实对象往往不会那么好用,因为它会将它们转换为对象的属性,在那里它们被渲染为“ToString()”...但是,在顶部之外我的头脑,我想不出如何调用那里没有新物体的渲染魔法。

答案 1 :(得分:2)

您可以编写一个为您打印精美打印的功能。以下内容可能适合您的需求:

function pp($a) {
    if ($a -eq $null) {
        return "Null"
    } elseif ($a -is [object[]]) {
        $b = @()
        foreach ($x in $a) {
            $b += (pp $x)
        }
        $s = "@(" + [string]::Join(",", $b) + ")"
        return $s
    } else {
        return $a
    }
}

但是,shell上的空数组仍然存在问题(但是从.ps1文件可以正常工作)。也不支持Hashtables,但嵌套数组是。可能仍然需要一些管道,但可能会给出一个大方向。

@($null, $null)数组似乎是一个丑陋的野兽,甚至将它与$null进行比较也是有效的。怪异。

答案 2 :(得分:1)

尝试做这样的事情会有多个问题。

  1. 改变写主机工作方式的“正确”或“powershell”方法是使用格式化文件来定义您希望使用的主机如何显示相关对象。您可以从get-help about_format.ps1xmlMSDN PowerShell Formatting File页面获取更多信息。
  2. 您需要特定于您正在使用的“主机”。有关详细信息,请参阅get-help get-host,或TechNet page。有 AT LEAST 您想要了解的三个常见主机:
    • 基本命令行ConsoleHost
    • 基本PowerShell ISE,Windows PowerShell ISE Host
    • Quest PowerGUI主持人,PowerGUIScriptEditorHost
  3. PowerShell以特殊方式处理@()语法,这有时会使处理空数组变得困难。根据{{​​3}}:
      

    ...

    @( … )

    操作是

    [array] $( … )的语法糖

    所以 - 如果@()中的语句返回一个标量,它将被包装在一个数组中,但如果结果已经是一个数组,那么它将不会嵌套......

  4.   

    我希望能够为此提供一些代码,但此时有点超出我的想法......

答案 3 :(得分:1)

对于空数组不起作用,但您可以使用format-xxx命令之一。 这有助于格式化没有有用的ToString覆盖的对象。 例如。

> $cmd = Get-Command -Name get-command
> $cmd

CommandType     Name                                                Definition
-----------     ----                                                ----------
Cmdlet          Get-Command                                         Get-Command...

> write-host $cmd
Get-Command
> format-table -InputObject $cmd | out-string | out-host

CommandType     Name                                                Definition
-----------     ----                                                ----------
Cmdlet          Get-Command                                         Get-Command... 

答案 4 :(得分:-1)

你可以试试这个:

Write-Host '$null'
Write-Host '@()'
Write-Host '@($null, $null)'