【问题标题】:wix - custom action dialogbox on silent uninstall of applicationwix - 静默卸载应用程序的自定义操作对话框
【发布时间】:2019-05-21 10:33:33
【问题描述】:

我正在尝试以静默方式卸载带有以下标志的 Windows 应用程序:/quiet 和 /uninstall,但安装程序当前不抑制 CustomAction 对话框。当对话框出现时,用户需要确认(通过按是按钮)以删除所有程序生成的数据。

有没有办法告诉卸载程序在安静模式下单击“是”?

以下是当前的 wix 代码。

<!-- Remove app data custom action -->
<CustomAction Id="SetPathToRemove" Property="ShowRemoveFilesDialog" Value="[ApplicationAppDataDir]" />
<CustomAction Id="ShowRemoveFilesDialog" BinaryKey='CustomActionsBinary' DllEntry='ShowDialogRemoveFiles'
              Execute='deferred' Return='ignore' Impersonate='no'/>

【问题讨论】:

  • 你需要清理多少个实例?

标签: wix windows-installer


【解决方案1】:

交叉链接Similar answershort version。还有年长者:I screwed up, how can I uninstall my program?


抑制对话框:如果该对话框在没有适当条件的情况下显示,则不,您不能完全抑制它,但有很多解决方法。

“修复”:对于失败或卡住的卸载,有一些不同程度“疯狂”的“修复”(通常针对自定义操作导致卸载以回滚并且无法完成 - 无法前进或后退的 catch 22 情况):

  • 1) MS FixIt:有一个 Microsoft FixIt tool 有时可以让您摆脱卡住的安装(不确定是不是 适用于来自自定义操作的对话框)。如果你有,先试试这个 一个或几个实例。
  • 2) 次要升级/补丁Patch the existing installation with a minor upgrade(首选方法)-Chris Painter's answer。这也可以“大规模”用于修复损坏的 MSI 卸载序列,然后可以在所有机器上调用该序列。 如果您愿意,真正的解决方案(一旦问题大规模出现,许多机器受到影响)。 There are some challenges in logistics.

  • 3) TransformHack apply a transform,然后在卸载期间应用(不推荐 - 过于复杂,容易出错) .

  • 4) Dr.No No:如果情况很少,您可以hack the locally cached MSI database(基本上与通过补丁,只能手动完成。

    • 如果您有少量机器(比如要清理 1-5 台机器),则可以使用。
    • 支持工作 - 并非没有风险!不推荐。
    • And don't delete custom actions! Just add a condition "AND 0" to the offending custom action sequencing - that will stop the custom action from running.
  • 5) Lunacy:有些人使用“陌生海岸”的工具 - 例如 AutoIt,它模拟击键以消除卡住的对话框。根本不够大规模,但可能适用于较小的场景。不建议。试试这些工具来对付安全软件!不好了! (任何事情都可能发生,它会破裂 - 只是时间问题)。

条件:您不应该显示来自按 InstallExecuteSequence 排序的自定义操作的对话框,尽管您可以使用控制它的显示UILevel property。您可以使用上述方法 1-3 将此类条件添加到 MSI。 (NOT UILevel = 2可以试试,2级完全静音运行)


抑制失败的自定义操作:当由于失败的自定义操作(而不是 rouge 对话框)而阻止卸载时,您可以求助于“接种方法”。您可以更新您的包,以便能够通过将特定属性设置为标志的命令行开关来抑制自定义操作:

msiexec.exe /x {PRODUCT-GUID} SUPPRESSERROR="1"

See this WiX sample,或下面的模型(略有不同,但概念相同):

添加条件

关于如何将条件自定义操作添加到 InstallExecuteSequence 的快速模型:

<Property Id="FLAG" Value="1"/>

<..>

<CustomAction Id='Something' Property='INSTALLFOLDER'
              Value='[CMDLINE_INSTALLFOLDER]' Execute='firstSequence' />

<..>

<InstallExecuteSequence>
   <Custom Action='Something' Before='AppSearch'>NOT Installed AND FLAG</Custom>
</InstallExecuteSequence>

使用这种方法,可以通过调用这种自定义的 msiexec.exe 命令来禁止运行所有自定义操作。因此,可以抑制卸载或升级期间有问题的自定义操作。这只是卸载某些东西的“紧急方法”。

我想我应该设置条件 NOT Installed AND FLAG="1"。没有测试,留下什么。

这是一个类似的先前答案:Suppress custom actions on uninstall


一些相似或相关的答案

【讨论】:

  • 安装序列的当前条件是:REMOVE OR UPGRADINGPRODUCTCODE
  • 我读到我应该将条件更改为 REMOVE="ALL"。
  • 这是您正在做的设置还是您试图摆脱的设置?要清理多少个实例?
  • 这是我试图通过 Jenkins(自动构建服务器)自动化的项目的设置。流程如下:签出代码 -> 设置环境 -> 构建项目/运行单元测试 -> 安装应用程序 -> 运行功能测试 -> 卸载应用程序。目前,我无法通过 Jenkins 自动卸载应用程序,因为它卡在自定义对话框中。 wix 安装程序当前未使用 UILevels。我认为使用 UILevels 是正确的解决方案,但它是否像在 CustomAction 属性中设置 UILevel 值一样简单?感谢您的帮助!
  • 原则上设置UILevel condition 是可行的,但我根本不喜欢InstallExecuteSequence 的这种GUI 方法。此自定义操作是否需要提升权限?功能真的需要吗? (清理/删除自定义操作的潜在错误令人恐惧)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多