【问题标题】:PowerShell Start-Process loses precision on number passed as a string to a functionPowerShell Start-Process 丢失作为字符串传递给函数的数字的精度
【发布时间】:2014-03-19 22:35:51
【问题描述】:

我有一些代码可以编辑注册表,所以它需要以管理员身份运行。为此,我从正在运行的 PowerShell 脚本启动一个新的 PowerShell 进程,并传入部分注册表项路径,该路径恰好是版本号,例如“12.0”。新 PowerShell 进程中的函数将字符串接收为“12”,而不是“12.0”,因此我收到了找不到注册表项的错误。

我创建了一个小示例 powershell 脚本来重现该问题。这是sn-p:

$ScriptBlock = {
    function Test([string]$VisualStudioVersion)
    {
        $VisualStudioVersion    # This always displays 12, instead of 12.0
        $Host.UI.RawUI.ReadKey()
    }
}

# Run the script block's function.
Start-Process -FilePath PowerShell -ArgumentList "-Command & {$ScriptBlock Test(""12.0"")}"

这里我硬编码了“12.0”,但实际上我想传入一个变量。

关于我做错了什么有什么想法吗?提前致谢。

【问题讨论】:

    标签: string powershell precision start-process


    【解决方案1】:

    好的,经过一些试验,以下似乎可以正常工作:

    Start-Process -FilePath PowerShell -ArgumentList "-Command & {$ScriptBlock Test('12.0')}"
    

    它甚至可以在使用变量时工作:

    $version = "12.0"
    Start-Process -FilePath PowerShell -ArgumentList "-Command & {$ScriptBlock Test('$version')}"
    

    我仍然不确定为什么使用双引号会导致它失去精度而单引号保持它,但至少我解决了我的问题。

    更新

    原来我是个假人,问题是我使用 C# 语法 Test(""$version"") 来调用函数,而不是正确的 PowerShell 语法 Test ""version""。通过此更改,它现在可以按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多