【发布时间】:2011-09-13 20:47:55
【问题描述】:
我们产品的现有安装程序不会将任何信息写入注册表,也不会写入任何自定义环境变量。允许用户在安装程序的 UI 中更改安装目录。升级时,如何查看上一个版本安装到哪个文件夹?
我需要知道文件夹,这样我才能找到以前的配置文件并从中复制值。新版本的配置文件有新的标签和新的结构,所以我不能只保留以前的文件并重复使用它。
托尼
【问题讨论】:
标签: wix
我们产品的现有安装程序不会将任何信息写入注册表,也不会写入任何自定义环境变量。允许用户在安装程序的 UI 中更改安装目录。升级时,如何查看上一个版本安装到哪个文件夹?
我需要知道文件夹,这样我才能找到以前的配置文件并从中复制值。新版本的配置文件有新的标签和新的结构,所以我不能只保留以前的文件并重复使用它。
托尼
【问题讨论】:
标签: wix
MSI 没有直接的信息。 (MSI 包可以有多个“根”目录,因此不知道开发人员可能需要哪一个。)如果您在注册表中有目录,请使用RegistrySearch。否则,您可以在自定义操作中使用MsiGetComponentPath。
【讨论】:
我对此进行了一些研究,这是我想出的解决方案:
安装程序完成安装后,它会在注册表中的路径下创建一个节点
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID>
在 32 位操作系统上安装 32 位或在 64 位操作系统上安装 64 位,或
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID>
在 64 位操作系统上安装 32 位。
此节点包含一个名为 InstallLocation 的值,它为您提供了安装可执行文件的路径。
很遗憾,我们的安装程序之前的版本没有设置这个属性,所以我不能使用它。但是我们的安装程序创建了一个服务。我在该服务的注册表中找到了节点的路径。从那里,我可以检索 ImagePath 值的值并从服务的 .EXE 文件名中提取路径。
所以我的解决方案是:
托尼
【讨论】:
msiexec 保留上次安装的 msi 副本,因此它将处理卸载以前的版本,您只需包含 InstallExecuteSequence 部分
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallValidate" />
</InstallExecuteSequence>
仅当您在产品元素中使用相同的 UpgradeCode 属性时,这才有效。
祝你好运!
【讨论】: