PowerShell:1234和(1234)之间有什么区别?

PowerShell:1234和(1234)之间有什么区别?,powershell,casting,string-formatting,evaluation,Powershell,Casting,String Formatting,Evaluation,我希望有人能在以下方面帮助我: 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

我希望有人能在以下方面帮助我:

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

有人能解释上面的行为吗?

我无法在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中,有许多已知问题与PowerShell扩展类型系统类型(称为PSObject)中.NET类型的包装有关。这似乎与该问题有关。事实上,这是相关的。看看这个:

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

如果展开对象以返回原始对象,则会得到预期的输出。这可以归结为一个V2错误,幸运的是它已在V3中修复。

谢谢Keith,我使用的是PS 2.0版,如$Host.version所示。我得到的结果是“MyField:1234”,而我预期的结果是“MyField:1234.00”。你得到了什么结果?@MikeRosenblum我也能在V2上重新编程。更新了我的答案来解释发生了什么。非常好的答案Keith,谢谢你花时间仔细检查。