我使用Installshield 2014创建了一个MSI安装程序。从UI运行时一切正常但是当我使用下面的命令以静默模式运行它时,我的自定义操作根本没有触发:
C:\>msiexec /i "myApplication.msi" /qn WEBURL=http://localhost/mywebapp /log out.txt
WEBURL
是自定义操作所需的属性。 WEBURL
的值作为参数传递给C#类库方法。 C#方法由我的自定义操作调用,当我在开始安装向导步骤中单击“安装”按钮时,将调用该方法。我的自定义操作总是被执行,即我将执行自定义操作的条件保持为1
,这意味着它在所有情况下都会执行。
在日志文件中,我还看到WEBURL
属性的值已正确设置。我无法了解在静默模式下运行安装程序时停止自定义操作的原因是什么?
更新:正如迈克尔所建议的那样,将自定义操作放入InstallExecuteSequence
后,它开始以静默模式执行。但现在的问题是,它开始在UI模式下执行两次,因为在InstallUISequence
期间出现的一个对话框上点击按钮已经执行了相同的操作。所以我想在我以静默模式运行安装程序时将其放入InstallExecuteSequence
来执行自定义操作(如果我处于UI模式,它只执行一次)。
答案 0 :(得分:1)
使用/qn
运行时,不会显示向导。甚至整个InstallUISequence都会被跳过。因此,如果您希望您的操作始终运行,则不应仅通过单击按钮来调用它。如果没有显示该按钮,则无法单击该按钮。
而是在InstallExecuteSequence中找到一个位置来安排它。 (如果您没有其他要求,您可能仍希望在CostFinalize之后的某个时间安排它以镜像非静默情况。)无论您是否拥有UI,此调度都将运行操作。
但是,无论您是要安装还是卸载,它都会运行它,因此要么改变您的条件,要么采取措施将其考虑在内。最简单的方法可以检查是否设置了Installed
属性;更健壮的检查可以验证相关组件的安装和操作状态。如果您需要在添加或删除功能的维护方案中有条件地执行某些操作,则可能需要后者。
既然你提到你也需要在UI期间运行它,你必须采取额外的步骤。您可以设置msidbCustomActionTypeFirstSequence日程安排选项,如下所示。
或者您可能必须检测方案,例如检查UILevel,或者在操作运行时设置并检查自己的属性。您可能还需要将其拆分为多个入口点,以便您可以立即告知UI执行;似乎没有RunMode区分这两者。 (我忘记了一个被设置的属性吗?)