使用自定义操作卸载多个产品

2024-04-08

我正在为我们的产品开发基于 WIX 的安装程序,该产品有一个基础产品和许多插件。基础版和插件将作为单独的 MSI 提供。仅当底座可用时才能安装插件。基础和插件在根文件夹下共享公共文件夹树,例如“C:\Program files\MyProduct”。

我正在使用自定义操作来卸载所有依赖插件。但插件无法正常卸载。这是非常随机的。有时三个插件被卸载,有时仅两个插件被卸载。但我可以从“添加/删除程序”中单独卸载插件。

我正在使用以下自定义操作...

<Fragment>
    <CustomAction Id='UninstallP1Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p1.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP2Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p2.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP3Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p3.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP4Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p4.log" Execute='immediate' Return='asyncNoWait' />
    <CustomAction Id='UninstallP4Action' Directory='SystemFolder' ExeCommand="[SystemFolder]MSIExec.exe /X {PRODUCT_CODE_HERE} /qn /l* $(env.windir)\Temp\p4.log" Execute='immediate' Return='asyncNoWait' />

</Fragment>

我在我的产品脚本中调用此 CA,例如...

       <!--Uninstall Plug-ins -->
        <Custom Action='UninstallP1Action' After='InstallFinalize'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP2Action' After='UninstallP1Action'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP3Action' After='UninstallP2Action'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP4Action' After='UninstallP3Action'>(REMOVE="ALL")</Custom>
        <Custom Action='UninstallP5Action' After='UninstallP4Action'>(REMOVE="ALL")</Custom>

我的问题是,

  1. 卸载base时如何彻底卸载所有插件?

  2. 当插件因卸载而丢失时,不会创建任何日志。但是当插件正确卸载时日志创建成功。如何检查这个?

  3. 我知道如何在单个 MSI 中创建功能(针对不同的插件)。但我们的计划是将插件作为单独的 MSI 提供。 WiX 中还有其他可能的方式吗?

任何帮助将非常感激!


卸载base时如何彻底卸载所有插件?

您的卸载自定义操作不会等待返回。因此,他们基本上是一个接一个地启动卸载命令,而不等待每个进程完成。

Windows Installer 不支持同时运行两个InstallExecuteSequences。因此两个卸载进程不能同时运行。由于您同时启动多个卸载进程,其中一些进程会失败。

解决方案是使用 BAT 文件来执行卸载命令。它会等待每个命令完成,然后再启动下一个命令。缺点是卸载完成后,您无法轻松地从目标计算机中删除该 BAT。

当插件因卸载而丢失时,不会创建任何日志。 但是当插件正确卸载时日志创建成功。 如何检查这个?

Windows Installer 自动检测冲突的安装或卸载进程。因此,您的插件卸载在开始写入日志之前就会失败。

我知道如何在单个插件中创建功能(针对不同的插件) 微星。但我们的计划是将插件作为单独的 MSI 提供。任何其他 WiX 中可用的可能方式吗?

并不真地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用自定义操作卸载多个产品 的相关文章

