我必须使用MSI构建一个基于WiX的安装程序,我需要在运行命令操作之前设置环境MY_HOME
。
我有一个组件:
<Component Id="SEMYHOME"
Guid="*my guid*">
<CreateFolder />
<Environment Id="MY_HOME"
Action="set"
Part="all"
Name="MY_HOME"
Permanent="no"
System="yes"
Value="[APPLICATIONPATH]myapp"/>
</Component>
然后我有一个自定义动作:
<CustomAction Id="InstallMyService"
Directory="INSTALLDIR"
ExeCommand='"[INSTALLDIR]myapp\install_service.bat" install'
Execute="immediate"
Return="ignore"/>
<InstallExecuteSequence>
<Custom Action="InstallMyService"
After="InstallFinalize"/>
</InstallExecuteSequence>
注意:此操作需要在运行之前设置MY_HOME
变量。
安装此MSI时,我得到一个日志,显示在运行自定义操作“InstallMyService”之前已设置MY_HOME
变量,但安装我的服务的命令仍然失败。我发现原因是当命令调用时,MY_HOME仍未设置。
安装完成后,MY_HOME按预期设置,但自定义操作失败:(
如何解决此问题?
答案 0 :(得分:6)
Windows Installer和自定义操作通过服务控制管理器进行托管,该管理器长期以来不遵守发布环境更改时发送的广播消息。因此,即使你修复了Yan提到的你不会发现你的自定义操作仍然没有环境变量的即时/延迟问题。
为什么不只是将“[APPLICATIONPATH] myapp”传递给你的.bat文件并以%2的形式获取它?
BTW我也不建议从安装程序调用批处理文件。看到安装程序突然出现黑色小窗口,这很脆弱,令人尴尬。
答案 1 :(得分:2)
你的CA是即时的。这意味着它在Windows Installer处理您的MSI包时立即运行。这显然发生在安装包含<Environment/>
的组件之前。将其修改为延迟(Execute="deferred"
)并在InstallFinalize之前安排。