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
}
}
我们在 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
}
}