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

Powershell 打印对象比写入主机更好的方法,powershell,pretty-print,Powershell,Pretty Print,我使用Write-Host分析对象,但有时很难理解对象实际上是什么 考虑: Write-Host $null Write-Host @() Write-Host @($null, $null) 印刷品: # Actually it prints nothing 我想要这样的东西: Null @() @(Null, Null) 有什么建议吗?您可以编写一个函数,为您进行漂亮的打印。以下类似的内容可能适合您的需要: function pp($a) { if ($a -eq $null)

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

考虑:

Write-Host $null
Write-Host @()
Write-Host @($null, $null)
印刷品:

# Actually it prints nothing
我想要这样的东西:

Null
@()
@(Null, Null)

有什么建议吗?

您可以编写一个函数,为您进行漂亮的打印。以下类似的内容可能适合您的需要:

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文件中可以正常工作)。此外,不支持哈希表,但支持嵌套数组。可能还需要一些管道,但可能会给出一个大致的方向


@($null,$null)
数组似乎是一只丑陋的野兽,甚至将它与
$null
进行比较都会受到抵制。奇怪。

尝试这样做会有多个问题

  • 更改write host工作方式的“正确”或“powershell”方法是使用格式化文件定义您希望使用的主机如何显示相关对象。您可以从
    获取关于_format.ps1xml的帮助,或从页面获取更多信息
  • 您需要特定于正在使用的“主机”。有关更多信息,请参阅
    获取帮助获取主机
    ,或。您至少需要了解三个常见主机:
    • 基本命令行,
      ConsoleHost
    • 基本PowerShell ISE,
      Windows PowerShell ISE主机
    • 任务PowerGUI主机,
      PowerGUIScriptEditorHost
  • PowerShell以一种特殊的方式处理@()语法,这有时会使处理空数组变得困难。根据: 。。。
    @(…)
    操作是
    [array]$(…)
    的语法糖,因此–如果@()中的语句返回标量,它将被包装在数组中,但如果结果已经是数组,那么它将不会被嵌套
  • 我很想能够提供一些代码,但在这一点上我有点不知所措


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

    $tests = @($null,@(), @($null,$null))
    
    function Write-Visible {
       param($InputObject) 
    
       New-Object PSObject -Property @{ Object=$InputObject } | 
           Out-String | Out-Host 
    }
    
    当然,
    Out字符串| 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()”。。。然而,在我脑海中,我无法想象在没有新对象的情况下如何调用在那里发生的渲染魔法。

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

    你可以试试这个:

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

    所以你不希望什么都不是什么?是的,“什么都不是什么”:-)可能是一种将对象转储为YAML的方法,等等。@{}ConvertTo Json-Compress将按预期返回{},但遗憾的是对你的情况不起作用。你不能添加一些类似于if($a.length-eq 0){write host@()}的内容吗?它已经在我的测试脚本中起作用了,这让我感到困惑。我测试了@(),@(1,2),@(1,@(2,3)),$null和@($null,$null)。只有最后一个结果为“空”,其他人则像他们应该的那样工作。但当直接从命令行使用函数时,情况似乎并非如此。当然可以,继续修改你喜欢的。对不起,我误读了你的答案,没有尝试你的代码。您的代码在带有空数组的shell中对我有效。您也可以使用format list命令而不是format table。
    Write-Host '$null'
    Write-Host '@()'
    Write-Host '@($null, $null)'