我希望有人可以帮我解决以下问题:
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)"
有人可以解释上面的行为吗?
答案 0 :(得分: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
如果打开对象以取回原始对象,则会获得预期的输出。将此问题归结为一个V2错误,幸运的是在V3中已修复。