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

如何在Wix安装项目的安装阶段前运行嵌入的PowerShell脚本?

在Wix安装项目中嵌入并在安装前运行PowerShell脚本的解决方案

核心结论

你无法直接将DATABASE属性指向的MSI文件作为PowerShell自定义动作的-File参数使用(MSI是数据库格式,并非可直接执行的脚本),但可以通过将脚本嵌入MSI的Binary表,再在自定义动作中提取到临时目录后执行,实现安装前运行脚本的需求。

具体实现步骤

1. 将PowerShell脚本嵌入MSI的Binary表

在Wix项目中添加<Binary>元素,把你的预安装脚本打包进MSI数据库:

<!-- 替换为你实际的脚本路径 -->
<Binary Id="PreInstallScript" SourceFile=".\Scripts\PreInstallChecks.ps1" />

2. 创建自定义动作提取并执行脚本

编写内联PowerShell自定义动作,通过Windows Installer COM对象提取Binary表中的脚本到临时目录,再执行:

<CustomAction Id="RunPreInstallScript" 
              Execute="immediate" 
              Return="check" 
              Impersonate="no"
              Script="powershell"
              Directory="TEMP">
<![CDATA[
  # 从DATABASE环境变量获取当前MSI路径
  $msiDatabasePath = $env:DATABASE
  $installer = New-Object -ComObject WindowsInstaller.Installer
  
  # 打开MSI数据库并读取Binary表中的脚本数据
  $database = $installer.OpenDatabase($msiDatabasePath, 0)
  $view = $database.OpenView("SELECT Data FROM Binary WHERE Name='PreInstallScript'")
  $view.Execute()
  $record = $view.Fetch()
  $scriptStream = $record.GetStream(1)
  
  # 将脚本保存到临时目录
  $tempScriptPath = Join-Path $env:TEMP "PreInstallScript_$(Get-Random).ps1"
  $scriptStream.SaveToFile($tempScriptPath)
  
  # 执行脚本(绕过执行策略确保能运行)
  powershell.exe -ExecutionPolicy Bypass -File $tempScriptPath -NoProfile
  
  # 清理临时文件
  Remove-Item $tempScriptPath -Force -ErrorAction SilentlyContinue
]]>
</CustomAction>

3. 安排自定义动作到安装序列

将自定义动作放在InstallInitialize之前(确保在安装操作启动前执行),并添加执行条件:

<InstallExecuteSequence>
  <!-- 仅在首次安装时运行,可根据需求调整条件 -->
  <Custom Action="RunPreInstallScript" Before="InstallInitialize">NOT Installed</Custom>
</InstallExecuteSequence>

关键注意事项

  • 权限控制:如果脚本需要管理员权限,确保自定义动作设置Impersonate="no",同时MSI项目设置InstallPrivileges="elevated"。
  • 执行策略:使用-ExecutionPolicy Bypass避免系统执行策略阻止脚本运行,适合打包部署场景。
  • 错误处理:自定义动作的Return="check"会在脚本执行失败时终止安装,若需忽略错误可改为Return="ignore"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:05:14