Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何添加仅在卸载(通过MSI)时发生的WiX自定义操作?_Wix_Windows Installer_Custom Action - Fatal编程技术网

如何添加仅在卸载(通过MSI)时发生的WiX自定义操作?

如何添加仅在卸载(通过MSI)时发生的WiX自定义操作?,wix,windows-installer,custom-action,Wix,Windows Installer,Custom Action,我想修改MSI安装程序(通过创建),以便在卸载时删除整个目录 我了解WiX中的RemoveFile和RemoveFolder选项,但这些选项不足以递归删除安装后创建内容的整个文件夹 我注意到了类似的堆栈溢出问题,但我想知道是否可以更简单地通过调用批处理脚本来删除文件夹 这是我第一次使用WiX,我仍然掌握着使用WiX的窍门。卸载时运行批处理脚本的自定义操作的基本示例是什么?您可以使用自定义操作执行此操作。您可以在下向自定义操作添加引用: ... 已安装但未升级ProductCode 然后,您还

我想修改MSI安装程序(通过创建),以便在卸载时删除整个目录

我了解WiX中的
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操作期间设置的,因此之前运行的任何自定义操作都不会知道这是升级

该图表中的值是否正确?为什么需要添加REMOVE=“ALL”?NOT UPGRADINGPRODUCTCODE仅适用于卸载(根据图表),因此(NOT UPGRADINGPRODUCTCODE)和(REMOVE=“ALL”)也仅适用于卸载。REMOVE=“ALL”似乎没有必要。我同意@ToddRopog-示例和真值表似乎不一致。这真的正确吗?真值表有点错误。不升级ProductCode对于首次安装也是正确的常见条件:请确认:已安装和已安装是不同的,只有已安装由Windows Installer设置。我认为那是行不通的。但这不是一个公认的答案。欢迎来到安装者的世界!:)这真的不管用。如果要执行安装在您自己的安装文件夹中的fileCleaner.exe,这将是一个鸡毛蒜皮的问题:
CustomAction
将在“InstallFinalize”之后执行。此时,将从安装文件夹中删除所有文件。还有fileCleaner.exe。因此,您无法通过CustomAction执行它。这个答案很简单