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

Tcl:无法在64位计算机上读取32位注册表层次结构的变量,tcl,Tcl,使用tcl8.4 尝试使用以下命令在64位计算机上查询32位注册表层次结构的注册表项时: (用户)9%注册表项{HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall}* 它从层次结构HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall中检索密钥,而不是从HKEY\U LOCAL\U

使用tcl8.4

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

(用户)9%注册表项{HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall}*

它从层次结构HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall中检索密钥,而不是从HKEY\U LOCAL\U 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外壳运行相同的命令时,它返回了正确的注册表项

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

这里的主要目的是为应用程序中存储在卸载层次结构下的特定key-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]
这将在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]
          }
       }

是否有一个用shell脚本编写的批处理代码可以从Tcl执行,以恢复32位注册表层次结构