Основываясь на ответе Яна, я реализовал эту функцию так:
Мой источник 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
никогда не устанавливается.