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)
有什么建议?
对于此特定示例,您可以通过将它们粘贴到对象的属性中来轻松获得所需内容.为了举个例子,让我们创建一个包含三个测试的数组:
$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()"......然而,在我的头顶,我想不出如何在没有新对象的情况下调用那里发生的渲染魔法.
您可以编写一个函数来为您进行漂亮的打印。类似以下内容可能适合您的需求:
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。诡异的。
| 归档时间: |
|
| 查看次数: |
11179 次 |
| 最近记录: |