如何仅在安装(而非卸载)中执行自定义操作


73

我敢肯定这很容易,但是我在这方面遇到了一些困难。我有一个自定义操作,该操作在安装时执行不同的(非msi)安装程序。不幸的是,我注意到它还在UNinstallation上执行安装程序!

我已经仔细研究了这些选项,但似乎无法找出阻止方法。如果有人能帮助我,我将非常感激。

另外,如何将自定义操作设置为仅在卸载期间才能执行?任何帮助都非常感谢你们!


Answers:


168

在操作上添加一个条件,以便仅在安装过程中触发该条件,而不是在卸载过程中触发该条件。

操作仅在安装期间运行

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 2012年

1
修改呢?仅在卸载功能后才执行操作?仅在安装功能时才执行操作?仅在修复功能后才执行操作?
Didier A.

非常感谢,这对我有很大帮助。我
快要

1
除了我添加到问题的链接之外,这是备忘单PDF的直接链接。不能保证,我没有亲自测试这些条件,但是它们来自Installshield,因此应该可以:常见MSI条件
SteinÅsmul'17

7

一点修正:

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

这似乎更合适,因为该属性REMOVE包含要卸载的功能。
因此,如果我进行修改以删除一项功能,REMOVE则为true,并且仅在卸载时执行的操作将在修改时执行。
在MSDN上的更多详细信息


6

一个例子:

<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>我感到困惑,因为“自定义”后跟“操作”属性



1

自定义操作的条件,可能带有匹配的自定义操作以执行卸载。不知道您使用的是什么工具,但是假设辅助安装与组件相关联,我将使用该组件状态。状态= 3表示目标安装状态。状态= 2表示目标状态不存在。请注意,如果没有更改,则不会设置状态。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.