日経PC OnlineでJavaScriptのプログラムを紹介していますが、その中で、Javaで実装されたJavaScript、Rhinoについて紹介することも多くあります。RhinoはそもそもJavaなので、OSを問わず動かすことができるのが魅力です。

それで、Rhinoで仕事に役立つバッチを作る場合で、しかも、OSを問わず動かしたいときには、ちょっとした工夫が必要になります。というのも、ソースコードの文字コードに注意が必要なのです。

Windows系で、バッチファイル(*.bat)に作業対象ファイルをドロップして、Rhinoのプログラムを起動する場合、ドロップされたファイルのパスは、Shift_JISとしてコマンドラインに渡されます。そのためJavaのランタイムを起動する際に、文字コードShift_JISを与えることになります。(この時、同じフォルダに、Rhinoの本体であるjs.jarを配置してある必要もあります。)

rem Rhino起動バッチファイル
java -Dfile.encoding=MS932 ^
  -cp .;js.jar
  org.mozilla.javascript.tools.shell.Main (Rhinoのソース) %*

このとき、Rhinoのソースコードは、Shift_JISで記述する必要があります。しかし、これでは、Mac OS XでRhinoのプログラムを動かすのに不都合が生じます。

そこで、考えたのが、Rhinoのプログラム内で、Rhinoのプログラムの文字コードを変換して実行するという裏技?!です。

メインプログラム自体はUTF-8で書くのですが、Windowsで実行する場合に、UTF-8のプログラムをShift_JISとして読み込んで、eval()することで、Shift_JISのプログラムとして実行します。

Windows用のバッチファイル:

rem=0;/*
cd /d "%~dp0"
java -Dfile.encoding=MS932 ^
  -cp .;js.jar ^
  org.mozilla.javascript.tools.shell.Main %0 %*
pause
exit
rem */

var maincode = readFile("メインプログラム.js", "UTF-8");
eval(maincode);

Mac OS X用のシェルスクリプト:

#!/usr/bin/java -Dfile.encoding=UTF-8 -cp ./js.jar org.mozilla.javascript.tools.shell.Main

load("メインプログラム.js");

もう少し頭を捻れば、もうちょっと良い方法もありそうなのですが・・・。
とりあえず現時点で思いつく、OS依存のないRhinoプログラムのバッチファイルからの起動方法です。

ちなみに、Mac OS Xでも、Rhinoをファイルのドラッグアンドドロップで実行する方法があります。Automator.appを使う方法と、AppleScriptを使う方法です。

上記のAppleScriptの方をちょっと改良して、ドラッグアンドドロップで、同じフォルダにあるシェルスクリプトを実行するようにしてみました。スクリプトをAppleScriptエディタで記述し、ファイルフォーマットを「アプリケーション」として保存します。

on main(input)
	-- スクリプトの名前
	set mainScript to "test.sh"
	-- 親ディレクトリの取得
	tell application "Finder" to set parentDirPos to parent of (path to me) as text
	set parentDir to ((alias parentDirPos)'s POSIX path)
	try
		do shell script "cd " & parentDir & ";./" & mainScript & space & input
	end try
end main

on open argv
	repeat with aFile in argv
		main(quoted form of POSIX path of aFile)
	end repeat
end open

on run
	-- ファイル選択を行う場合
	-- main(quoted form of POSIX path of (choose file))
	-- 引数をつけない場合
	main({})
end run