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

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

如果您打开对象以恢复原始状态,您将获得预期的输出。将此归结为一个 V2 错误,幸运的是,该错误已在 V3 中修复。

于 2012-09-28T16:28:39.350 回答