Tcl:无法在 64 位机器上读取 32 位注册表层次结构的变量

Tcl: Unable to read variables of 32 bit registry hierarchy on a 64 bit machine

使用 Tcl 8.4

尝试使用以下命令在 64 位计算机上查询 32 位注册表层次结构的注册表项时:

(用户) 9 % 注册表项 {HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall} *

它从层次结构 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall 而不是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

中检索键

尝试从 system32 命令行执行:

(gjoshi) 11 % {c:\Windows\System32\cmd.exe} {REG QUERY HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall}

却发现如下结果

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
C:\Users\gjoshi>Not enough storage is available to process this command.

在 运行通过 Windows 资源管理器从 c:\Windows\System32\cmd.exe 的手动启动 shell 执行相同的命令时,它返回了正确的注册表项。

所以我尝试为此命令创建一个批处理文件,但是当批处理文件在 tcl 上 运行 时,它仍然只提供来自 32 位注册表的注册表项。

这里的主要目的是获取特定键的值 - 我们的应用程序中的 uninstallString 存储在卸载层次结构下,其名称是 GUID 而不是应用程序名称。我们需要它来触发安装的应用程序构建的卸载。

请告知我是否可以搜索 32 位注册表层次结构或任何其他方式来查找卸载字符串或手动触发应用程序的卸载。

Windows 中的低级注册表库尝试将您获得的注册表视图与调用它的程序的构建相匹配。这意味着 32 位二进制文​​件通常无法看到 64 位密钥,反之亦然

有一个解决方法,但它需要您升级到 Tcl 8.6,因为它支持可选的模式切换来指示您获得的注册表视图,例如:

registry -64bit keys

此修复程序尚未向后移植到 8.5(用户需求不足)并且 不会 向后移植到 8.4,因为它已经过时并且现在不受支持。升级。

好的...接下来就可以了

tcl\> set str [REG QUERY {HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall} /s /reg:64]

这个 returns 64 位机器中的 32 位注册表(虽然符号听起来很奇怪但它有效)。

接下来是带出安装字符串,可以按如下方式完成:

tcl\> foreach {x y} \
        [regexp -inline -all -nocase {\n(HKEY_LOCAL_MACHINE.*?)\nHKEY_LOCAL_MACHINE} $str] {
          if [regexp -nocase MY_APP_NAME_OR_SOME_MATCHING_STRING $y] {
             puts [lindex [regexp -inline {(UninstallString[^\n]*)} $y] 1]
          }
       }