如何执行自定义操作只在安装(不卸载)

我知道这很简单,但是我有点难以接受。我有一个自定义操作,它在安装时执行一个不同的(非 msi)安装程序。不幸的是,我注意到它还在卸载时执行安装程序!

我已经看过了所有的选择,但是我似乎找不到阻止这一切的方法。如果有人能帮助我,我会非常感激。

另外,我如何设置一个自定义动作只在卸载期间关闭? 任何帮助是非常感谢的家伙!

79632 次浏览

在操作上添加一个条件,这样它只在安装过程中触发,而不是在卸载过程中触发。

仅在安装期间运行操作

NOT Installed AND NOT PATCH

操作在安装和修复期间运行

NOT REMOVE

仅在初始安装时运行:

NOT Installed

在初始安装或选择修复时运行。

NOT Installed OR MaintenanceMode="Modify"

要在卸载期间仅运行操作,请使用以下条件:

REMOVE~="ALL"

仅在升级期间运行操作:

Installed AND NOT REMOVE

一个关于自定义操作的条件,可能有一个匹配的自定义操作来执行卸载。不确定您使用的是什么工具,但是假设辅助安装与一个组件绑定,我将使用该组件状态。状态 = 3意味着安装的目标状态。状态 = 2意味着不存在的目标状态。请注意,如果没有更改,则不会设置状态。

稍微修正一下:

最后,要在卸载期间仅运行操作,请使用以下条件: REMOVE="ALL"

这似乎更合适,因为属性 REMOVE包含要卸载的特性。
因此,如果我做一个修改删除一个功能,REMOVE是真实的,操作是执行只有在卸载时执行的修改。
更多详情请浏览 MSDN

请小心使用 REMOVE=ALL。在安装验证序列之前它是不可用的。
查看下面的链接了解更多细节:
Http://msdn.microsoft.com/en-us/library/aa371194(v=vs.85).aspx
Http://msdn.microsoft.com/en-us/library/aa368013(v=vs.85).aspx

举个例子:

<InstallExecuteSequence>
..
<Custom Action="QtExecIdOfCA" Before="InstallFinalize">NOT Installed</Custom>
..
</InstallExecuteSequence>


..
..
<CustomAction Id="QtExecIdOfCA" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

注意!条件被添加到 <Custom>标记中,而 没有<CustomAction>混淆了,因为 Custom 后面跟着 Action 属性