Powershell:无法更新注册表路径,因为它不存在(但实际上存在)

Powershell: Can't update a registry path because it doesn't exist (but it actually exists)

我们在 Windows 8.1 中对 IE 进行了 运行ning 编码 UI 测试,我们正在通过 Visual Studio Team Services 进行测试。作为构建的一部分,我们 运行 一个禁用弹出窗口管理器的 Powershell 脚本。我们用来禁用它的代码是这样的:

Remove-ItemProperty "HKCU:\Software\Microsoft\Internet Explorer\New Windows" -Name "PopupMgr"
New-ItemProperty "HKCU:\Software\Microsoft\Internet Explorer\New Windows" -Name "PopupMgr" -Value 00000000 -PropertyType "DWord"

当我在 Release Manager 中创建和部署构建时,运行这会生成以下错误:

The running command stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop: Cannot find path 'HKCU:\Software\Microsoft\Internet Explorer\New Windows' because it does not exist.

(强调我的)

我已经登录到 VM 并查看了注册表,HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\New Windows 绝对存在。我唯一能想到的是它的值不是 DWORD 而是一个字符串——PopupMgr 键的数据值为 "yes" 而不是 1 或 0。但事实并非如此匹配错误消息——错误说它甚至找不到键的路径,而不是值类型不匹配。另外,代码会在插入新密钥之前删除现有密钥,所以我什至不知道它是如何注意到不匹配的。

更奇怪的是,如果我在 VM 中打开 Powershell 并且 运行 正是那两行(我复制并粘贴以避免打字错误),它们 运行 就好了。

此脚本在 Windows 10 上运行得非常好并且已经运行了一段时间,所以我不确定这里发生了什么。该用户是管理员组的成员,所以我认为这不是权限问题。

任何人都可以阐明这一点吗?

我认为您正在尝试添加 注册表项 属性 值 您需要测试注册表项是否存在。如果注册表项不存在,则需要创建注册表项,然后创建注册表项属性值。

您应该创建注册表项的路径,然后指定 属性 名称和您要分配的值。这由三个变量组成,如下所示:

这应该能帮到你:

$registryPath = "HKCU:\Software\Microsoft\Internet Explorer\New Windows"

$Name = "PopupMgr"

$value = "00000000"

IF(!(Test-Path $registryPath))

  {

    New-Item -Path $registryPath -Force | Out-Null

    New-ItemProperty -Path $registryPath -Name $name -Value $value `

    -PropertyType DWORD -Force | Out-Null}

 ELSE {

    New-ItemProperty -Path $registryPath -Name $name -Value $value `

    -PropertyType DWORD -Force | Out-Null}

希望对您有所帮助。

我在重命名值时遇到了同样的问题,所以我知道对于值你可以(需要/应该)定义它们,所以我停止尝试重命名这些值并开始定义它们:)

只需尝试使用 Set-ItemProperty 来更改、设置和重置值 ...

Set-ItemProperty -Path "HKCU:\Software\Microsoft\Internet Explorer\New Windows" -Name PopupMgr -Value 00000000 -Type DWORD

我将 Duttas 的答案包装在一个易于使用的函数中:

Set_Registry_key -key "HKLM:\FULL\PATH\pad\pat\KEYNAME" `
                 -type String `
                 -value 'value'

函数定义:

function Set_Registry_key{
    # String REG_SZ; ExpandString: REG_EXPAND_SZ; Binary: REG_BINARY; DWord: REG_DWORD; MultiString: REG_MULTI_SZ; Qword: REG_QWORD; Unknown: REG_RESOURCE_LIST
    Param(
        [Parameter(Mandatory=$true)]
        [string]
        $key,
        [ValidateSet('String', 'DWord', 'ExpandString', 'Binary', 'MultiString', 'Qword', 'Unknown')]
        $type,
        [Parameter(Mandatory=$true)]
        $value
    )
    $registryPath = $key -replace "[^\]*$", ""
    $name = $key -replace ".*\", ""
    if(!(Test-Path $registryPath)){
        New-Item -Path $registryPath -Force | Out-Null
        New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType $type -Force | Out-Null
    }else {
        New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType $type -Force | Out-Null
    }
}