我有以下代码:
Dim objShell,failing_path,working_path
failing_path = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test"
working_path = "HKEY_LOCAL_MACHINE\SOFTWARE\7-zip\Path"
Set objShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "Working: " & objShell.RegRead(working_path)
WScript.Echo "Not Working: " & objShell.RegRead(failing_path)
执行时,我将从7-zip Registrykey
获取路径,但Test
密钥会返回以下错误:
错误说:未打开注册表阅读。
这里有Test-Key存在的证据:
我做错了什么?我还尝试通过oReg.GetStringValue
读取密钥,但这总是返回null。
答案 0 :(得分:2)
您的脚本似乎在32位兼容的脚本主机中运行,但在64位操作系统中运行。
由于32位应用程序会自动重定向到64位操作系统中注册表的WOW6432Node
区域,RegRead
方法会尝试读取32位等效路径,如
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Test
而不是
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test
因此,如果重定向的路径不存在,则会按预期收到该错误。
您可能需要强制在64位兼容的脚本主机中运行脚本,以摆脱这种隐式注册表重定向。
答案 1 :(得分:0)
当我测试这个时,我能够很好地读取非Wow6432Node路径,即使使用32位cscript.exe
中的32位cmd.exe
(Process Explorer显示图像类型32)两个过程的比特)。
也许这真的很简单?当我使用虚假尾随空间创建注册表值时,我能够重现您描述的行为:
>>> key = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
>>> WScript.Echo sh.RegRead(key & "Test")
Unable to open registry key "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\
Uninstall\Test" for reading. (0x80070002)
>>> WScript.Echo sh.RegRead(key & "Test ")
asd