WiX:如果特定可执行文件不在PATH中,则中止安装

时间:2012-02-06 15:18:48

标签: wix dependencies windows-installer

我目前正在使用需要运行Java的WiX打包软件。因此,我想在安装期间检查java.exePATH中的某个位置,如果找不到则会中止。 http://sourceforge.net/mailarchive/message.php?msg_id=23451655中的解决方案接近我的需求,但我不想搜索注册表,而是想在PATH变量的目录中查找依赖项。

WiX可以轻松实现吗?如果不是,是否可以根据自定义操作的返回值设置属性的值。然后我可以编写一个查找Java的批处理脚本,并相应地设置<Condition>的属性。

2 个答案:

答案 0 :(得分:4)

我会立即制作一个自定义操作,可以执行以下操作:

  • 抓取PATH环境变量的值。您可以使用[%PATH]语法
  • 通过;拆分,迭代并找到有问题的目录
  • 来解析它
  • 检查目录是否存在且java.exe是否存在
  • JAVA_IS_INSTALLED属性设置为1,以防它存在,否则根本不设置。这可以使用DTF(随WiX Toolset提供的框架)session["JAVA_IS_INSTALLED"] = 1完成。
  • 使用<Condition>属性
  • 添加JAVA_IS_INSTALLED元素

注意:应该在LaunchConditions操作之前安排自定义操作,并且应该驻留在两个序列中(InstallUISequence和InstallExecuteSequence)

答案 1 :(得分:2)

根据Yan的回答,我实现了这样的功能:

我的WiX来源包含:

<Binary Id="B.CustomActionsScript" SourceFile="CustomActions.js" />
<CustomAction
    Id="CA.runJava"
    BinaryKey="B.CustomActionsScript"
    JScriptCall="runJava"
    Execute="immediate"
    Return="check" />

<Condition Message="The Java Runtime Environment is not installed.">
  Installed OR JAVA_IS_INSTALLED
</Condition>

<InstallUISequence>
  <Custom Action="CA.runJava" Before="LaunchConditions">NOT Installed</Custom>
</InstallUISequence>

<InstallExecuteSequence>
  <Custom Action="CA.runJava" Before="LaunchConditions">NOT Installed</Custom>
</InstallExecuteSequence>

CustomActions.js包含此功能:

function runJava() {
  try {
    var shell = new ActiveXObject("WScript.Shell");
    shell.Run("java -version", 0, true);

    Session.Property("JAVA_IS_INSTALLED") = "1";
  } catch (ex) {
  }
  return 1;
}

而不是在java.exe中查找PATH而不是通过尝试执行它来检查Java是否已安装。如果无法执行Java Exec则抛出异常,并且永远不会设置JAVA_IS_INSTALLED