2

我有以下代码:

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。

4

2 回答 2

2

您的脚本似乎在 32 位兼容的脚本主机中运行,但在 64 位操作系统中运行。由于 32 位应用程序会自动重定向到WOW6432Node64 位操作系统中的注册表区域,因此RegRead方法尝试读取 32 位等效路径,例如

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Test

反而

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test

因此,如果重定向路径不存在,您将按预期收到该错误。

您可能需要强制在 64 位兼容的脚本主机中运行您的脚本,以摆脱这种隐式注册表重定向。

于 2013-08-08T14:02:30.303 回答
0

当我对此进行测试时,即使使用 32 位cscript.exe中的 32 位cmd.exe(进程资源管理器显示两个进程的图像类型为 32 位),我也能够很好地从非 Wow6432Node 路径中读取。

也许这真的很简单?当我创建带有虚假尾随空格的注册表值时,我能够重现您描述的行为:

>>> 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
于 2013-08-08T19:22:54.870 回答