2016-08-02 3 views
2

번들 명령 줄 인수를 선택적으로 MSI에 전달해야합니다. 즉, Bundle 명령 행에 지정된 경우 MSI에 값을 전달하고 그렇지 않으면 MSI에서 기본값으로 설정하십시오.번들에서 공용 속성을 선택적으로 MSI에 전달하는 방법

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

그리고 당신이 필요로 번들 변수 선언 :

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

결과는 공물이 있는지를 MSI는에 속성을 전달하기 위해

당신은이를 사용할 필요가 항상 값으로 설정하십시오. "SomeValue"의 기본값 또는 번들 명령 행에 전달 된 값.

MsiProperty를 조건부로 통과시킬 수 있습니까?

답변

0

더 나은 옵션이 있다면 잘 모르겠지만 동일한 패키지를 설치할 체인에 2 개의 MsiPackages를 추가 할 수 있지만 MsiProperty가없는 패키지와 MsiProperty가 정의되지 않은 MsiPackages를 추가 할 수 있습니다. 이 aproach의 장점은 MsiPackage에서 InstallCondition을 설정할 수 있지만 MsiProperty에서는 설정할 수 없다는 것입니다.

0

번들 번들에서 MsiPackage에 대해 두 가지 항목을 만들 수 있습니다. 각각 반대 설치 조건이 있습니다. 나는. 속성이 채워지면 하나를 실행하고 그렇지 않으면 다른 하나를 실행 하시겠습니까? 약간 해키지만 다른 방법은 모르겠다. 이것이 제거 부분에 어떤 영향을 미치는지 확신 할 수 없습니다.

0

WiX Github을 확인했는데 오늘은 불가능합니다. 일단 BURN에 MsiProperty를 정의하면 값이 비어 있는지 여부와 상관없이 값이 설정되고 MSI로 전달됩니다. 말했다되고 이제

HERE을 언급 한 바와 같이

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

은 다음과 같습니다

당신이 그 MSI의 저자 경우 당신이 할 수있는, WiX4.0의 새로운 기능이 될 것입니다 : 여기에 코드의 스냅 샷입니다 MSI (.wxs) 파일 내의 Property 값을 확인하고 SetProperty을 사용하여 "비어 있음"이 나오면 다른 값으로 설정하십시오.

+0

도움이 되었습니까 ????? – Isaiah4110

관련 문제