首页 文章

删除包中的MSI包而不包括源

提问于
浏览
1

我有一个包含4个MsiPackages的WIX Bootstrapper Burn软件包,已经在 生产环境 中发布 . 我们最新版本的软件包不再发布其中一个软件包,如果存在,应该卸载软件包 . 在不提供捆绑包中的整个msi的情况下卸载MsiPackage的最佳方法是什么?

我试过了:

  • 完全从链中删除PackageGroup - 这使产品落后 .

  • 添加MsiPackage并将installlevel设置为0 - 这需要非常大的有效负载,因为要删除的msi很大 .

我也尝试使用产品搜索来查找状态

<util:ProductSearch Id="AppX" UpgradeCode="XXXXXX-XXXX-XXXX-XXXX-XXXXXXXX" Result="state" Variable="APPXSTATE" />

但试图将它连接到一个ExePackage来运行msiexec / x UpgradeCode,但我认为这是错误的卸载方式 .

如果在这个较新的刻录安装程序中存在,使用UpgradeCode X清除msi的最佳方法是什么?

谢谢

1 回答

  • 2

    注意:我不知道与util:ProductSearch合作使用的任何自动魔术构造来卸载现有的MSI安装 .

    Upgrade Table :我假设这四种不同的产品有 different upgrade codes "per family"?如果是这样 - 如果你是肯定的,它永远不需要再次安装 - 那么我想你可以指定它应该通过对你将继续提供的一个或多个软件包的主要升级来卸载 . Note :即使所有设置共享相同的升级代码,也可以卸载,但这需要更多的关注和测试 .

    此解决方案涉及将要删除的MSI的升级代码添加到要保留的MSI设置的升级表中,并指定将卸载所有"known prior editions"的版本范围 . 有关如何执行此操作的技术详细信息,请访问: Adding entries to MSI UpgradeTable to remove related products . 如上所述,对于剩下的产品之一就足够了,但是你可以为所有产品做到这一点 . 如果已卸载产品,则不会出现错误 . 我可能希望设置比目标版本的技术示例中显示的更紧密的范围 .

    ExePackage :应该可以使用 ExePackage 代替您的建议进行卸载 . 它可以直接运行 msiexec.exe ,或者可能启动VBScript,Powershell脚本甚至是批处理文件或您自己的从C或C#编译的EXE文件(后者有不幸的运行时要求) . 我从未尝试过这种方法 .

    请注意,您不会以您使用 msiexec.exe /x UpgradeCode 的方式卸载升级代码 - 至少我从来没有能够完成这项工作(暂时没有测试) . 相反,您需要通过 product codeHow can I find the product GUID of an installed MSI setup?)卸载,或者您可以使用 Installer.RelatedProducts 函数使用VBScript和 MSI API 自动卸载,然后按照此处所示启动卸载:Powershell: Uninstall application by UpgradeCode . 这类似于Windows Installer处理升级表时发生的情况 . 所有相关产品 - 共享相同升级代码的产品 - 都会被枚举,您可以在执行此操作时处理它们 .


    Some Links

相关问题