WiX:如果路径中没有特定的可执行文件,则中止安装

WiX:如果路径中没有特定的可执行文件,则中止安装,wix,dependencies,windows-installer,Wix,Dependencies,Windows Installer,我目前正在使用WiX打包软件,该软件需要Java才能运行。因此,我想在安装过程中检查java.exe是否位于路径中的某个位置,如果找不到,则中止。中的解决方案接近我的需要,但我不想搜索注册表,而是想在PATH变量的目录中查找依赖项 WiX很容易做到这一点吗?如果没有,是否可以根据自定义操作的返回值设置属性值。然后,我可以编写一个批处理脚本,查找Java并相应地设置的属性。我将立即编写一个自定义操作,该操作将执行以下操作: 获取PATH环境变量的值。您可以使用[%PATH]语法 通过按拆分来解析

我目前正在使用WiX打包软件,该软件需要Java才能运行。因此,我想在安装过程中检查
java.exe
是否位于
路径中的某个位置,如果找不到,则中止。中的解决方案接近我的需要,但我不想搜索注册表,而是想在
PATH
变量的目录中查找依赖项


WiX很容易做到这一点吗?如果没有,是否可以根据自定义操作的返回值设置属性值。然后,我可以编写一个批处理脚本,查找Java并相应地设置
的属性。

我将立即编写一个自定义操作,该操作将执行以下操作:

  • 获取PATH环境变量的值。您可以使用
    [%PATH]
    语法
  • 通过按
    拆分来解析它,迭代并查找有问题的目录
  • 检查目录是否存在,以及是否存在
    java.exe
  • JAVA\u已安装
    property设置为
    1
    (如果有),否则根本不进行设置。这可以通过DTF(WiX工具集提供的框架)的会话[“JAVA_已安装”]=1来完成
  • 使用
    JAVA\u已安装
    属性添加
    元素

注意:自定义操作应该在启动条件操作之前安排,并且应该位于两个序列中(InstallUISequence和InstallExecuteSequence)

根据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>
我不是在
路径中查找
java.exe
,而是通过尝试执行来检查是否安装了java。如果Java无法执行,
Exec
抛出异常,并且
Java\u已安装
从未设置

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;
}