VBS RegRead不返回值

时间:2013-08-08 05:38:20

标签: vbscript registry

我有以下代码:

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密钥会返回以下错误:

enter image description here

错误说:未打开注册表阅读。

这里有Test-Key存在的证据:

enter image description here

我做错了什么?我还尝试通过oReg.GetStringValue读取密钥,但这总是返回null。

2 个答案:

答案 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