【问题标题】:Set environment variable before running a custom action in WiX在 WiX 中运行自定义操作之前设置环境变量
【发布时间】:2013-07-08 03:39:44
【问题描述】:

我必须使用WiX 构建一个基于MSI 的安装程序,并且我需要在运行命令操作之前设置环境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 已按预期设置,但自定义操作失败:(

我该如何解决这个问题?

【问题讨论】:

    标签: wix custom-action


    【解决方案1】:

    Windows 安装程序和自定义操作是通过服务控制管理器托管的,该管理器长期以来一直不尊重通知环境更改而发送的广播消息。因此,即使您修复了 Yan 提到的即时/延迟问题,您也会发现您的自定义操作仍然没有环境变量。

    为什么不直接将“[APPLICATIONPATH]myapp”传递给您的 .bat 文件并将其作为 %2 获取?

    顺便说一句,我也不建议从安装程序调用批处理文件。看到安装运行时弹出黑色小窗口是脆弱和尴尬的。

    【讨论】:

    • 没问题。顺便说一句,我工作中的妙语之一是“1980 年代被调用,他们希望恢复他们的环境变量。” :)
    • 顺便说一句,看看 WiX Quiet Exec 自定义操作扩展。这是一种相当不错的方式来减轻我对在安装中调用 EXE 和 BAT 的许多担忧。它会关闭 DOS 窗口并将输出记录到您的 MSI 日志中。
    【解决方案2】:

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

    【讨论】:

    • 这对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多