JavaScriptの実行処理系Rhinoで各種パスを取得する方法で悩んだのでメモします。
Windows/Mac OS X/Linuxでの各OSごとの方法と共に。
以下は、普通にカレントディレクトリを取得する方法です。
var targetDir = getCurrentDir(); ... // 起動パスの取得 function getCurrentDir() { var f = new java.io.File("."); return f.getAbsoluteFile().getParent(); }
ちなみに、起動パラメータは、arguments配列に格納されています。
ただし、肝心のスクリプトの起動パスを取得するのはなかなかうまくいきません。
そこで、以下のように、シェルスクリプトと共同作業することにしました。
Linux/Mac OS Xで。スクリプト「hoge.js」を起動するとき、「hoge.sh」を作っておきます。
#!/bin/sh basedir=`dirname $0` export RHINO_SCRIPT_NAME="hoge.js" export RHINO_SCRIPT_PATH=${basedir} export RHINO_SCRIPT_SELF=${basedir}/${RHINO_SCRIPT_NAME} export RHINO_MAIN_CLASS="org.mozilla.javascript.tools.shell.Main" export RHINO_JAR_PATH=${basedir}/lib/js.jar java -Dfile.encoding=UTF-8\ -cp ${RHINO_JAR_PATH}\ ${RHINO_MAIN_CLASS}\ ${RHINO_SCRIPT_SELF} $*
そして、「hoge.js」の中で以下のように記述します。
// 環境変数の取得 var System = java.lang.System; var script_name = System.getenv("RHINO_SCRIPT_NAME"); var script_path = System.getenv("RHINO_SCRIPT_PATH"); var script_self = System.getenv("RHINO_SCRIPT_SELF"); print(script_name, script_path, script_self); quit();
Windowsでは以下のようになります。バッチファイルを使う場合は以下のとおりです。この場合、ソースコードの文字コードをSHIFT_JISにしないと、ドラッグした引数のファイルのファイル名が文字化けすることがあるので注意。
REM SET basedir=%~dp0 SET RHINO_SCRIPT_NAME=hoge.js SET RHINO_SCRIPT_PATH=%basedir% SET RHINO_SCRIPT_SELF=%basedir%%RHINO_SCRIPT_NAME% SET RHINO_MAIN_CLASS=org.mozilla.javascript.tools.shell.Main SET RHINO_JAR_PATH="%basedir%lib\js.jar";"%basedir%lib\***.jar" java -Dfile.encoding=SHIFT_JIS^ -cp %RHINO_JAR_PATH%^ %RHINO_MAIN_CLASS%^ %RHINO_SCRIPT_SELF% %* PAUSE
WSH/JSCRIPT を使う場合:
// JScriptからRhinoを起動 var shell = new ActiveXObject("WScript.Shell"); // パスを取得する var basedir = WScript.ScriptFullName.substr(0, WScript.ScriptFullName.length - WScript.ScriptName.length - 1); var RHINO_SCRIPT_NAME = "hoge.js"; var RHINO_SCRIPT_PATH = basedir; var RHINO_SCRIPT_SELF = basedir+"\\"+RHINO_SCRIPT_NAME; var RHINO_MAIN_CLASS = "org.mozilla.javascript.tools.shell.Main"; var RHINO_JAR_PATH = "\""+basedir + "\\lib\\js.jar\""; // ↑複数のJARファイルを指定する場合、";"で区切ること。 // 加えて、Windows XPでも動くように、パスの前後に"..."をつけること。 // 環境変数を設定 var env = shell.Environment("USER"); env("RHINO_SCRIPT_NAME") = RHINO_SCRIPT_NAME; env("RHINO_SCRIPT_PATH") = RHINO_SCRIPT_PATH; env("RHINO_SCRIPT_SELF") = RHINO_SCRIPT_SELF; env("RHINO_MAIN_CLASS") = RHINO_MAIN_CLASS; env("RHINO_JAR_PATH") = RHINO_JAR_PATH; // コマンドを構成する var cmd = [ "java", "-Dfile.encoding=UTF-8", "-cp " + RHINO_JAR_PATH + "", RHINO_MAIN_CLASS, "\"" + RHINO_SCRIPT_SELF + "\"" ]; // 引数を設定する for (var i = 0; i < WScript.Arguments.Count(); i++) { cmd.push("\"" + WScript.Arguments.Item(i) + "\""); } var cmd_str = "" + cmd.join(" ") + ""; // コマンドを実行 shell.Exec(cmd_str);
Mac/Win両対応する場合には、それぞれ、ファイルの改行コードや文字コードに注意。Windows(CR+LF)、MAC/LINUXでは、LFとします。
バッチファイルを少し修正し、Rhino自身に文字コードの差異を変換します。
Windowsのバッチファイルの文字コードはShift_JISです。以下は、Windows用バッチファイル。
rem=0;/* cd /d "%~dp0" java -Dfile.encoding=MS932 ^ -cp lib\js.jar;lib\****.jar ^ org.mozilla.javascript.tools.shell.Main %0 %* pause exit rem */ var maincode = readFile("***.js", "UTF-8"); eval(maincode);