运行 如何在静默模式下 运行 运行 MSI 安装程序时自定义操作

How to run custom actions while running the MSI installer in silent mode

我使用 Installshield 2014 创建了一个 MSI 安装程序。虽然 运行 从 UI 中安装它,但一切正常,但是当我 运行 使用下面的命令在静默模式下安装它时,我的自定义操作根本没有触发:

C:\>msiexec /i "myApplication.msi" /qn WEBURL=http://localhost/mywebapp /log  out.txt

WEBURL 是自定义操作需要的 属性。 WEBURL 的值作为参数传递给 C# class 库方法。 C# 方法由我的自定义操作调用,当我在开始安装向导步骤中单击“安装”按钮时调用该操作。我的自定义操作始终执行,即我将自定义操作的执行条件保持为 1,这意味着它在所有情况下都会执行。

在日志文件中,我还看到 WEBURL 属性 的值已正确设置。 运行在静默模式下安装安装程序时,我无法了解是什么阻止了我的自定义操作触发?

更新:正如 Michael 所建议的,将自定义操作放入 InstallExecuteSequence 后,它开始以静默模式执行。但现在的问题是它开始在 UI 模式下执行两次,因为已经通过单击 InstallUISequence 期间出现的对话框之一的按钮执行了相同的操作。所以我想通过将它放入 InstallExecuteSequence 来执行我的自定义操作,只有当我 运行 以静默模式安装安装程序时(这样它只在我处于 UI 时执行一次模式)。

当您 运行 和 /qn 时,不会显示向导。甚至整个 InstallUISequence 都被跳过了。因此,如果您希望您的操作始终 运行,则不应仅通过单击按钮来调用它。当按钮不显示时,无法点击。

而是在 InstallExecuteSequence 中找到一个位置来安排它。 (如果您没有其他要求,您可能仍希望在 CostFinalize 之后的某个时间安排它以反映 non-silent 情况。)无论您是否有 UI,此安排都会 运行 操作。

但是,它也 运行 是安装还是卸载,因此请更改您的条件或您的操作以将其考虑在内。最简单的方法可能是检查 Installed 属性 是否设置;更强大的检查可能会验证相关组件的安装和操作状态。如果您需要在添加或删除功能的维护场景中有条件地执行某些操作,则后者可能是必需的。

既然你在 UI 期间提到你也需要它 运行,你必须采取额外的步骤。您可以设置 msidbCustomActionTypeFirstSequence 计划选项,如下所示。

或者您可能必须检测场景,例如通过检查区分两者的 UILevel, or by setting and checking your own property when your action runs. You may also need to split it into multiple entry points so you can tell UI from immediate Execute; there does not appear to be a RunMode。 (我是不是忘记设置了一个 属性?)