失败条件 wix



我试图在以下情况下跳过安装:

  1. Windows 操作系统类型为 = 桌面操作系统
  2. 如果 HKLM\SYSTEM\CurrentControlSet\Services\MyService MYKEY= myValue
  3. 如果 REG HKLM\SYSTEM\CurrentControlSet\Services\MyService = DisplayName 存在 和 HKLM\SYSTEM\CurrentControlSet\Services\MyService MYKEY 不存在

安装时进展顺利,但在安装时,安装中缺少我的功能。

我在放置条件方面做错了什么吗?

<Property Id="MYKEY" Secure="yes">
<RegistrySearch Id="MyKey"
Root="HKLM"
Key="SYSTEMCurrentControlSetServicesMyService"
Name="mykey"
Type="raw" />
</Property>
<Property Id="MYSERVICE" Secure="yes">
<RegistrySearch Id="MYSERVICE"
Root="HKLM"
Key="SYSTEMCurrentControlSetServicesMyService"
Name="DisplayName"
Type="raw" />
</Property>
<Feature Id="MyFeature" Level="" Display="" Title="" Description="" AllowAdvertise="no" ConfigurableDirectory="INSTALLDIR">
<MergeRef Id="MyFeature" Primary="yes"/>
<Condition Level="0">((MsiNTProductType=1) OR 
(MYKEY="MyValue") OR 
(MYSERVICE="MyService" AND MYKEY=""))</Condition>
</Condition>
</Feature>

注意:以下内容尚未经过广泛测试 - 条件因难以正确而臭名昭著。测试条件需要实际测试。更多链接:

  • 条件调试
  • WiX 启动条件
  • Wix 工具更新使用旧的自定义操作(复杂条件的示例)
  • 如何添加仅在卸载时发生的WiX自定义操作(通过MSI)?

当这三个"子"条件中的任何一个为真时,你想实现什么?

中止设置
  1. 中止整个设置?(发射条件)
  2. 配置功能:阻止或启用特定功能的安装?(功能条件)

这种差异显然至关重要 - 我们必须知道能够回答。您的 WiX 源代码代码段当前显示用作功能条件的条件。我有一种感觉,这不是你想要的。


LaunchConditions:为了在满足这些条件之一的情况下中止整个设置,您可以尝试使用 LaunchCondition 条目。与其制作一个复杂的条件,不如将它们拆分为三个不同的条目,每个条目检查是否应中止设置 - 每个条目都有不同且特定的原因。我建议您在WiX源文件中的Package元素之后添加这些LaunchCondition条目:

<Condition Message="Aborting setup: Server OS required for installation.">Installed OR MsiNTProductType=1</Condition>
<Condition Message="Aborting setup: State reason for abortion.">Installed OR MYKEY="MyValue"</Condition>
<Condition Message="Aborting setup: State reason for abortion.">Installed OR (MYSERVICE="MyService" AND MYKEY="")</Condition>

这些条目将进入已编译的 MSI 文件的 LaunchCondition 表中。

启动条件必须始终计算为 true,安装程序才能安装/运行。

因此,上述条件的Installed部分是为了确保安装后条件始终为真 - 因此您不会遇到安装程序不允许卸载或修复自身的情况,因为不满足启动条件。条件:Installed- 将永远为真,除了fresh installmajor upgrades

注意:我不确定启动条件是否会在管理安装期间导致问题。我认为他们没有(管理安装具有自己的安装顺序)。我明天会进行测试和验证。添加OR ACTION="ADMIN"应使运行管理安装时任何框上的启动条件为 true。


功能条件:如果不想中止安装,而是希望根据评估这些条件来控制功能安装状态,则需要使用功能条件概念而不是启动条件概念。

当您在WiX源中将Feature level设置为0时,该功能不会显示在设置GUI中,默认情况下也不会安装。功能条件可以更改此设置,并在条件计算结果为 true 时将要安装的功能设置为安装。

您也可以反过来将功能级别设置为 1 作为默认值(这应该安装该功能),然后在条件为 true 时使用功能条件将其功能级别设置为 0(如果您不希望安装该功能)。

这里有一些进一步的细节在">快速样机"下: WIX 如果...否则条件使用注册表。

在下面的WiX代码片段中,我们将功能设置为默认安装(Level="1"),然后我们使用功能条件将该功能设置为不安装,如果其关联条件的计算结果为true(这是一个多部分条件)。因此,一旦条件计算为 true,我们就会分配功能Level="0"(这意味着不要安装功能并在设置 GUI 中隐藏它):

<Feature Id="MyFeature" Level="1"> <!--Default to install feature-->
<Condition Level="0"> <!--Do not install feature if condition is true-->
((MsiNTProductType=1) OR (MYKEY="MyValue") OR (MYSERVICE="MyService" AND MYKEY="") AND (NOT ACTION="ADMIN"))
</Condition>
</Feature>

AND (NOT ACTION="ADMIN")部分是强制在管理安装中安装该功能部件。如果安装程序在管理安装模式下运行,它将有效地关闭其他条件,使其从评估值变为 true,这将导致在管理员安装期间不安装该功能。最后一部分我明天必须测试。

更新:测试表明,在管理安装期间,根本不会提取任何设置为默认Level=0的功能, 无论设置要安装的功能的任何功能条件如何。我猜测暂定结论是不设置任何功能Level=0,但设置Level=1,然后将它们设置为Level=0计算结果为 true 的特征条件。这样功能可能是 隐藏在常规安装中,但所有功能 - 具有相关功能 文件 - 在管理员安装期间提取。条件的AND (NOT ACTION="ADMIN")部分似乎不需要。 暂时保留上面的示例。


链接:

  • 威克斯如果...使用注册表的其他条件
  • 如何仅在安装(而不是卸载)中执行自定义操作
  • 如何在安装盾的分期付款要求页面添加新的框架版本?

最新更新