您如何在每次启动时检测已安装的产品版本?

时间:2018-06-26 11:19:11

标签: wix windows-installer wix3.8

实际上,这个问题是为了避免我不会解决的问题

当我安装产品一次并再次使用MSI时,将执行卸载过程。 但是,这不会从注册表中删除残留信息,必须使用“ Windows Installer清理”清理这些残留信息,并且在重新安装时,会发生注册表权限问题。

我看到了Checking for Oldies,但是发现FindRelatedProducts仅在首次安装时执行,也就是说,当我再次安装MSI时,FindRelatedProducts没有执行。

<Upgrade Id='YOURGUID-7349-453F-94F6-BCB5110BA4FD'>
<UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
    Minimum='1.0.1' IncludeMinimum='yes'
    Maximum='1.0.1' IncludeMaximum='yes' />
<UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
    Minimum='1.0.1' IncludeMinimum='no' />
</Upgrade>

<CustomAction Id='AlreadyUpdated' Error='Foobar 1.0 has already been updated to 1.0.1 or newer.' />

<InstallExecuteSequence>
    <Custom Action='AlreadyUpdated'     After='FindRelatedProducts'>SELFFOUND</Custom>
    <Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom>
</InstallExecuteSequence>

所以我想问你们 安装MSI后,每次运行MSI时如何检查?是否安装了相同的版本,如果已经安装了相同的版本,请退出安装过程。

2 个答案:

答案 0 :(得分:0)

再次运行“相同” MSI时,它将进入维护模式,通常只是维修。 Windows甚至不需要使用用于此“安装”的MSI,因为Windows使用原始MSI进行安装,该MSI可能是也可能不是您尝试再次安装的MSI。因此,尚不清楚您所说的“卸载过程”是什么意思,或者您期望运行相同的MSI实际要做什么。

FindRelatedProducts用于重大升级,但这意味着增加ProductVersion并更改ProductCode。运行相同的MSI不会引起重大升级(请参阅WiX MajorUpgrade元素)。

那么,再次运行同一MSI时,您期望发生什么?似乎您没有卸载它,因此它将使用原始MSI文件进入维护模式,因此您无法更改该行为,因为它已嵌入在已安装产品的MSI中。由于您显然没有卸载已安装的产品,因此它不会删除其注册表项。您应该说出这些残留注册表项是什么,以及如果实际上没有卸载产品,为什么要保留这些残留项。

答案 1 :(得分:0)

MSI压缩 :我不确定您到底做了什么-您似乎已经压缩了已安装的MSI-完全不建议这样做。它可能会导致严重的问题-注册表中甚至包括全部MSI数据库损坏。

但是,首先要注意的是:

主要升级元素 :您可以使用更方便的MajorUpgrade Element来代替使用的较旧样式的元素。这是older-Style Upgrade Elements in use。以下是更现代的MajorUpgrade convenience element的示例:

<MajorUpgrade Schedule="afterInstallInitialize" 
              DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
              AllowDowngrades="no" AllowSameVersionUpgrades="no" />

也许尝试使用此元素而不是您正在使用的元素。只需注释掉旧的,然后替换为这个简单的元素即可。如果正确执行此操作,则主要升级应“开箱即用”。确保在Product Element中指定 UpgradeCode 。参见documentation for major upgrades


相关链接:


我没有完全理解您的问题的这一部分 :“ 当我安装产品一次并再次使用MSI时,将执行卸载过程。但是,这不会从注册表中删除残留信息,必须使用“ Windows Installer清理”清理这些残留信息,并且在重新安装时,会发生注册表权限问题”。

  • 快速移动 :您到底做了什么?破坏安装?为什么?您应该能够从Add / Remove programs成功卸载吗?卸载失败了吗?重新安装时出现什么错误消息?
  • 修改/修复 :MSI会自动神奇地检测到它已经安装在同一版本中。然后,您将看到安装程序的“修改/修复”对话框,而不是首次安装对话框。
    • 仅当您双击用于安装的原始MSI文件而不重新构建它们时,才会显示这些修改对话框。或者您从“添加/删除程序”中调用修改。
    • 如果重新构建安装程序,它将至少具有一个新的程序包GUID,然后MSI将检测到新构建的MSI不是已安装的MSI,并显示一条错误消息。现在,您可以从“添加/删除程序”中卸载当前版本。
  • 相关产品 :如果您正确编写了升级表,MSI还将检测是否安装了相关版本。
    • 如果您每次编译都生成一个新产品GUID,则除非您编写升级表,否则您可以在较旧的安装中“并置”或“并排”安装新版本。在这种情况下,旧版本应作为新版本安装的一部分自动卸载。

您需要了解包装代码,产品代码和升级代码。包代码是为每个编译和构建自动生成的。您可以通过在product元素中将其设置为*来设置自动生成的产品代码,也可以对其进行硬编码并根据需要进行更改。定义后,升级代码应保持不变。请谷歌搜索这些不同代码之间的区别-我现在没有时间总结这个解释。