【问题标题】:How can I suppress "this action is only valid for products that are currently installed" upon running msiexec /x to non-existing item?在对不存在的项目运行 msiexec /x 时,如何抑制“此操作仅对当前安装的产品有效”?
【发布时间】:2021-02-10 07:05:16
【问题描述】:

我正在尝试在安装较新版本之前确保某些软件不存在。长话短说,vendor requires me to do so,尽管他们建议我在安装后进行修复,但这会导致其他问题,例如不需要的重启(相信我,我尝试过 /norestart,我什至有tried to modify the stored msi package 以确保它不会重启)但结束了这一切只是让我们非常头疼,却没有得到我们想要的结果。

所以我尝试在安装他们的新软件之前简单地卸载这个软件,因为这似乎有更高的成功率而没有不必要的问题。

现在我通过使用 Vital="no" 通过 ExePackage(使用 WiX 工具集)运行批处理文件来完成此操作。我必须这样做 Vital="no" 因为当旧的安装程序不存在并且如果我调用 msiexec /x 时,它会返回错误说明

此操作仅对当前安装的产品有效

当旧安装存在时,它可以正常工作,但当它不存在时,它会出错。

现在 Vital="no" 可以正常工作,但如果可以的话,我更愿意使用 msiexec /x 抑制错误。

有什么方法可以解决这个问题吗?

【问题讨论】:

  • 请看下面我的回答。直到现在我才看到这个问题。希望这不会造成混淆而不是帮助。

标签: installation windows-installer wix3 wix3.11


【解决方案1】:

为了解决这个问题,我检查了卸载密钥,只在列出的产品上调用了msiexec /x。虽然在我自己的情况下,我们正在切换安装程序技术(太多的 MSI 错误......)并且正在卸载我们自己的旧版本。

【讨论】:

  • 您是如何检查该项目的存在的?通过查看注册表,例如 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\?
  • @ShinT 是的,就是这样。
【解决方案2】:

安装状态:如果您知道产品的 GUID(在此处替换示例 GUID),则可以使用 VBScript 检查产品的安装状态:

Dim installer : Set installer = CreateObject("WindowsInstaller.Installer")
MsgBox installer.ProductState("{6C961B30-A670-8A05-3BFE-3947E84DD4E4}")

有多种可能的安装状态。 Here is a more comprehensive script 检查产品安装状态。 Check section 7 here.

重大升级:我假设您知道重大升级的工作原理? (卸载现有安装并安装较新版本,并选择发生这种情况的顺序)。他们实际上可以通过其升级表中的设置卸载任何其他安装时的 MSI 软件包。这甚至包括有竞争力的产品(不得不说有点疯狂)。您可以 - 但是 - 不能从 MSI 中轻松地再次安装它们以获取 technical issues 的数量。您可以通过 Burn setup.exe 引导程序(我认为您使用)安装它们。

【讨论】:

  • 嗨 Stein,很遗憾,大升级不是一个选项。仅通过主要升级(在这种情况下从 SP19 到 SP26),从他们的 wiki 中引用“如果最终用户使用从 SP25 或以前版本的就地升级,升级后,他们必须在控制面板/程序中修复安装。否则ADO.Net 数据库连接将不起作用。”这需要我们在旅途中进行修复,但这给了我们太多的支持电话,所以我决定卸载它们。
  • 这是水晶报表?有时您可以通过重大升级提前卸载它们,以便清理干净并重新安装,但也有例外(例如降级文件和其他怪癖)。
  • 是的,卸载然后升级效果更好。只需要知道所有单独版本的指南。但是,他们不分发旧版本的安装程序,所以我只能支持 SP10 和 SP19,但至少涵盖了这一点,这样很好。
  • 检查它们是否共享相同的升级代码?然后您可以将它们识别为“相关产品”并一一卸载它们吗?请参阅以下答案:Uninstall approchesUninstall with Powershell(您调用 installer.RelatedProducts 会生成相关产品代码列表)。
  • 不错的选择。但是,如果用户拥有它们,它不会提供卸载未来版本的能力吗?由于未来版本的产品 G​​UID 尚不存在(但假设升级 GUID 相同),我可能希望避免这种情况。而且由于产品代码未知,我无法参考注册表的版本号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2019-09-22
  • 2011-07-16
  • 1970-01-01
  • 2021-11-22
  • 2021-12-10
相关资源
最近更新 更多