Powershell 打印对象比写入主机更好的方法
我使用Write-Host分析对象,但有时很难理解对象实际上是什么 考虑: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 $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
进行比较都会受到抵制。奇怪。尝试这样做会有多个问题
获取关于_format.ps1xml的帮助,或从页面获取更多信息
获取帮助获取主机
,或。您至少需要了解三个常见主机:
- 基本命令行,
ConsoleHost
- 基本PowerShell ISE,
Windows PowerShell ISE主机
- 任务PowerGUI主机,
PowerGUIScriptEditorHost
@(…)
操作是[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)'