我使用 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 模式时执行一次)。
最佳答案
当您使用 /qn
运行时,不会显示向导。甚至整个InstallUISequence被跳过。因此,如果您希望您的操作始终运行,则不应仅通过单击按钮来调用它。当按钮未显示时,无法点击。
而是在 InstallExecuteSequence 中找到一个位置安排它。 (如果您没有其他要求,您可能仍希望在 CostFinalize 之后的某个时间安排它以反射(reflect)非静默情况。)无论您是否有 UI,此安排都会运行操作。
但是,无论您是安装还是卸载,它都会运行它,因此请更改您的条件或您的操作以将其考虑在内。最简单的方法可能是检查是否设置了 Installed
属性;更强大的检查可能会验证相关组件的安装和操作状态。如果您需要在添加或删除功能的维护场景中有条件地执行某些操作,则后者可能是必需的。
由于您提到您还需要它在 UI 期间运行,因此您必须采取额外的步骤。您可以设置 msidbCustomActionTypeFirstSequence调度选项如下所示。
或者您可能需要检测场景,例如检查 UILevel ,或者在您的操作运行时设置和检查您自己的属性。您可能还需要将其拆分为多个入口点,以便您可以告诉 UI 从立即执行;似乎没有 RunMode区分两者。 (我是否忘记了已设置的属性?)
关于installation - 如何在静默模式下运行 MSI 安装程序时运行自定义操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41646690/