【问题标题】:Why "and NOT installed" when running an app after install with Wix?为什么在使用 Wix 安装后运行应用程序时“并且未安装”?
【发布时间】:2018-09-22 20:33:31
【问题描述】:

在 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>

为什么会在那里?它有什么作用?

【问题讨论】:

    标签: wix windows-installer installshield wix3


    【解决方案1】:

    Publish element 指向的自定义操作仅在提供的整个条件评估为真时才会运行。

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

    因此,将条件翻译成文字:仅当 WIXUI_EXITDIALOGOPTIONALCHECKBOX 也设置为 1 时,才在全新安装和主要升级安装时启动应用程序。否则不启动。必须同时满足这两个条件才能启动。

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


    启动应用程序:是的,这可能有点令人困惑,但它确实如文档中所说:它使应用程序仅在 fresh install 和不在repairmodifyuninstallminor upgrade patch(或其他安装模式)期间。

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

    所以NOT Installed 似乎只适用于两种情况:全新安装重大升级。您希望自动启动应用程序的两种情况?

    由于在静默安装模式中跳过了InstallUISequence,因此在静默安装后将不会启动任何应用程序,因为您的对话框永远不会遇到(只有InstallExecuteSequence 运行)。 p>


    题外话,类似问题 - LaunchConditionI just commented on almost the same issue the other dayLaunchConditions 的上下文中。如果您点击链接,请务必阅读 Phil 的后续评论。

    使用上述以外的其他词:基本上 OR'd Installed 条件确保 LaunchCondition 仅适用于全新安装(或用于安装在顶部的新软件包的重大升级旧的)。这似乎是 WiX 家伙的一个漂亮功能 - 我注意到 Installshield does not seem to use this concept。我没有测试过这么多,但这似乎是一个不错的概念。

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


    更新

    一般情况:MSI 情况可能会很混乱。以下是一些可以解决这些问题的资源:

    我倾向于提供另一个链接,但它有许多微妙的问题,我想在将人们发送到内容之前对其进行测试。

    【讨论】:

      【解决方案2】:

      从“未安装”等(看似随意的)条件可能不清楚,但有一组标准的 Windows Installer 属性,已安装就是其中之一:

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

      如果产品的 ProductCode 注册为已安装在系统上,则该产品被“安装”。在该 WiX 源的上下文中,这意味着“仅在尚未安装产品时运行”。

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

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

      【讨论】:

        【解决方案3】:

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

        到那时为什么会出现<em>NOT</em> Installed这个条件?这对你来说可能听起来倒退了。但这不是意外。 Installed 属性在安装程序启动时设置,直到下次启动时才会更新。即使安装程序通过安装或卸载产品来改变状态,Installed 的值也不会改变。

        那么在哪些情况下NOT Installed 在 ExitDialog 上为 true?

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

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

        升级:根据升级类型,这将等同于前面的场景之一。小升级和小更新是一种维护形式,而大升级就像是首次安装。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-03
          • 1970-01-01
          • 2014-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多