Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
卸载软件时,Windows如何查找安装位置_Windows_Installation_Uninstallation_Windows Installer - Fatal编程技术网

卸载软件时,Windows如何查找安装位置

卸载软件时,Windows如何查找安装位置,windows,installation,uninstallation,windows-installer,Windows,Installation,Uninstallation,Windows Installer,当我运行允许自定义安装位置/路径的安装程序时,文件将正确放置在我选择的位置 当我运行相同的MSI并选择删除(或从添加/删除程序卸载)时,它如何知道安装位置以便删除正确的文件 我原以为它会存储在“Computer\HKEY\u LOCAL\u MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall{GUID}”中,但当我查看已安装软件的位置时,“InstallLocation” 然而,无论我如何卸载它,它都知道要删除哪个文件夹,无论我

当我运行允许自定义安装位置/路径的安装程序时,文件将正确放置在我选择的位置

当我运行相同的MSI并选择删除(或从添加/删除程序卸载)时,它如何知道安装位置以便删除正确的文件

我原以为它会存储在“Computer\HKEY\u LOCAL\u MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall{GUID}”中,但当我查看已安装软件的位置时,“InstallLocation”


然而,无论我如何卸载它,它都知道要删除哪个文件夹,无论我把它放在哪里。这些信息是存储在注册表的其他地方,还是存储在MSI文件本身中?

这是一个非常复杂的问题,因为MSI可以配置为将其卸载文件放在您告诉它的任何地方。通常默认情况下,它会在C:\Windows\Installer中创建一个具有特定名称的卸载.msi文件

但不要依赖于此目录中的uninstall.msi,也不要依赖于uninstall注册表项中存在卸载路径。这个关键点和其他任何东西一样,都是为了方便最终用户

卸载信息通常包含在MSI文件中,但不必包含在MSI文件中,在安装过程中,它可以创建密钥来帮助升级和卸载。安装将在注册表中留下的信息完全取决于您如何配置.msi数据库

再加上一些东西。。。许多安装程序,如Nullsoft、InstallAware和InstallShield,喜欢自己动手,并将卸载信息放在其他地方。因此InstallShield喜欢创建InstallShield安装信息文件夹,而Nullsoft喜欢创建.dat文件和uninstall.exe。但除此之外,这些安装程序仍在调用MSI并创建安装表和数据库。因此,卸载信息的实际位置并不是一门精确的科学

更新:

查找组件的安装位置


实现细节:MSI如何存储这些东西是实现细节,不应干预、试图修改或直接用于任何目的-这一点很清楚。您应该浏览MSI API,它是作为Win32函数实现的,带有互补的COM包装器,以便通过脚本语言进行访问

注册表:MSI数据库主要存储在注册表中,但磁盘上也有一些组件,您可以参考其中一些组件,例如
%SystemDrive%\Windows\Installer
(一个超级隐藏文件夹,不应以任何方式修改)。MSI数据库存储在整个注册表的多个位置:

  • HKCR\Installer
  • HKCU\Software\Microsoft\Installer
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Installer
  • 等。
其中一些是真实的,一些是别名,一些是合并。一切都有点模糊。再次强调:
实施细节
——我们大家都知道的委婉说法是:“现在就放弃,你愿意吗?”:-)。只需应用MSIAPI即可获取所需信息


MSI API:上面有很多内容需要阅读,为了切中要害,请通过MSI API获取有关目录解析的信息。我们所要做的有点奇怪,我们必须为已安装的产品启动一个会话对象,并运行两个标准操作(来自Microsoft的内置MSI操作),以便解析所讨论的MSI的目录表和安装目录()。以下是一个实际示例:

记录在案:

  • (在Orca和其他免费MSI工具上)

  • (卸载MSI软件包的多种方法)

Set installer=CreateObject(“WindowsInstaller.installer”)
'其他测试产品代码:{2F73A7B2-E50E-39A6-9ABC-EF89E4C62E36}
productcode=Trim(InputBox(“请粘贴或键入要查找详细信息的产品代码:”_
“查找产品详细信息(提供的测试GUID):”,“{766AD270-A684-43D6-AF9A-74165C9B5796}”)
如果search=vbCancel或Trim(productcode)=“”,则
WScript.Quit(0)
如果结束
Set session=installer.OpenProduct(productcode)
最重要的是,通过运行“MSI Costing”来解析目录表和属性
session.DoAction(“CostInitialize”)
会议.行动(“成本最终确定”)
'可以是MSI中目录表中的任何目录属性:
MsgBox session.Property(“INSTALLFOLDER”)
'在Orca中打开MSI以查找目录文件夹属性名称

在上插入一个指向旧答案的链接


全部解析:有点忘乎所以,又进行了一次更新,以解析任何已安装软件包的所有目录。下面是一个脚本(没有经过太多测试):

'https://stackoverflow.com/questions/17543132/how-can-i-resolve-msi-paths-in-vbscript
'出现错误时,请继续下一步
设置installer=CreateObject(“WindowsInstaller.installer”)
'其他测试产品代码:{2F73A7B2-E50E-39A6-9ABC-EF89E4C62E36}
常量只读=0
暗DirList
productcode=Trim(InputBox(“请粘贴或键入要查找详细信息的产品代码:”_
“查找产品详细信息(提供的测试GUID):”,“{766AD270-A684-43D6-AF9A-74165C9B5796}”)
如果搜索=vbCancel或Trim(productcode)=“T