我使用Write-Host分析对象,但有时候很难理解对象实际上是什么。
考虑:
Write-Host $null
Write-Host @()
Write-Host @($null, $null)
打印:
# Actually it prints nothing
我想要这样的事情:
Null
@()
@(Null, Null)
有什么建议吗?
答案 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)
尝试做这样的事情会有多个问题。
get-help about_format.ps1xml
或MSDN PowerShell Formatting File页面获取更多信息。get-help get-host
,或TechNet page。有 AT LEAST 您想要了解的三个常见主机:
ConsoleHost
Windows PowerShell ISE Host
PowerGUIScriptEditorHost
...
@( … )
操作是
[array] $( … )
的语法糖所以 - 如果@()中的语句返回一个标量,它将被包装在一个数组中,但如果结果已经是一个数组,那么它将不会嵌套......
我希望能够为此提供一些代码,但此时有点超出我的想法......
答案 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)'