You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WiX Installer:如何多次运行带不同属性的MSI安装包?

实现WiX引导程序同时安装到多个MSFS根目录

嘿,作为刚接触WiX Bootstrapper的新手,能想到要支持多MSFS版本安装真的很实用——毕竟玩家们经常同时装着不同版本的模拟器!针对你的需求,我整理了几个可行的方案,从简单到进阶都有:

方案1:多次调用同一个MSI,每次指定不同目录(最适合新手)

WiX的Burn引导程序允许你在<Chain>里多次包含同一个MSI包,只要给每个实例分配唯一的Id,并传递不同的INSTALLDIR属性就行。这是最直接的方式,几乎不需要修改你的现有MSI。

举个配置示例:

<Chain>
  <!-- 安装到MSFS 2020目录 -->
  <MsiPackage Id="Addon_MSI_2020" SourceFile="YourMSFSAddon.msi" DisplayInternalUI="yes">
    <MsiProperty Name="INSTALLDIR" Value="C:\Program Files\Microsoft Flight Simulator 2020\Community\" />
  </MsiPackage>
  <!-- 安装到MSFS 2024目录 -->
  <MsiPackage Id="Addon_MSI_2024" SourceFile="YourMSFSAddon.msi" DisplayInternalUI="yes">
    <MsiProperty Name="INSTALLDIR" Value="C:\Program Files\Microsoft Flight Simulator 2024\Community\" />
  </MsiPackage>
</Chain>

进阶优化:让用户选择要安装的版本

如果想让玩家自己勾选要安装的目标版本,你可以在Bootstrapper的UI里添加复选框组件,收集用户选择的目录后,通过Burn的变量系统动态控制哪些<MsiPackage>实例被激活。比如给每个MsiPackage加上Condition属性,只有当用户勾选了对应版本时才执行安装:

<Variable Name="InstallTo2020" Type="bool" Value="no" />
<Variable Name="InstallTo2024" Type="bool" Value="no" />

<Chain>
  <MsiPackage Id="Addon_MSI_2020" SourceFile="YourMSFSAddon.msi" Condition="InstallTo2020">
    <MsiProperty Name="INSTALLDIR" Value="[MSFS2020Path]\Community\" />
  </MsiPackage>
  <MsiPackage Id="Addon_MSI_2024" SourceFile="YourMSFSAddon.msi" Condition="InstallTo2024">
    <MsiProperty Name="INSTALLDIR" Value="[MSFS2024Path]\Community\" />
  </MsiPackage>
</Chain>

方案2:修改MSI本身支持多目录安装(适合进阶需求)

如果你不想在Bootstrapper里重复添加MSI实例,可以让MSI自己处理多路径部署。核心思路是定义一个多值属性,然后用自定义动作遍历这个属性里的每个路径,完成文件复制。

步骤1:在MSI中定义多值属性

<!-- 定义存储多个目标目录的多值属性 -->
<Property Id="TARGETDIRS" MultiValue="yes" />

<!-- 添加自定义动作DLL(需要自己用C#/C++编写) -->
<Binary Id="CustomActions" SourceFile="YourCustomActions.dll" />
<CustomAction Id="CopyToMultipleDirs" BinaryKey="CustomActions" DllEntry="CopyFilesToDirectories" Execute="deferred" Impersonate="no" />

<!-- 在安装序列中执行自定义动作 -->
<InstallExecuteSequence>
  <Custom Action="CopyToMultipleDirs" After="InstallFiles" />
</InstallExecuteSequence>

步骤2:在Bootstrapper中传递多目录值

把用户选择的多个目录用分号分隔,传递给MSI的TARGETDIRS属性:

<MsiPackage Id="Addon_MSI" SourceFile="YourMSFSAddon.msi">
  <MsiProperty Name="TARGETDIRS" Value="[UserSelectedDir1];[UserSelectedDir2]" />
</MsiPackage>

这种方式的好处是只需要调用一次MSI,但缺点是需要编写自定义动作,对WiX新手来说门槛稍高。

方案3:自动检测已安装的MSFS版本,批量安装

如果想让引导程序自动识别玩家电脑上已安装的MSFS版本,无需用户手动选择,可以用Burn的DirectorySearch功能查找各个版本的安装路径,然后自动添加对应的安装任务:

<!-- 搜索MSFS 2020安装目录 -->
<Variable Name="MSFS2020Dir" Type="string" />
<DirectorySearch Id="FindMSFS2020" Path="C:\Program Files\Microsoft Flight Simulator 2020" AssignToProperty="yes" />

<!-- 搜索MSFS 2024安装目录 -->
<Variable Name="MSFS2024Dir" Type="string" />
<DirectorySearch Id="FindMSFS2024" Path="C:\Program Files\Microsoft Flight Simulator 2024" AssignToProperty="yes" />

<Chain>
  <!-- 只有找到2020目录才安装 -->
  <MsiPackage Id="Addon_MSI_2020" SourceFile="YourMSFSAddon.msi" Condition="MSFS2020Dir">
    <MsiProperty Name="INSTALLDIR" Value="[MSFS2020Dir]\Community\" />
  </MsiPackage>
  <!-- 只有找到2024目录才安装 -->
  <MsiPackage Id="Addon_MSI_2024" SourceFile="YourMSFSAddon.msi" Condition="MSFS2024Dir">
    <MsiProperty Name="INSTALLDIR" Value="[MSFS2024Dir]\Community\" />
  </MsiPackage>
</Chain>

这个方案特别适合批量部署,玩家不需要手动选择,引导程序会自动完成所有已安装版本的附加包安装。

总结

  • 新手优先选方案1:操作简单,不需要修改现有MSI,快速实现多目录安装。
  • 若需要更灵活的用户交互,结合方案1的条件判断和UI组件。
  • 进阶需求可以考虑方案2,让MSI本身处理多路径,但需要编写自定义动作。
  • 自动批量安装选方案3,用Burn的搜索功能简化用户操作。

内容的提问来源于stack exchange,提问作者lequinne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:33:48