先日から、Rhinoを使っていろいろプログラムを作っています。
それで、Mac OS Xで作って使っているのは問題ないのですが、
せっかくJava上で動くのだからと、Windowsでも動かそうとしています。
ところが、意外とjavaコマンド(JREのJava)を実行するのが難しく苦慮しています。

大抵の環境では、Systemディレクトリ以下にjava.exeが入っているので、(ここにはパスが通っているので)普通に「java -jar xxx.jar」のようなコマンドのバッチファイルを作るだけで良いはずです。

しかし、最近インストールした、Windows8(64bit)では、Systemディレクトリに、
Javaコマンドはコピーされませんでした(!)

また、いろいろ調べてみると、レジストリのキーにJREのバージョンやパスが書かれているとありました。(それは以下のキーです。)

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment

しかし、上記の環境では、Javaをインストールしても、ここに値が設定されません。
そこで、レジストリ内を検索し、(さらに追加調査してみると)64bit版のWindowsには以下のキーに設定が書かれることが分かりました。紛らわしいですね。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment

とは言え、64bitだからと言って、必ずこのキーに設定が書かれるわけではないようで・・・かなり厄介です。そこで、WSH/JScriptでJava(JRE)を起動するために、以下のようなコードを書いてみました。

// シェルオブジェクトを取得
var shell = new ActiveXObject("WScript.Shell");
// Javaコマンドのパスを取得(32bit/64bit対応)
var jre_java = "", jre_ver, jre_home;
var rpath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment"; 
try {
  jre_ver = shell.RegRead(rpath+"\\CurrentVersion");
  jre_home = shell.RegRead(rpath+"\\"+jre_ver+"\\JavaHome");
  jre_java = jre_home + "\\bin\\javaw.exe";
} catch(e) {
  try {
    rpath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\JavaSoft\\Java Runtime Environment";
    jre_ver = shell.RegRead(rpath+"\\CurrentVersion");
    jre_home = shell.RegRead(rpath+"\\"+jre_ver+"\\JavaHome");
    jre_java = jre_home + "\\bin\\javaw.exe";
  } catch (e) {
    WScript.Echo(
      "Javaがインストールされていません。\n"+
      "ダウンロードページを開きます。");
    var sa = new ActiveXObject("Shell.Application");
    sa.Open("http://java.com/");
    WScript.Quit();
  }
}
// コマンドを構成する
var cmd = [
  jre_java,
  "-Dfile.encoding=UTF-8",
  "-cp \"" + JAR_PATH + "\"",
  MAIN_CLASS
];
// 引数を設定する
for (var i = 0; i < WScript.Arguments.Count(); i++) {
  cmd.push("\"" + WScript.Arguments.Item(i) + "\"");
}
var cmd_str = "" + cmd.join(" ") + "";
shell.Exec(cmd_str);

以上。