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

Mik*_*lum 6 powershell evaluation casting string-formatting

我希望有人可以帮我解决以下问题:

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)
Run Code Online (Sandbox Code Playgroud)

以上回报:

MyField                  :            1234
Run Code Online (Sandbox Code Playgroud)

然而,我期待着:

MyField                  :        1,234.00
Run Code Online (Sandbox Code Playgroud)

如果我在1234周围添加评估括号,则会正确返回预期结果:

Write-Output (Get-FormattedNameValuePair -name MyField -value (1234))
Run Code Online (Sandbox Code Playgroud)

如果直接调用而不是包含在"Get-FormattedNameValuePair"函数中,则格式化也可以在没有评估括号的情况下工作.

[string] $name = "MyField"
[object] $value = 1234
Write-Output  "$("{0,-24}" -f $name) : $("{0,15:N2}" -f $value)"
Run Code Online (Sandbox Code Playgroud)

任何人都能解释上面的行为吗?

Kei*_*ill 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
Run Code Online (Sandbox Code Playgroud)

但我可以在V2上重复这个.如果您将[object]演员表更改为[int]它,则会按预期开始工作.有一些关于将它放在导致问题的对象中.这个错误可以更简洁地显示出来:

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

在V2中,存在许多与已知为PSObject的PowerShell扩展类型系统类型中的.NET类型包装相关的已知问题.这看起来与该问题有关.事实上它是相关的.看一下这个:

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

如果打开对象以回到原始对象,则会得到预期的输出.将此问题归结为一个V2错误,幸运的是在V3中已修复.