在使用Wix安装后运行应用程序时为什么“并且未安装”?

时间:2018-04-12 15:44:20

标签: wix windows-installer installshield wix3

在Wix的文档How To: Run the Installed Application After Setup上,Publish元素的条件除了包含是否应该运行应用程序的属性之外还包含and NOT Installed

<Publish Dialog="ExitDialog"
         Control="Finish" 
         Event="DoAction" 
         Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>

为什么会这样?它做了什么?

3 个答案:

答案 0 :(得分:2)

Publish element指向的自定义操作只有在提供的整个条件的计算结果为true时才会运行。

  • NOT Installed:适用于全新安装主要升级。否则总是假的。
  • WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1:当属性设置为1时为真。

因此,将条件转换为单词 :仅当WIXUI_EXITDIALOGOPTIONALCHECKBOX也设置为{{1}时,才在全新安装和主要升级安装上启动应用程序}。否则不要启动。启动时必须满足这两个条件。

技术上 1实质上是检查您正在安装的MSI的产品GUID是否已在系统上注册为已安装。如果是,则条件Installed的计算结果为真。

启动应用程序 :是的,这可能有点令人困惑,但它完成了文档中所说的内容:它使应用程序仅在{{1}期间启动}而不是NOT Installedfresh installrepairmodify(或其他安装模式)。

有趣的是,它应该(据我所知)导致应用程序在交互式主要升级期间启动(uninstall不适用于安装在顶部的新设置旧版本,但卸载设置确实如此 - 主要的升级基本上是旧版本的卸载和新版本的全新安装。“

所以minor upgrade patch似乎只在两种情况下属实:全新安装主要升级。您想要自动启动应用程序的两种情况?

由于在静默安装模式中跳过Installed,因此在静默安装后将不会启动应用程序,因为永远不会遇到对话框(仅NOT Installed运行)。

InstallUISequence的上下文中,

Digression,类似问题 - LaunchCondition I just commented on almost the same issue the other day。如果您点击此链接,请务必阅读Phil的后续评论。

要使用上述其他字词:基本上 OR&#d; InstallExecuteSequence条件可确保LaunchConditions仅适用于全新安装(或主要升级新包安装在旧包之上)。这似乎是WiX家伙的一个很好的功能 - 我注意到Installshield does not seem to use this concept。我没有经过这么多测试,但这似乎是一个很好的概念。

或者,正如Phil在上面的链接评论中所述,在Installed的上下文中,您可以调整LaunchCondition而不是使实际的LaunchConditions条件复杂化。不确定哪个更好。

<强>更新

一般条件 :MSI条件可能非常混乱。以下是一些可以解决这些问题的资源:

我还有一个我倾向于提供的链接,但是在将人们发送到内容之前,我想测试一些微妙的问题。

答案 1 :(得分:0)

从“看似随意”的情况(例如“未安装”)可能并不清楚,但是有一组标准的Windows Installer属性,而Installed就是其中之一:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370905(v=vs.85).aspx

如果产品已在系统上注册为已安装,则会“安装”该产品。在该WiX源的上下文中,它表示“仅在尚未安装产品时运行”。

条件在自定义操作中尤为重要。如果您没有对自定义操作设置任何条件,那么它将在安装时运行,并且每当安装类型操作发生时,例如卸载,修复,应用补丁。条件记录在这里:

https://msdn.microsoft.com/en-us/library/aa368012(v=vs.85).aspx

答案 2 :(得分:0)

Not Installed条件尝试确保即使WIXUI_EXITDIALOGOPTIONALCHECKBOX默认设置为1,该操作也仅在exe很可能存在的情况下发布。为什么这样?如果有人选择在不存在的情况下启动exe,则错误消息或缺少的UI可能会使用户感到困惑。在安装过程的其他部分,启动失败可能会中止并回滚安装程序。

到那时为什么条件NOT Installed?这可能听起来倒退了。但这不是偶然的。 Installed属性在安装程序启动时设置,直到下次启动时才会更新。即使安装程序通过安装或卸载产品来改变状态,Installed的值也不会受到影响。

那么在ExitDialog中NOT Installed为真的情况是什么?

首次安装: Installed将开始(并保持)为false,因此最后NOT Installed将为真。如果安装成功完成,那么你的exe可能就在那里。如果安装被取消或回滚,安装程序可以显示不同的最终对话框,但不提供启动选项。

维护,修复,卸载 Installed将以true开头,因此在完成时NOT Installed将为false。这可能导致例如修复场景中的假阴性; exe可能存在但安装程序不会尝试启动它。但是,更重要的是,它会阻止尝试在刚刚卸载后启动exe。

升级:根据升级类型,这将等同于之前的方案之一。次要升级和小型更新是一种维护形式,而主要升级就像首次安装一样。

请注意,在更复杂的项目中,这种情况可能并非万无一失。如果您的exe只安装在您的配置的子集中(例如,如果它仅由您可以选择排除的功能安装,或者由依赖于OS版本的组件安装),您可能希望增强条件或完全删除启动操作。

我说可以显示不同的对话框,因为我不确定WixUI_Minimal在这里做了什么。如果它显示相同的对话框,那么条件不足以完成我在此描述的内容。