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

如何让wixtool制作的msi安装包默认安装到自身所在目录

实现方案

1. 核心逻辑说明

MSI 内置的OriginalDatabase属性存储了当前运行的安装包完整路径,我们只需要提取该路径的目录部分,覆盖默认安装目录属性,再移除路径选择的UI页面即可实现需求。

2. 新增自定义动作提取MSI所在目录

在你的.wxs项目文件中添加以下自定义动作定义,用于解析MSI所在目录并赋值给安装目录属性:

<!-- 这里以Wix默认的WIXUI_INSTALLDIR作为安装根目录属性,如果你用自定义的INSTALLDIR可直接替换 -->
<CustomAction Id="SetInstallDirToMsiPath" Property="WIXUI_INSTALLDIR" Value="[OriginalDatabase]" Execute="immediate" />

<!-- 自定义动作截断MSI文件名,只保留所在目录路径 -->
<CustomAction Id="GetMsiParentDir" Script="vbscript" Execute="immediate">
  <![CDATA[
    Dim fullPath, parentDir
    fullPath = Session.Property("WIXUI_INSTALLDIR")
    parentDir = Left(fullPath, InStrRev(fullPath, "\"))
    Session.Property("WIXUI_INSTALLDIR") = parentDir
  ]]>
</CustomAction>

3. 调整执行序列保证路径提前生效

需要将自定义动作加入UI序列和执行序列,确保在安装路径校验前完成赋值,静默安装场景也能生效:

<InstallUISequence>
  <Custom Action="SetInstallDirToMsiPath" Before="CostInitialize" />
  <Custom Action="GetMsiParentDir" After="SetInstallDirToMsiPath" />
</InstallUISequence>

<InstallExecuteSequence>
  <Custom Action="SetInstallDirToMsiPath" Before="CostInitialize" />
  <Custom Action="GetMsiParentDir" After="SetInstallDirToMsiPath" />
</InstallExecuteSequence>

4. 移除安装路径选择UI页面

如果你使用Wix默认的WixUI_InstallDir模板,重写UI跳转逻辑跳过目录选择页即可:

<UI>
  <UIRef Id="WixUI_InstallDir" />
  <!-- 直接从欢迎页跳转到许可协议页,跳过InstallDirDlg路径选择页,可根据自己的UI流程调整跳转目标 -->
  <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
  <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
</UI>

注意事项

  • 如果自定义了安装根目录的属性名,替换所有代码中的WIXUI_INSTALLDIR为你自己的属性名即可
  • 如果对VBScript兼容性有要求,可以替换为C#编写的自定义动作实现路径截断逻辑,稳定性更高
  • 测试时需要将生成的MSI放到目标目录下双击运行,不要直接在Visual Studio中启动调试验证效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:36:08