2016-08-02 53 views
2

我需要可选地将一个包命令行参数传递给MSI。也就是说,如果它在Bundle命令行上指定,则将该值传递给MSI,否则将其设置为默认的MSI中的DEFINED。如何可选地将一个公共属性从一个包中传递给一个MSI

为了一个属性传递给MSI您需要使用此:

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

,并宣布你需要这个捆绑变量:

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

的结果是公物是始终设置为一个值。无论是“SomeValue”的默认值还是在命令行上传递的值。

如何有条件地通过MsiProperty?

回答

0

我不知道,如果有更好的选择,但你可以添加2个MsiPackages链,它将安装相同的包,但一个MsiProperty和其他没有MsiProperty定义。这个问题的优点是你可以在MsiPackage上设置InstallCondition,但不能在MsiProperty上。

0

也许你可以在烧录包中为MsiPackage创建两个条目,每个条目都有相反的安装条件。即如果属性被填充,那么运行一个,否则运行另一个?有点古怪,但我不知道任何其他方式。不知道这将如何影响卸载部分。

0

我检查了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)文件中的属性值,如果它使用SetProperty出现“空”,则将其设置为不同的值。

+0

这是否有帮助????? – Isaiah4110

相关问题