我试图在以下情况下跳过安装:
- Windows 操作系统类型为 = 桌面操作系统
- 如果 HKLM\SYSTEM\CurrentControlSet\Services\MyService MYKEY= myValue
- 如果 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)?
当这三个"子"条件中的任何一个为真时,你想实现什么?
中止设置- :中止整个设置?(发射条件)
- 配置功能:阻止或启用特定功能的安装?(功能条件)
这种差异显然至关重要 - 我们必须知道能够回答。您的 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 install
和major 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")
部分似乎不需要。 暂时保留上面的示例。
链接:
- 威克斯如果...使用注册表的其他条件
- 如何仅在安装(而不是卸载)中执行自定义操作
- 如何在安装盾的分期付款要求页面添加新的框架版本?