2012-09-28 40 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:

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。如果您将[object]转换为[int],它会开始按预期工作。有一件事把它放在一个导致问题的对象中。该错误可以表明有点更简洁地,像这样:

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

在V2也有一些与.NET类型的被称为PSObject一个PowerShell扩展类型系统类型包装的已知问题。这看起来与这个问题有关。事实上它是相关的。看看这个:

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

如果你打开对象回到原来的,你会得到预期的输出。把这个粉笔写到V3中幸运的V2错误。

+0

感谢Keith,我在PS版本2.0上显示$ Host.Version。我得到结果“MyField:1234”,而我期待“MyField:1,234.00”。你会得到什么结果? –

+0

@MikeRosenblum我也能够在V2上重现这一点。更新我的答案,解释发生了什么。 –

+0

非常棒的回答基思,谢谢你的时间来彻底检查这一点。 –

相关问题