Wix MSI带参数执行EXE的Deferred自定义动作运行失败
Wix MSI自定义动作运行exe报错的解决方法
你的问题核心是延迟执行(deferred)的自定义动作无法直接访问普通目录属性,路径传递错误导致找不到myapp.exe,进而引发安装终止。以下是具体修复步骤:
1. 用CustomActionData传递路径
延迟执行的自定义动作处于MSI的受限执行阶段,无法直接读取INSTALLFOLDER、BinFolder这类普通属性,必须通过CustomActionData传递必要的路径信息:
首先添加一个即时执行的自定义动作,用于设置延迟动作需要的路径数据:
<CustomAction Id="SetGenerateIdCustomActionData" Property="GenerateIdAndAddInRegistry" Value="[BinFolder]" Execute="immediate" />
2. 修改延迟自定义动作的命令行
更新你的延迟动作,通过[CustomActionData]获取传递的路径,确保能准确定位到myapp.exe:
<CustomAction Id="GenerateIdAndAddInRegistry" ExeCommand=""[CustomActionData]myapp.exe" -generateid" Execute="deferred" Return="check" Impersonate="no" />
注意:移除了
Directory属性(延迟阶段该属性无法正常解析),用双引号包裹路径避免路径含空格时出错。
3. 调整执行序列
确保先运行即时动作设置数据,再执行延迟动作:
<InstallExecuteSequence> <Custom Action='SetGenerateIdCustomActionData' After='InstallFiles'>NOT Installed</Custom> <Custom Action='GenerateIdAndAddInRegistry' After='SetGenerateIdCustomActionData'>NOT Installed</Custom> </InstallExecuteSequence>
额外排查要点
- 确认
myapp.exe已正确打包到BinFolder目录下,检查你的File/Component配置,确保文件安装路径无误。 - 若
myapp.exe写入的是HKCU注册表项,Impersonate="no"会导致系统账户无法访问当前用户的HKCU,此时需将Impersonate设为yes(需确保安装时用户有足够权限)。 - 生成MSI安装日志定位具体错误:运行
msiexec /i 你的安装包.msi /l*v install.log,在日志中搜索GenerateIdAndAddInRegistry相关条目,查看是否有文件找不到、权限不足等具体错误信息。
内容的提问来源于stack exchange,提问作者Rohan Atyalkar
相关产品推荐
相关产品推荐

