【问题标题】:PowerShell: What is the difference between 1234 and (1234)?PowerShell:1234 和 (1234) 有什么区别?
【发布时间】:2012-09-28 16:18:40
【问题描述】:

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

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

谁能解释上述行为?

【问题讨论】:

    标签: powershell casting string-formatting evaluation


    【解决方案1】:

    我无法在 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 中修复。

    【讨论】:

    • 感谢 Keith,我使用的是 PS 2.0 版,如 $Host.Version 所示。我得到结果“MyField:1234”,而我期待“MyField:1,234.00”。你得到什么结果?
    • @MikeRosenblum 我也能够在 V2 上重现这个。更新了我的答案以解释发生了什么。
    • Keith 的回答很棒,感谢您花时间仔细检查。
    猜你喜欢
    • 2017-09-28
    • 2012-08-22
    • 1970-01-01
    • 2019-06-29
    • 2012-07-26
    • 2010-12-28
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多