【问题标题】:MSI Install Fails because "Another version of this product is already installed"MSI 安装失败,因为“已安装此产品的另一个版本”
【发布时间】:2010-10-19 17:13:45
【问题描述】:

我们使用带有以下命令行选项的 MSIEXEC 安装应用程序 (MSI):

MsiExec.exe /x{code} /qn /liwearucmopvx+ C:\Log\UnInstall.tra
MsiExec.exe /iC:\Source\App.msi /qn TARGETDIR=C:\Install ALLUSERS=1 /liwearucmopvx+ %C:\Log\Install.tra

大多数情况下这都有效,但有时卸载会失败(尚不知道为什么,请查看错误)。无论如何,当这种情况发生时,我在重新安装期间收到以下错误:

Another version of this product is already installed.  Installation of this version cannot continue.  To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel

有没有办法绕过这个?意思是确保我们总是重新安装(如果它存在,我们可以简单地自动将它吹走?)

【问题讨论】:

  • 您正在制作 MsiExec 程序吗?或者这个问题属于其他地方;-)
  • 不确定您所说的“使其成为程序”是什么意思?
  • stackoverflow 顾名思义(也许)是一个程序员网站,AFAIK。
  • 这是一个合法的问题。添加msiinstaller 标签以获得更多关注。至于错误:当我尝试安装具有相同主要、次要和修订版本的安装项目(MSI)时,我得到了同样的错误。如果新安装程序的版本更高,则 MSI 会为我们正确安装。
  • 一旦你整理了产品启发式,那么你需要考虑在哪里安排 RemoveExistingProducts。如果您的文件版本号在不同版本之间没有变化,请尽早安排 REP 以“卸载然后重新安装”,但请注意不要破坏您可能需要在升级过程中保留的任何本地状态...

标签: installation windows-installer


【解决方案1】:

查看MSDN Documentation on the Upgrade Table,基本上你需要设置msidbUpgradeAttributesVersionMaxInclusive位。

您没有说明您使用什么来构建安装程序,如果您使用 WiX 3.5 或更高版本,您可以使用 MajorUpgrade/@AllowSameVersionUpgrades="yes" 为您处理此问题。

请注意,由于 MSI 忽略 第四个产品版本字段,设置 此属性为 yes 也允许 前三个降级时 产品版本字段相同。 例如,产品版本 1.0.0.1 将“升级” 1.0.0.2998 因为 它们被视为相同的版本 (1.0.0)。这可能会重新引入 严重的错误,所以最安全的选择是 改变前三个版本 字段并省略此属性以获取 没有的默认值。

请注意,下面的 VBScript 将通过搜索已安装产品的列表并查找包代码本身。

Option Explicit
Dim productName, productCode, installer 
productName = "My Application"

Set installer = Wscript.CreateObject("WindowsInstaller.Installer")

For Each productCode In installer.Products
    If InStr(1, LCase(installer.ProductInfo(productCode, "ProductName")), LCase(productName)) Then Exit For
Next

If Not IsEmpty(productCode) Then    
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("msiexec /x " & productCode & " /qb /l*v ""%temp%\UninstallApp.log"" ")
End If

【讨论】:

  • 此设置使我的测试安装程序能够自行修复,因此我可以成功卸载它。
【解决方案2】:

这个问题比较老,但是现有的答案缺少问题和解决方案的本质,而对其他场景很有用:

  1. 如果卸载失败,说明你有一个严重的问题,没有比分析这个更好的方法了 - 否则你以后可能会遇到更多麻烦

  2. 至少,我会编写一个小脚本/程序,它使用卸载的返回值,或者更强大的测试,如果 MSI 仍然安装 - 在您尝试安装新的 MSI 之前。
    如果对此感兴趣,我会提供更多信息,但在其他问题中已经有关于 SO 的信息。

  3. 其他一些答案建议您应该使用主要升级(在这种情况下,每个新构建都可以/应该是正确的主要升级,至少作为建议)。这是一个很好的建议,但如果卸载“有时”失败,则无济于事。 此外,重要的是要说明,您提到的错误通常表明您尚未使用主要升级。 如果您确实有卸载问题,那么重大升级可能会增加问题,因为取决于配置,它可以第二次安装产品​​ MSI 并且您有两个 MSI 参考,这仍然是一个产品你。更多的细节会导致太过分。请记住,在进一步的更新步骤之前,必须确保(始终)有效的卸载或至少对此进行测试。

  4. saschabeaumont 的脚本非常短而优美。它所做的是确保您确实使用了正确的 ProductCode。主要需求是,因为它每次都必须改变,你产生一个重大升级...... 在您的情况下:这只解决了一种情况,为什么您的卸载可能会失败......

【讨论】:

    【解决方案3】:

    如果卸载失败,产品仍将在系统上注册 - 取决于失败发生的位置,卸载将回滚,使产品仍处于安装状态。

    如果您尝试在现有安装的基础上重新安装具有相同产品代码但不同版本的产品,MSI 将正确地抱怨该产品仍在安装。如果要实现升级行为,则需要更改产品代码并将条目写入升级表,以便 MSI 可以区分新旧产品,并在更新版本之前或之后使用 RemoveExistingProducts 操作删除旧产品放下。

    如果您想了解卸载失败的原因,您需要查看日志,通常查找“返回值 3”,这是安装失败操作的签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 2014-08-18
      相关资源
      最近更新 更多