如何添加仅在卸载(通过MSI)时发生的WiX自定义操作?
我想修改MSI安装程序(通过创建),以便在卸载时删除整个目录 我了解WiX中的如何添加仅在卸载(通过MSI)时发生的WiX自定义操作?,wix,windows-installer,custom-action,Wix,Windows Installer,Custom Action,我想修改MSI安装程序(通过创建),以便在卸载时删除整个目录 我了解WiX中的RemoveFile和RemoveFolder选项,但这些选项不足以递归删除安装后创建内容的整个文件夹 我注意到了类似的堆栈溢出问题,但我想知道是否可以更简单地通过调用批处理脚本来删除文件夹 这是我第一次使用WiX,我仍然掌握着使用WiX的窍门。卸载时运行批处理脚本的自定义操作的基本示例是什么?您可以使用自定义操作执行此操作。您可以在下向自定义操作添加引用: ... 已安装但未升级ProductCode 然后,您还
RemoveFile
和RemoveFolder
选项,但这些选项不足以递归删除安装后创建内容的整个文件夹
我注意到了类似的堆栈溢出问题,但我想知道是否可以更简单地通过调用批处理脚本来删除文件夹
这是我第一次使用WiX,我仍然掌握着使用WiX的窍门。卸载时运行批处理脚本的自定义操作的基本示例是什么?您可以使用自定义操作执行此操作。您可以在
下向自定义操作添加引用:
...
已安装但未升级ProductCode
然后,您还必须在
下定义您的操作:
...
< P> > FieleChaneReXe是二进制(在我的例子中是一个C++程序,它执行自定义操作),它也在<代码> <代码>:
...
真正的诀窍是自定义操作上的已安装且未升级ProductCode
条件,而不是每次升级都会运行您的操作(因为升级实际上是卸载,然后重新安装)。如果您正在删除文件,则在升级过程中可能不希望删除这些文件
一个旁注:我建议通过使用C++程序之类的东西来做这个动作,而不是批处理脚本,因为它提供的电源和控制,并且可以防止“CMD提示”。安装程序运行时,窗口不会闪烁。
批处理脚本的最大问题是在用户单击“取消”(或安装过程中出现问题)时处理回滚。处理这种情况的正确方法是创建一个CustomAction,将临时行添加到RemoveFiles表中。这样,Windows安装程序将为您处理回滚情况。当你看到解决方案时,它会变得非常简单 无论如何,要仅在卸载期间执行操作,请添加一个条件元素,其中包含:REMOVE ~= "ALL"
~=表示compare不区分大小写(尽管我认为ALL总是大写)。有关更多信息,请参阅
PS:从未有过这样的情况,我坐下来想,“哦,批处理文件将是安装包中的一个很好的解决方案。”事实上,找到一个包含批处理文件的安装包只会鼓励我退还产品以获得退款。编辑:也许看看答案
这个话题长期以来一直令人头痛。我终于明白了。 网上有一些解决方案,但没有一个真正有效。当然也没有任何文件。 因此,在下表中,有几个建议使用的属性以及它们在各种安装场景中的值: 所以在我的例子中,我想要一个只在卸载时运行的CA,而不是升级、修复或修改。根据上表,我必须使用
(不升级ProductCode)和(REMOVE=“ALL”)
成功了 存在多个问题,而且属性名称区分大小写,
Installed
拼写正确(Installed
不起作用)。
上表应该是这样的:
另外,假设完全修复和卸载,属性的实际值可能为:
文件说:
在这些表达式中,可以使用属性名(请记住它们区分大小写)
属性记录在Windows Installer指南中(例如)
编辑:对第一个表格进行小修正;显然,“卸载”也可以发生在“代码>删除/代码>是<代码>真< /代码>。< /P> < p>我使用C++中单独编码的自定义操作,并使用DLL调用该语法时卸载适当的函数:
使用上述代码块,我能够运行任何在C++中定义的函数,在卸载时。
仅供参考,我的卸载功能有关于清除当前用户数据和注册表项的代码。这里有一组我制作的属性,使用起来比内置的东西更直观。这些条件基于上述ahmd0提供的真值表
<!-- truth table for installer varables (install vs uninstall vs repair vs upgrade) https://stackoverflow.com/a/17608049/1721136 -->
<SetProperty Id="_INSTALL" After="FindRelatedProducts" Value="1"><![CDATA[Installed="" AND PREVIOUSVERSIONSINSTALLED=""]]></SetProperty>
<SetProperty Id="_UNINSTALL" After="FindRelatedProducts" Value="1"><![CDATA[PREVIOUSVERSIONSINSTALLED="" AND REMOVE="ALL"]]></SetProperty>
<SetProperty Id="_CHANGE" After="FindRelatedProducts" Value="1"><![CDATA[Installed<>"" AND REINSTALL="" AND PREVIOUSVERSIONSINSTALLED<>"" AND REMOVE=""]]></SetProperty>
<SetProperty Id="_REPAIR" After="FindRelatedProducts" Value="1"><![CDATA[REINSTALL<>""]]></SetProperty>
<SetProperty Id="_UPGRADE" After="FindRelatedProducts" Value="1"><![CDATA[PREVIOUSVERSIONSINSTALLED<>"" ]]></SetProperty>
“”并重新安装“”和PREVIOUSVERSIONSINSTALLED“”,然后删除=”“]>
""]]>
"" ]]>
下面是一些示例用法:
<Custom Action="CaptureExistingLocalSettingsValues" After="InstallInitialize">NOT _UNINSTALL</Custom>
<Custom Action="GetConfigXmlToPersistFromCmdLineArgs" After="InstallInitialize">_INSTALL OR _UPGRADE</Custom>
<Custom Action="ForgetProperties" Before="InstallFinalize">_UNINSTALL OR _UPGRADE</Custom>
<Custom Action="SetInstallCustomConfigSettingsArgs" Before="InstallCustomConfigSettings">NOT _UNINSTALL</Custom>
<Custom Action="InstallCustomConfigSettings" Before="InstallFinalize">NOT _UNINSTALL</Custom>
NOT\u卸载
_安装或升级
_卸载或升级
不卸载
不卸载
问题:
- UPGRADINGPRODUCTCODE是在RemoveExistingProducts操作期间设置的,因此之前运行的任何自定义操作都不会知道这是升级
CustomAction
将在“InstallFinalize”之后执行。此时,将从安装文件夹中删除所有文件。还有fileCleaner.exe。因此,您无法通过CustomAction执行它。这个答案很简单