2016-08-02 8 views
2

Ich muss optional ein Bundle-Befehlszeilenargument an eine MSI übergeben. Das heißt, wenn es in der Befehlszeile des Pakets angegeben ist, übergeben Sie den Wert an das MSI, andernfalls lassen Sie es auf dem Standardwert DEFINED IN THE MSI festgelegt.So übergeben Sie optional eine öffentliche Eigenschaft an eine MSI aus einem Bundle

Um eine Immobilie zu einem MSI passieren müssen Sie diese verwenden:

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

Und ein Bündel Variable Sie diese müssen zu erklären:

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

Das Ergebnis ist, dass das Volkseigentum ist IMMER auf einen Wert einstellen. Entweder der Standardwert "SomeValue" oder ein Wert, der für die Befehlszeile des Pakets übergeben wurde.

Wie können Sie die MsiProperty bedingt übergeben?

Antwort

0

Ich weiß nicht, ob es eine bessere Option gibt, aber Sie können 2 MsiPackages zur Kette hinzufügen, deren wird das gleiche Paket installieren, aber eins mit MsiProperty und andere ohne MsiProperty definiert. Vorteil dieser Vorgehensweise ist, dass Sie InstallCondition für MsiPackage festlegen können, aber nicht für MsiProperty.

0

Vielleicht könnten Sie zwei Einträge für MsiPackage im Brennpaket mit jeweils entgegengesetzten Installationsbedingungen machen. I.e. Wenn die Eigenschaft ausgefüllt ist, dann führe eine aus, andernfalls führe die andere aus? Ein bisschen hacky, aber ich weiß es nicht anders. Nicht sicher, wie sich dies auf den Deinstallationsabschnitt auswirkt.

0

Ich habe WiX Github überprüft und sieht so aus, als ob das heute nicht möglich ist. Sobald Sie eine MsiProperty in BURN definieren, wird der Wert festgelegt und an die MSI übergeben, unabhängig davon, ob der Wert leer ist oder nicht. Hier ist eine Momentaufnahme des Codes:

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); 
     } 
    } 

sieht wie folgt aus wird eine neue Funktion in WiX4.0 wie HERE erwähnt

Jetzt, wo gesagt wird, wenn Sie der Autor dieses MSI sind, dann können Sie Überprüfen Sie den Wert der Eigenschaft in Ihrer MSI-Datei (.wxs), und legen Sie einen anderen Wert fest, wenn dieser unter Verwendung von SetProperty "leer" angezeigt wird.

+0

Hat dies geholfen ????? – Isaiah4110

Verwandte Themen