我们使用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
有没有办法绕过这个?这意味着确保我们始终重新安装(如果存在,我们可以简单地自动将其吹走?)
答案 0 :(得分:8)
查看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)。这可能会重新引入 严重的错误,所以最安全的选择是 改变前三个版本 字段并省略此属性以获取 默认值为no。
请注意,不必记住包代码(如果您使用自动生成的包代码与持续集成,真正的痛苦),以下VBScript将通过 name 删除包,方法是搜索已安装产品的列表以及查找包代码本身。
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
答案 1 :(得分:0)
如果卸载失败,产品仍会在系统上注册 - 根据发生故障的位置,卸载将回滚,产品仍然安装。
如果您尝试在现有安装的基础上重新安装具有相同产品代码但版本不同的产品,MSI会正确地抱怨产品仍然安装。如果要实现升级行为,则需要更改产品代码并将条目写入升级表,以便MSI可以区分旧产品和新产品,并使用RemoveExistingProducts操作在较新版本之前或之后删除旧产品放下了。
如果您想了解卸载失败的原因,您需要查看日志,通常会查找“返回值3”,这是失败的安装操作的签名。
答案 2 :(得分:0)
问题相当陈旧,但现有的答案缺少问题和解决方案的本质,而对其他场景有用:
如果卸载失败,则会出现严重问题,并且没有比分析此更好的方法 - ,否则以后可能会遇到更多麻烦。
至少,我会编写一个小脚本/程序,它使用卸载的返回值,或者甚至更强大的测试,如果MSI仍然安装 - 在您尝试安装新的MSI之前。
如果对此有兴趣,我会提供更多信息,如果有兴趣,但在其他问题上已经有关于SO的信息。
其他一些答案建议你应该使用Major Upgrades(在这种情况下,每个新版本都可以/应该是正确的重大升级,至少作为建议)。如果卸载“有时”失败,这是一个很好的建议,但没有帮助。 此外,重要的是要说明,您经常提到的错误,表明您尚未使用主要升级。 如果你真的遇到卸载问题,那么重大升级可能会增加问题,因为依赖于配置,它可以安装第二次MSI产品,你有两个MSI参考,还有一个产品是您。更多细节将导致太多。请记住,在进一步更新步骤之前,必须确保(始终)正在进行卸载或至少进行测试。
来自 saschabeaumont 的剧本非常简短。它正在做的是确保您正在使用正确的ProductCode。主要需求是,因为它必须每次都改变,你产生一个重大升级...... 在您的情况下:这只解决了一个场景,为什么卸载可能失败...