1

我正在尝试安装具有以下条件的功能:“INSTALLTHIS="YES"”。属性“INSTALLTHIS”最初设置为“NO”。操作“test_command”将“INSTALLTHIS”设置为“YES”。“test_command2”中的消息框显示该属性的值已设置为“YES”。我希望将安装“ProductFeature”,因为“INSTALLTHIS="YES"” 是真的,除非它没有安装。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" Name="test" Language="1033" Version="1.0.0.0" Manufacturer="test_wix" UpgradeCode="351b96ea-a1af-4542-8be9-9e8e07878a99">
        <Property Id="INSTALLTHIS" Value="NO" Secure="yes"></Property>

        <Feature Id="ProductFeature" Title="SetupProject1" Level="0"> 
            <ComponentRef Id="ClientSoftware" />        
            <Condition Level="1">
                <![CDATA[INSTALLTHIS="YES"]]>
            </Condition>
        </Feature>

        <CustomAction Id="test_command" Script="vbscript">
            <![CDATA[          
                Session.Property("INSTALLTHIS") = "YES"
            ]]>
        </CustomAction>

        <CustomAction Id="test_command2" Script="vbscript">
            <![CDATA[          
                MsgBox(Session.Property("INSTALLTHIS")) <!-- SAYS YES IN THE MESSAGE BOX -->
            ]]>
        </CustomAction>

    <InstallExecuteSequence>
            <Custom Action="test_command" After="CostFinalize">NOT Installed</Custom> 
            <Custom Action="test_command2" After="test_command">NOT Installed</Custom>
    </InstallExecuteSequence>
</Product>

(我删除了目录设置、组件组、组件等不必要的 XML)

4

2 回答 2

2

您遇到的问题主要是订购问题之一:在 Costing 期间处理特征条件(特别是在 CostFinalize 操作期间)。成本核算完成后,它们将没有进一步的影响。也就是说,我会避免以这种方式使用功能条件和级别,尤其是在Level="0"涉及到的情况下。(Level="0" 实际上只对永远不会改变的东西安全,比如操作系统的位数。)

如果您想允许您的用户通过传递命令行有条件地安装功能,请记录安装程序的功能。然后他们就可以通过了ADDLOCAL=list,of,features。相反,如果您想控制单个组件而不更改功能的安装状态,则可以对组件设置条件。但这些也在成本核算期间进行处理,因此您仍需注意排序。

附带说明一下,避免仅使用 VBScript 动作来设置属性。我认为这是您实际操作的简化,但如果不是,请改用SetProperty操作。(我通常建议在所有情况下都避免使用 VBScript 动作,但是更改更复杂的动作会更加困难,因此风险也会更大,因此您必须做出决定。)

于 2017-03-28T15:26:46.870 回答
1

你想做的事情是不可能的。看看这个对类似问题的回答首先评估特征条件,然后再进行其他任何操作。在您的情况下,这意味着在评估功能条件时 INSTALLTHIS =“NO”。尽管我没有使用这种方法,但链接的答案提供了一个潜在的解决方案,在我工作的安装程序中,当我们需要这种行为时,我们的解决方案是从引导程序传递属性。

于 2017-03-27T12:27:18.010 回答