在WiX中运行自定义操作之前设置环境变量

时间:2010-12-23 04:38:27

标签: wix custom-action

我必须使用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='&quot;[INSTALLDIR]myapp\install_service.bat&quot; install'
              Execute="immediate"
              Return="ignore"/>
<InstallExecuteSequence>
    <Custom Action="InstallMyService"
            After="InstallFinalize"/>
</InstallExecuteSequence>

注意:此操作需要在运行之前设置MY_HOME变量。

安装此MSI时,我得到一个日志,显示在运行自定义操作“InstallMyService”之前已设置MY_HOME变量,但安装我的服务的命令仍然失败。我发现原因是当命令调用时,MY_HOME仍未设置。

安装完成后,MY_HOME按预期设置,但自定义操作失败:(

如何解决此问题?

2 个答案:

答案 0 :(得分:6)

Windows Installer和自定义操作通过服务控制管理器进行托管,该管理器长期以来不遵守发布环境更改时发送的广播消息。因此,即使你修复了Yan提到的你不会发现你的自定义操作仍然没有环境变量的即时/延迟问题。

为什么不只是将“[APPLICATIONPATH] myapp”传递给你的.bat文件并以%2的形式获取它?

BTW我也不建议从安装程序调用批处理文件。看到安装程序突然出现黑色小窗口,这很脆弱,令人尴尬。

答案 1 :(得分:2)

你的CA是即时的。这意味着它在Windows Installer处理您的MSI包时立即运行。这显然发生在安装包含<Environment/>的组件之前。将其修改为延迟(Execute="deferred")并在InstallFinalize之前安排。