失败的条件wix

时间:2018-04-16 17:48:20

标签: wix windows-installer

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

  1. Windows操作系统类型=桌面操作系统
  2. 如果HKLM \ SYSTEM \ CurrentControlSet \ Services \ MyService MYKEY = myValue
  3. 如果存在REG HKLM \ SYSTEM \ CurrentControlSet \ Services \ MyService = DisplayName 和HKLM \ SYSTEM \ CurrentControlSet \ Services \ MyService MYKEY不存在
  4. 虽然安装顺利但是安装时我的功能缺失了。

    我在推杆方面做错了什么?

    <Property Id="MYKEY" Secure="yes">
            <RegistrySearch Id="MyKey"
                                 Root="HKLM"
                                 Key="SYSTEM\CurrentControlSet\Services\MyService"
                                 Name="mykey"
                                 Type="raw" />
        </Property>
        <Property Id="MYSERVICE" Secure="yes">
            <RegistrySearch Id="MYSERVICE"
                            Root="HKLM"
                                 Key="SYSTEM\CurrentControlSet\Services\MyService"
                                 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>
    

1 个答案:

答案 0 :(得分:0)

注意:我需要明天正确验证下面使用的条件,但是发布我所拥有的条件,以便您无需等待即可查看。

当这三个&#34; sub&#34; -conditions中的任何一个为真时,你想达到什么目的?

  1. 中止设置 :中止整个设置? (LaunchConditions
  2. 配置功能 :阻止或启用特定功能的安装? (Feature conditions
  3. 这种差异显然至关重要 - 我们必须知道能够回答。您的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 table

    对于能够安装/运行的设置,LaunchConditions必须始终评估为true。

    因此,上述条件的Installed部分用于确保安装后条件始终为真 - 因此您不会遇到安装程序不允许自行卸载的情况或修复因为没有达到发射条件。条件:Installed - 除了fresh installmajor upgrades外,始终为真。

    注意:我不确定启动条件是否会在管理安装期间造成问题。我不认为他们这样做(管理安装具有自己的安装顺序)。我将在明天进行测试和验证。添加OR ACTION="ADMIN"时,应在运行管理安装时在任何框中启用启动条件。​​

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

    当您在WiX源中将Feature level设置为0时,该功能未在设置GUI 中显示,并且将无法安装默认情况下功能条件可以更改此设置,并在条件评估为true时将要设置为安装。

    您也可以反过来将功能级别设置为默认值(这应该安装该功能),然后使用功能条件将其功能级别设置为0 - 如果您不想要功能已安装 - 当条件为真时。

    &#34; Quick Mockup &#34;在这里:WIX If...else condition using registry

    在下面的WiX代码段中,我们设置了默认安装的功能(Level="1"),然后我们使用功能条件将功能设置为在相关条件评估为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")部分条件。   暂时保留上面的样品。

    链接: