使用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位注册表层次结构或任何其他方式来查找卸载字符串或触发手动取消安装应用程序。
答案 0 :(得分:2)
Windows中的低级注册表库尝试将所获得的注册表视图与调用它的程序的构建相匹配。这意味着32位二进制文件通常不能看到64位密钥而反之亦然。
有一种解决方法,但它要求您升级到Tcl 8.6,因为它支持可选模式切换,以指定您正在获取的注册表的哪个视图,例如:
registry -64bit keys
修复程序没有被移植到8.5(用户需求不足),不会被移植到8.4,因为它已经过生命终止,现在不受支持。升级。
答案 1 :(得分:0)
好的......以下是诀窍
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]
}
}