如何选择将公共属性从Bundle传递给MSI

时间:2016-08-02 23:29:31

标签: wix burn

我需要选择将Bundle命令行参数传递给MSI。也就是说,如果它在Bundle命令行中指定,则将值传递给MSI,否则将其设置为默认值在MSI中。

要将属性传递给MSI,您需要使用它:

<MsiProperty Name='PUBLICPROPERTY' Value='[BundleParameter]'/>

要声明一个bundle变量,你需要这个:

<Variable Name="BundleParameter" bal:Overridable="yes" Type="string" Value="SomeValue"/>   

结果是PUBLICPROPERTY总是设置为一个值。默认值“SomeValue”或在bundle命令行上传递的值。

你如何有条件地传递MsiProperty?

3 个答案:

答案 0 :(得分:1)

我检查了WiX Github,看起来今天不可能。在BURN中定义MsiProperty后,该值将被设置并传递给MSI,无论该值是否为空。以下是代码的快照:

extern "C" HRESULT MsiEngineParsePropertiesFromXml(
    __in IXMLDOMNode* pixnPackage,
    __out BURN_MSIPROPERTY** prgProperties,
    __out DWORD* pcProperties
    )
{
    HRESULT hr = S_OK;
    IXMLDOMNodeList* pixnNodes = NULL;
    IXMLDOMNode* pixnNode = NULL;
    DWORD cNodes = 0;

    BURN_MSIPROPERTY* pProperties = NULL;

    // select property nodes
    hr = XmlSelectNodes(pixnPackage, L"MsiProperty", &pixnNodes);
    ExitOnFailure(hr, "Failed to select property nodes.");

    // get property node count
    hr = pixnNodes->get_length((long*)&cNodes);
    ExitOnFailure(hr, "Failed to get property node count.");

    if (cNodes)
    {
        // allocate memory for properties
        pProperties = (BURN_MSIPROPERTY*)MemAlloc(sizeof(BURN_MSIPROPERTY) * cNodes, TRUE);
        ExitOnNull(pProperties, hr, E_OUTOFMEMORY, "Failed to allocate memory for MSI property structs.");

        // parse property elements
        for (DWORD i = 0; i < cNodes; ++i)
        {
            BURN_MSIPROPERTY* pProperty = &pProperties[i];

            hr = XmlNextElement(pixnNodes, &pixnNode, NULL);
            ExitOnFailure(hr, "Failed to get next node.");

            // @Id
            hr = XmlGetAttributeEx(pixnNode, L"Id", &pProperty->sczId);
            ExitOnFailure(hr, "Failed to get @Id.");

            // @Value
            hr = XmlGetAttributeEx(pixnNode, L"Value", &pProperty->sczValue);
            ExitOnFailure(hr, "Failed to get @Value.");

            // @RollbackValue
            hr = XmlGetAttributeEx(pixnNode, L"RollbackValue", &pProperty->sczRollbackValue);
            if (E_NOTFOUND != hr)
            {
                ExitOnFailure(hr, "Failed to get @RollbackValue.");
            }

            // prepare next iteration
            ReleaseNullObject(pixnNode);
        }
    }

看起来这将是WiX4.0中提到的HERE

的新功能

现在要说的是,如果您是该MSI的作者,那么您可以检查MSI(.wxs)文件中的属性值,如果它通过使用{{3出现“空”,则将其设置为不同的值}}

答案 1 :(得分:0)

我不知道,如果有更好的选择,但你可以添加2个MsiPackages链,它将安装相同的包,但一个使用MsiProperty,而另一个没有定义MsiProperty。这种方法的优点是你可以在MsiPackage上设置InstallCondition但不能在MsiProperty上设置。

答案 2 :(得分:0)

也许你可以在刻录包中为MsiPackage制作两个条目,每个条目都有相反的安装条件。即如果填写了属性,则运行一个,否则运行另一个?有点hacky,但我不知道其他任何方式。不确定这将如何影响卸载部分。