随机推荐

  • Memcache密钥生成策略

    给定函数f1它接收 n 个字符串参数 就运行时性能而言 什么被认为更好 memcache 的随机密钥生成策略 我们的 Memcache 客户端对其获取的密钥进行内部 md5sum 哈希处理 public class MemcacheClie
  • “EXC_BAD_ACCESS:无法恢复先前选择的帧”错误,数组大小?

    我有一个算法来创建埃拉托斯特尼筛并从中提取素数 它允许您输入筛子的最大值 算法会为您提供低于该值的素数并将它们存储在 c 样式数组中 问题 值高达 500 000 时一切正常 但是当我在运行时输入一个大值时 它会在 xcode 中给出以下错
  • Java中如何获取变量名? [复制]

    这个问题在这里已经有答案了 可能的重复 Java反射 如何获取变量的名称 https stackoverflow com questions 744226 java reflection how to get the name of a v
  • 设计模式作为(缺失的)语言功能

    有时人们将设计模式称为缺少的编程语言功能 为了避免关于什么是设计模式的争论 假设我们只考虑原始的 GoF 模式 例如 单例模式在 Scala 中消失了 Scala 使用关键字支持单例对象object 关于这方面的资源很少 特别是设计模式是否
  • 如何使用maven shade插件向jar添加资源

    我的项目结构在 src main 文件夹内有 resources 文件夹 resources 文件夹包含文件server properties 我的pom如下
  • JavaFX 的奇怪 Gluon 项目结构 - Android 移植

    用于将 JavaFX 移植到 Android 的 Gluon 插件 在 Netbeans 8 0 2 中 的 gradle 构建创建了以下目录结构 源码包 Java Android Java 包 桌面 Java 包 iOS Java 包 每
  • 使用 JOLT 转换具有嵌套数组对象的对象数组

    我想将以下输入 JSON 转换为输出 JSON 格式 输入 JSON orderNumber 201904 000000001 items itemPrice 40000 itemQuantity 11 item external id I
  • Oracle 是否有官方文档说我们不应该在新项目中使用 java.util.Date

    我正在公司用 Java 8 编写新项目 我建议使用 Java 8 日期时间 API 但我的一位同事说新的日期时间 API 运行缓慢 这是真的吗 另外我想从 Oracle 获得一些官方文档 其中会提到你不应该使用java util Date在
  • 如何使用 Wt 启动并运行 Restful API

    我有一个基于网络上的教程运行的 Wt 应用程序 我想知道是否有一种优雅的方式使用 Wt 添加一些 Restful API 功能 我有一些可以从当前应用程序公开的资源 但我不想实施任何补丁 如果有人知道如何做到这一点 或者甚至建议一些可以使开
  • PHP:is_file() 和 file_exists() 对同一文件返回不同的结果

    我遇到 file exists 返回 false 而 is file 返回 true 的问题 echo getmygid gid n 501 echo getmyuid uid n 501 echo posix getgid pgid n
  • MySQL 从 3 个表中提取数据 - 连接和最大值

    我有三个 mysql 表 我想从中提取一些信息 这些表是 视频 表示带有分数的视频 标签 包含全局标签列表 VideoTags 在视频和标签之间创建关联 我想要做的是找到每个标签得分最高的视频 有很多具有相同标签的视频 但我的结果集将包含
  • SwiftUI 覆盖阻止列表滚动事件

    我想在 SwiftUI 中的列表顶部放置一个半透明图像叠加层 我试过这样的代码 struct ContentView View var body some View List Text first Text second Text thir
  • Swift 中的无符号字符

    在 Obj C 中 此代码用于将 NSData 转换为 unsigned char unsigned char dataToSentToPrinter unsigned char malloc commandSize 在 Swift 中 u
  • 如何将多个 html 表格导出到 Excel?

    我有一个包含 3 个表的网页 我想将所有 3 个表导出到同一个 Excel 文件 我希望每个表都在自己的工作表中 但将它们全部放在同一张工作表上也可以 经过一番谷歌搜索后 我所看到的只是将一张表导出到一张 Excel 工作表中 var ta
  • 正则表达式匹配大写表达式和单词

    使用 Sublime Text 3 我只想从文本中提取大写单词和表达式 例子 你好世界 这对所有人来说都是阳光明媚的一天 如果我使用查找工具 我可以使用此正则表达式单独提取所有大写单词 b A Z b 结果是 SUNNY 和 DAY 但我想
  • 模型绑定器未拾取表单编码的 Javascript int[]

    昨晚我试图整理一些自 MVC2 以来一直在工作的东西 给定以下课程 public class RouteSaveViewModel public string Title get set public string Comments get
  • 如何将回调转换为 Promise

    我正在使用 play 框架和 Apache Kafka 我有一个 POST 方法 可以向 Kafka 发送消息 Kafka有一个API方法 公共 java util concurrent Future 发送 ProducerRecord 记
  • 颤动错误:每个子项必须恰好布置一次。关于建筑布局

    我正在使用 flutter bloc 我有这样的代码 class Settings extends StatelessWidget final formKey GlobalKey
  • 如何在 javascript 中发送 SOAP 请求,就像在 SoapUI 中一样

    我目前正在开发一个 NodeJS 项目 我需要使用一些soap xml wsdl 问题是无法弄清楚其中任何一个是如何工作的 所以请原谅我的无知 这是我需要的 我有一个 WSDL 站点 我需要从中获取一些答案 我已经弄清楚如何在 SoapUI
  • 使用自定义操作卸载多个产品

    我正在为我们的产品开发基于 WIX 的安装程序 该产品有一个基础产品和许多插件 基础版和插件将作为单独的 MSI 提供 仅当底座可用时才能安装插件 基础和插件在根文件夹下共享公共文件夹树 例如 C Program files MyProdu