Wix Installer:在命令行执行MSIEXEC管理员安装时设置组件条件属性

我们的产品有三种类型/口味,但是只有一种用WiX编写的MSI。在构建安装程序时,我们通过定义的常量传递风味:


Call MSBUILD.bat ..\MSIs\CoreProduct\OurProduct.sln /p:DefineConstants="FLAVOUR=%_Flavour%"

并在Visual Studio中的“构建”->“将预处理器变量定义为FLAVOUR = 50”下设置该常数。构建过程会传递50、200或LITE值作为风味。


在WiX代码中,我们在组件上有很多条件,可以根据不同的情况告诉它要安装哪个文件。例如


      <Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*">

    <File Id="fil238A776D9294E14671E012472F9F7196"

          KeyPath="yes"

          Source="$(var.MenusPath)\ClientListView 200.r5m"  

    <Condition>$(var.FLAVOUR)=200</Condition>

  </Component>


      <Component Id="cmp8BFF42B232724DC4BA5B8F87994DEF21" Guid="*">

    <File Id="fil808D6428D67248DDB8CA65DBC5978283" 

          KeyPath="yes" 

          Source="$(var.MenusPath)\ClientListView Lite.r5m"

    <Condition>$(var.FLAVOUR)=LITE</Condition>

  </Component>

因此,如果FLAVOR是LITE,则上面的示例将安装一个名为“ ClientListView Lite.r5m”的文件;如果FLAVOR是200,则将安装一个名为“ ClientListView 200.r5m”的文件。


这一切都按预期进行,并且已经完成了多年!


但是现在,我们有了产品的Web版本,我们需要一个zip文件来包含每种风味将安装的文件夹结构和文件。我发现您可以使用MSIEXEC和/ a参数在命令行上运行msi,然后它将重定向所有本应安装到文件夹中的内容,并认为这正是我想要的...但是a,它无法正常工作预期的。


似乎正在运行MSI,然后将文件提取到目标文件夹中,但是它忽略了这种风格,因此最终将“ ClientListView Lite.r5m”和“ ClientListView 200.r5m”文件提取到文件夹; 这显然不是我想要的。


阅读有关MSIEXEC的文档后,似乎可以传递Public属性的值,例如msiexec.exe / a“ C:\ Example.msi” MY_PROP =“ myValue”-因此,我认为这可能对我有所帮助;因此,在我的WiX代码中,添加了以下行:


    <Property Id='PRODTYPE' Value="$(var.FLAVOUR)"/>

然后将我的组件条件更改为:


  <Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*">

    <File Id="fil238A776D9294E14671E012472F9F7196"

          KeyPath="yes"

          Source="$(var.MenusPath)\ClientListView 200.r5m"  

    <Condition><![CDATA[PRODTYPE=200]]></Condition>

  </Component>



但是尽管编译正常,但可以通过以下方式运行它:


msiexec /a OurProduct.msi /qb PRODTYPE=200 TARGETDIR="C:\InstalledFiles200"

仍然提取200和LITE口味的两个文件,而我只想提取200个。


因此,我是在尝试做一些不可能的事情...还是我在做错什么-感激不尽的帮助,因为可以在批处理文件中模仿该过程来创建我的zip;将是可怕的!


隔江千里
浏览 703回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP