6

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

考虑:

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

印刷:

# Actually it prints nothing

我想要这样的东西:

Null
@()
@(Null, Null)

有什么建议么?

4

5 回答 5

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()”......但是,在我的脑海中,如果没有新对象,我想不出如何调用那里发生的渲染魔法。

于 2011-02-02T20:15:32.883 回答
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 文件中可以正常工作)。也不支持哈希表,但嵌套数组是。可能仍然需要一些管道,但可能会给出一个大致的方向。

阵法仿佛是一头丑陋的@($null, $null)野兽,甚至不敢与它相比$null。诡异的。

于 2009-04-24T17:30:06.480 回答
1

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

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

    ... 这

    @( … )

    操作是语法糖

    [array] $( … )

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

我很想能够为此提供一些代码,但在这一点上它有点超出我的范围......

于 2011-02-01T01:49:40.213 回答
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... 
于 2011-03-30T15:38:43.113 回答
-1

你可以试试这个:

Write-Host '$null'
Write-Host '@()'
Write-Host '@($null, $null)'
于 2013-01-25T13:41:36.640 回答