2012-09-28 6 views
6

私は誰かが次のように私を助けることができることを期待していた:PowerShell:1234と(1234)の違いは何ですか?

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の周りに評価括弧を追加すると、correcly返されます:

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)" 

誰でも上記の動作を説明できますか?

答えて

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でこれをREPROすることができます。 [int]へのキャストを[object]に変更すると、期待どおりに動作します。問題の原因となっているオブジェクトにこれを配置する方法があります。このエラーは、そうのようなより簡潔ビットを示すことができる:V2で

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

PSObjectとして知られているPowerShellの拡張型システムタイプ.NETタイプの包装に関連する既知の問題の数があります。これはその問題に関連しているように見えます。そして実際それは関連しています。これをチェックアウト:

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

オブジェクトを元に戻すようにラップを解除すると、予想される出力が得られます。幸いにもV3で修正されたV2バグ​​までこれをチョークしてください。

+0

ありがとうKeith、私は$ Host.Versionで示されているように、PSバージョン2.0です。結果は「MyField:1234」、私は「MyField:1,234.00」を期待していました。あなたはどんな結果を得ますか? –

+0

@MikeRosenblum私はV2でもこれを再現することができました。何が起こっているのかを説明するために私の答えを更新しました。 –

+0

すばらしい答えキース、これを徹底的にチェックする時間を入れてくれてありがとう。 –

関連する問題