我想修改MSI安装程序(通过WiX创建)以在卸载时删除整个目录.
我理解WiX中的选项RemoveFile
和RemoveFolder
选项,但是它们不够强大,无法递归删除安装后创建内容的整个文件夹.
我注意到类似的Stack Overflow问题在卸载WiX时删除文件,但我想知道是否可以通过调用批处理脚本删除文件夹来更简单地完成此操作.
这是我第一次使用WiX,而且我仍然掌握了自定义操作.在卸载时运行批处理脚本的自定义操作的基本示例是什么?
编辑:也许看下面的答案.
这个话题长期以来一直令人头疼.我终于弄明白了.网上有一些解决方案,但它们都不起作用.当然没有文件.因此,在下面的图表中,有几个建议使用的属性以及它们对各种安装方案的值:
所以在我的情况下,我想要一个仅在卸载时运行的CA--而不是升级,而不是修复或修改.根据上表我不得不使用
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
它奏效了!
yaluna的答案存在多个问题,属性名称也区分大小写,Installed
拼写正确(INSTALLED
不起作用).上面的表应该是这样的:
假设完全修复和卸载属性的实际值可能是:
该WiX的表达式语法文件说:
在这些表达式中,您可以使用属性名称(请记住它们区分大小写).
Windows Installer指南中记录了这些属性(例如,已安装)
编辑:对第一张表进行小幅修正; 很明显,"卸载"也可能只是REMOVE
存在True
.
您可以使用自定义操作执行此操作.您可以在以下位置为自定义操作添加参考
:
...
Installed AND NOT UPGRADINGPRODUCTCODE
然后,您还必须在以下位置定义您的操作
:
...
FileCleanerEXE是二进制文件(在我的例子中是一个执行自定义操作的小c ++程序),它也定义在
:
...
真正的诀窍是Installed AND NOT UPGRADINGPRODUCTCODE
自定义操作的条件,没有你的操作将在每次升级时运行(因为升级实际上是卸载然后重新安装).如果要删除文件,可能在升级期间不希望出现这种情况.
旁注:我建议使用C++程序之类的东西来执行操作,而不是批处理脚本,因为它提供了电源和控制 - 你可以防止"cmd提示"窗口闪烁而安装程序运行.
批处理脚本的最大问题是在用户单击取消时处理回滚(或者在安装期间出现问题).处理此方案的正确方法是创建一个CustomAction,将临时行添加到RemoveFiles表.这样Windows Installer就可以为您处理回滚情况.当你看到解决方案时,这简直太简单了.
无论如何,要在卸载期间执行操作,请添加一个Condition元素:
REMOVE ~= "ALL"
〜=表示比较不区分大小写(即使我认为ALL总是上限).有关更多信息,请参阅有关条件语法的MSI SDK文档.
PS:从来没有一个案例让我坐下来想:"哦,批处理文件在安装包中是一个很好的解决方案." 实际上,找到一个包含批处理文件的安装包只会鼓励我退回产品以获得退款.
这是我制作的一组属性,使用起来比内置的东西更直观。条件基于ahmd0上面提供的真值表。
"" AND REINSTALL="" AND PREVIOUSVERSIONSINSTALLED<>"" AND REMOVE=""]]> ""]]> "" ]]>
以下是一些示例用法:
NOT _UNINSTALL _INSTALL OR _UPGRADE _UNINSTALL OR _UPGRADE NOT _UNINSTALL NOT _UNINSTALL
问题:
UPGRADINGPRODUCTCODE是在RemoveExistingProducts操作期间设置的,因此您之前运行的任何自定义操作都不会知道这是升级https://docs.microsoft.com/zh-cn/windows/desktop/Msi/upgradingproductcode