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

74

我相信这应该很容易,但我遇到了一些麻烦。我有一个自定义操作,它在安装时执行一个不同的(非msi)安装程序。不幸的是,我发现它也会在卸载时执行该安装程序!

我查看了选项,但似乎找不到停止这种情况的方法。如果有人能帮助我,我将不胜感激。

另外,如何设置自定义操作仅在卸载时触发?非常感谢大家的帮助!


5
参考链接:常见的MSI条件速查表 - Stein Åsmul
5个回答

172

在操作上添加一个条件,使其只在安装期间触发,而不是卸载期间触发。

仅在安装期间运行操作

NOT Installed AND NOT PATCH

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

NOT REMOVE

仅在初始安装时运行:

NOT Installed

安装时或选择修复时运行。

NOT Installed OR MaintenanceMode="Modify"

只在卸载时运行操作,请使用以下条件:

REMOVE~="ALL"

仅在升级期间运行操作:

Installed AND NOT REMOVE

1
@Rasa 你说的重新安装模式是什么意思?在MSI术语中并没有这样的概念,你可能要找的是"修复"(而不是移除)。如果你记录下MSI输出,你就可以看到上述条件中各种值将被设置为何种数值,并找出哪个与你的情况相匹配。 - saschabeaumont
1
修改怎么办?仅在功能被卸载时运行操作?仅在安装功能时运行操作?仅在修复功能时运行操作? - Didier A.
非常感谢,它对我帮助很大。我都快疯了...不要移除。 - ertan2002
1
除了我在问题中添加的链接外,这里还有一个直接链接到作弊表PDF的链接。我不能保证,因为我没有亲自测试过这些条件,但它们来自Installshield,所以应该没问题:常见MSI条件 - Stein Åsmul

8

稍作更正:

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

这似乎更为合适,因为属性REMOVE包含正在被卸载的功能。
因此,如果我执行修改以删除一个功能,则REMOVE为true,并且仅在卸载时执行的操作会在修改时执行。
在MSDN上了解更多详情


7

一个例子:

<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 属性。


5

1

在自定义操作上设置一个条件,可能需要匹配的自定义操作来执行卸载。不确定您使用的工具是什么,但假设次要安装与组件相关联,我会使用该组件状态。状态=3表示目标状态已安装。状态=2表示目标状态不存在。请注意,如果没有更改,则不会设置状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接