6

私は誰かが次のことで私を助けてくれることを望んでいました:

Function Get-FormattedNameValuePair([string] $name, [object] $value)
{
    return "$("{0,-24}" -f $name) : $("{0,15:N2}" -f $value)"
}

Write-Output (Get-FormattedNameValuePair -name MyField -value 1234)

上記は以下を返します。

MyField                  :            1234

しかし、私は期待していました:

MyField                  :        1,234.00

1234 の周りに評価ブラケットを追加すると、期待される結果が正しく返されます。

Write-Output (Get-FormattedNameValuePair -name MyField -value (1234))

「Get-FormattedNameValuePair」関数内でラップする代わりに直接呼び出すと、評価ブラケットなしでも書式設定が機能します。

[string] $name = "MyField"
[object] $value = 1234
Write-Output  "$("{0,-24}" -f $name) : $("{0,15:N2}" -f $value)"

上記の動作を説明できる人はいますか?

4

1 に答える 1

5

V3でこれを再現できません

Function Get-FormattedNameValuePair([string] $name, [object] $value)
{
    return "$("{0,-24}" -f $name) : $("{0,15:N2}" -f $value)"
}

Write-Output (Get-FormattedNameValuePair -name MyField -value 1234)

MyField                  :        1,234.00

しかし、V2でこれを再現できます。[object]キャストを変更すると、[int]期待どおりに機能し始めます。問題を引き起こしているオブジェクトにこれを入れることには何かがあります。このエラーは、次のようにもう少し簡潔に表示できます。

function foo([object]$o) { "{0,15:N2}" -f $o }
foo 1234
       1234

V2 には、PSObject と呼ばれる PowerShell 拡張型システム型での .NET 型のラップに関連する既知の問題が多数あります。これはその問題に関連しているようです。そして確かにそれは関連しています。これをチェックしてください:

function foo([object]$o) { "{0,15:N2}" -f $o.psobject.baseobject }
foo 1234
   1,234.00

オブジェクトをアンラップして元に戻すと、期待どおりの出力が得られます。これは、幸いにも V3 で修正された V2 のバグによるものです。

于 2012-09-28T16:28:39.350 に答える