在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>
为什么会这样?它做了什么?
答案 0 :(得分:2)
Publish element
指向的自定义操作只有在提供的整个条件的计算结果为true时才会运行。
NOT Installed
:适用于全新安装和主要升级。否则总是假的。WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1
:当属性设置为1时为真。 因此,将条件转换为单词 :仅当WIXUI_EXITDIALOGOPTIONALCHECKBOX
也设置为{{1}时,才在全新安装和主要升级安装上启动应用程序}。否则不要启动。启动时必须满足这两个条件。
技术上 :1
实质上是检查您正在安装的MSI的产品GUID是否已在系统上注册为已安装。如果是,则条件Installed
的计算结果为真。
启动应用程序 :是的,这可能有点令人困惑,但它完成了文档中所说的内容:它使应用程序仅在{{1}期间启动}而不是NOT Installed
,fresh install
,repair
,modify
(或其他安装模式)。
有趣的是,它应该(据我所知)导致应用程序在交互式主要升级期间启动(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在这里做了什么。如果它显示相同的对话框,那么条件不足以完成我在此描述的内容。