0

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

我创建了一个小样本 powershell 脚本来重现该问题。这是片段:

$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”,但实际上我想传入一个变量。

关于我做错了什么的任何想法?提前致谢。

4

1 回答 1

0

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

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""。通过此更改,它现在可以按预期工作。

于 2014-03-19T22:43:04.537 回答