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

3

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

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

WEBURL是自定义操作所需的属性。 WEBURL的值作为参数传递给C#类库方法。当我在开始安装向导步骤上单击安装按钮时,我的自定义操作被调用并调用C#方法。我的自定义操作总是执行,即我已将自定义操作的执行条件保留为1,这意味着它在所有情况下执行。

在日志文件中,我还看到WEBURL属性的值正确设置。但是,在静默模式下运行安装程序时,我无法让自定义操作触发,不知道是什么原因?

更新:根据Michael的建议,将自定义操作放入InstallExecuteSequence中后,它开始在静默模式下执行。但现在的问题是,当我通过一个对话框上的按钮单击执行相同的操作时,它会在UI模式下执行两次,因为相同的操作已经在InstallUISequence中执行。因此,我想在只有在静默模式下运行安装程序时才将自定义操作放入InstallExecuteSequence中(以便在UI模式下只执行一次)。

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1
当您使用/qn运行时,向导不会显示。甚至整个 InstallUISequence也将被跳过。因此,如果您希望您的操作始终运行,则不应仅从按钮单击调用它。当按钮未显示时,无法单击它。 相反,请在 InstallExecuteSequence中找到一个位置来安排它。(如果您没有其他要求,您可能仍然希望在CostFinalize之后的某个时间安排它以反映非静默情况。)这种调度将在有或没有用户界面的情况下运行该操作。 但是,它也会在安装或卸载时运行它,因此需要更改您的条件或操作以考虑该问题。最简单的方法是检查是否设置了Installed属性;如果需要在添加或删除功能的维护场景中有条件地执行某些操作,则更强大的检查可能会验证相关组件的安装和操作状态。

既然您提到还需要在UI期间运行,那么您需要采取额外的步骤。您可以按照下面所示设置msidbCustomActionTypeFirstSequence调度选项。

enter image description here

或者您可能需要检测场景,例如通过检查UILevel,或在运行操作时设置和检查自己的属性。您可能还需要将其拆分为多个入口点,以便您可以区分UI和立即执行;似乎没有RunMode来区分这两者。(我是否忘记了某个设置的属性?)

如果我将我的自定义操作放在InstallExecute序列中,那么它将在UI和静默模式下运行。在UI模式下,它会运行两次,一次来自UI对话框之一,另一次来自InstallExecute序列。我不能从UI对话框中删除它,因为我可能需要根据某些UI检查在那里多次运行它。如何确保即使我在InstallExecute序列中添加自定义操作,它也仅在静默模式下触发。 - RBT
@RBT:我更新了我的答案,讨论了FirstSequence和UILevel作为仅在一个序列中执行的选项。 - Michael Urman
自定义操作调度选项对我很有帮助。我的所有自定义操作都被安排为“始终执行”。当我将其更改为“仅执行一次”时,它开始按照我的期望工作。我相信UILevel也可能与我的情况相关,但我们的安装程序仅支持两种模式INSTALLUILEVEL_FULLINSTALLUILEVEL_NONE。如果我需要在执行自定义操作时控制级别,我会使用它。我还添加了一个屏幕截图来展示我的执行调度更改,这将有助于读者。感谢您的跟进。 - RBT

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