6

Write-Host を使用してオブジェクトを分析しますが、オブジェクトが実際に何であるかを理解するのが難しい場合があります。

検討:

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

版画:

# Actually it prints nothing

私はこのようなものが欲しいです:

Null
@()
@(Null, Null)

助言がありますか?

4

5 に答える 5

5

この特定の例では、オブジェクトのプロパティに貼り付けることで、必要なものを簡単に取得できます。例として、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()」をレンダリングするためです...しかし、私の頭の上から、新しいオブジェクトがなければ、そこで発生するレンダリング マジックを呼び出す方法が思い浮かびません。

于 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
    }
}

ただし、これにはシェル上の空の配列に関する問題があります(ただし、.ps1ファイルからは正常に機能します)。また、ハッシュテーブルはサポートされていませんが、ネストされた配列はサポートされています。おそらくまだいくつかの配管が必要ですが、一般的な方向性を与える可能性があります。

配列は醜い獣の@($null, $null)ようで、と比較しても抵抗し$nullます。変。

于 2009-04-24T17:30:06.480 に答える
1

このようなことをしようとすると、複数の問題が発生します。

  1. write-hostの動作を変更する「正しい」または「powershell」の方法は、フォーマットファイルを使用して、使用しているホストが問題のオブジェクトを表示する方法を定義することです。get-help about_format.ps1xml詳細については、、またはMSDNPowerShell書式設定ファイルのページから入手できます。
  2. 使用している「ホスト」に固有である必要があります。詳細についてget-help get-hostは、またはTechNetページを参照してください。知っておきたい一般的なホストは少なくとも3つ あります。
    • 基本的なコマンドライン、ConsoleHost
    • 基本的なPowerShellISE、Windows PowerShell ISE Host
    • Quest PowerGUIホスト、PowerGUIScriptEditorHost
  3. PowerShellは@()構文を特別な方法で処理するため、空の配列の処理が困難になる場合があります。このMSDNPowerShellブログ投稿によると:

    ...

    @( … )

    操作は糖衣構文です

    [array] $( … )

    したがって、@()のステートメントがスカラーを返す場合、それは配列にラップされますが、結果がすでに配列である場合、ネストされません...

このためのコードを提供できるようにしたいと思いますが、現時点では私を少し超えています...

于 2011-02-01T01:49:40.213 に答える
1

空の配列ではうまく機能しませんが、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... 
于 2011-03-30T15:38:43.113 に答える
-1

これを試すことができます:

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