PowerShell执行Set-ItemProperty提示注册表路径不存在的原因
问题原因
Set-ItemProperty 命令的设计逻辑是仅能为已经存在的注册表项设置属性值,不会自动创建不存在的父级注册表路径,不管是否使用管理员权限运行,只要指定的 -Path 对应的注册表项不存在,就会抛出你看到的路径不存在错误,这个命令本身不具备新建注册表项的能力,所以直接用它尝试创建新注册表项必然报错。
常见触发该错误的具体场景有三类:
- 目标路径
HKLM:\Software\ContosoCompany本身从未创建过,直接执行属性设置命令找不到对应项 - 64位系统下启动了32位版本的PowerShell,操作注册表时会被系统自动重定向到
HKLM:\Software\Wow6432Node路径,如果你要操作的项存放在64位原生注册表路径中,32位PowerShell无法识别到对应路径,也会报不存在错误,哪怕你通过注册表编辑器能直观看到这个项 - 部分受系统完整性保护的注册表路径,即便使用管理员账户运行,默认也没有访问权限,也可能返回路径不存在的报错,但你返回的错误明确标记为
PathNotFound,优先排查前两类问题。
解决方法
- 先创建缺失的注册表项,再执行属性设置命令,
-Force参数可以保证项已存在时不会重复创建报错:
# 创建目标注册表项 New-Item -Path "HKLM:\Software\ContosoCompany" -Force # 为已存在的项设置属性值 Set-ItemProperty -Path "HKLM:\Software\ContosoCompany" -Name "NoOfEmployees" -Value 823
注意:给Set-ItemProperty加-Force参数无法实现自动创建父路径的效果,必须单独执行New-Item创建项。
- 如果是32/64位注册表重定向导致的问题:
- 操作64位原生注册表路径时,启动
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe(64位版本PowerShell)执行命令即可,不要使用C:\Windows\SysWOW64\WindowsPowerShell\v1.0\路径下的32位程序 - 如果必须在32位PowerShell环境下操作64位注册表,需要直接调用.NET的
RegistryKey类方法绕过系统重定向,不要使用HKLM:这类PSDrive快捷路径。
- 操作64位原生注册表路径时,启动
内容的提问来源于stack exchange,提问作者loaded_dypper
相关产品推荐
相关产品推荐

