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

ale*_*2k8 6 powershell pretty-print

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

考虑:

Write-Host $null
Write-Host @()
Write-Host @($null, $null)
Run Code Online (Sandbox Code Playgroud)

打印:

# Actually it prints nothing
Run Code Online (Sandbox Code Playgroud)

我想要这样的事情:

Null
@()
@(Null, Null)
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Jay*_*kul 5

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

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

function Write-Visible {
   param($InputObject) 

   New-Object PSObject -Property @{ Object=$InputObject } | 
       Out-String | Out-Host 
}
Run Code Online (Sandbox Code Playgroud)

当然,这些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}
Run Code Online (Sandbox Code Playgroud)

当然,问题在于它对于真实对象往往不会那么好用,因为它将它们转换为对象的属性,在那里它们被渲染为"ToString()"......然而,在我的头顶,我想不出如何在没有新对象的情况下调用那里发生的渲染魔法.


Joe*_*oey 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
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,对于 shell 上的空数组来说,这仍然存在问题(不过,在 .ps1 文件中工作得很好)。另外,不支持哈希表,但支持嵌套数组。可能仍然需要一些管道,但可能会给出一个总体方向。

阵法@($null, $null)仿佛是一头丑陋的野兽,连与它相比都有些抗拒$null。诡异的。