Write-Host を使用してオブジェクトを分析しますが、オブジェクトが実際に何であるかを理解するのが難しい場合があります。
検討:
Write-Host $null
Write-Host @()
Write-Host @($null, $null)
版画:
# Actually it prints nothing
私はこのようなものが欲しいです:
Null
@()
@(Null, Null)
助言がありますか?
Write-Host を使用してオブジェクトを分析しますが、オブジェクトが実際に何であるかを理解するのが難しい場合があります。
検討:
Write-Host $null
Write-Host @()
Write-Host @($null, $null)
版画:
# Actually it prints nothing
私はこのようなものが欲しいです:
Null
@()
@(Null, Null)
助言がありますか?
この特定の例では、オブジェクトのプロパティに貼り付けることで、必要なものを簡単に取得できます。例として、3 つのテストを含む配列を作成してみましょう。
$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()」をレンダリングするためです...しかし、私の頭の上から、新しいオブジェクトがなければ、そこで発生するレンダリング マジックを呼び出す方法が思い浮かびません。
あなたはあなたのためにきれいな印刷をする関数を書くことができます。次のようなものがあなたのニーズに合うかもしれません:
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
}
}
ただし、これにはシェル上の空の配列に関する問題があります(ただし、.ps1ファイルからは正常に機能します)。また、ハッシュテーブルはサポートされていませんが、ネストされた配列はサポートされています。おそらくまだいくつかの配管が必要ですが、一般的な方向性を与える可能性があります。
配列は醜い獣の@($null, $null)ようで、と比較しても抵抗し$nullます。変。
このようなことをしようとすると、複数の問題が発生します。
get-help about_format.ps1xml詳細については、、またはMSDNPowerShell書式設定ファイルのページから入手できます。get-help get-hostは、またはTechNetページを参照してください。知っておきたい一般的なホストは少なくとも3つ
あります。ConsoleHostWindows PowerShell ISE HostPowerGUIScriptEditorHost...
@( … )操作は糖衣構文です
[array] $( … )したがって、@()のステートメントがスカラーを返す場合、それは配列にラップされますが、結果がすでに配列である場合、ネストされません...
このためのコードを提供できるようにしたいと思いますが、現時点では私を少し超えています...
空の配列ではうまく機能しませんが、format-xxxコマンドの1つを使用できます。これは、有用な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...
これを試すことができます:
Write-Host '$null'
Write-Host '@()'
Write-Host '@($null, $null)'