以前作ったJavaScriptのシェルを、ほんのちょっとだけ改良した。
以下、新しいjssh.jsです。
(function(){
if(/wscript\.exe$/i.test(WScript.FullName)){
(new ActiveXObject('WScript.Shell')).run('cscript "' + WScript.ScriptFullName + '"');
return;
}
var echo = function(s){ WScript.echo(s); };
var alert = function(s){ echo(s); };
var dump = function(o){ for(var k in o) echo(k + ' = ' + o[k]); }
var stdin = WScript.stdin;
var stdout = WScript.stdout;
var stderr = WScript.stderr;
while(true){
WScript.stdout.Write('js>');
var src = stdin.readline();
if(src == 'exit') break;
if(src == ';'){
src = (function(){
var lines = [];
while(true){
var line = stdin.readline();
if(line == ';') return lines.join('\n');
lines.push(line);
}
})();
}
try{
var ret = eval(src);
if(ret) echo(ret);
}catch(e){
WScript.stderr.WriteLine(e.message);
}
}
stderr.Close();
stdout.Close();
stdin.Close();
})();
変更点は、wscript.exeで実行されたとき、自動的にcscript.exeで実行しなおす、というもの。それだけです。
従来のコードでは、コマンドプロンプトを自分で起動して「cscript jssh.js」と入力して起動させる必要がありました。単にjsファイルをダブルクリックしただけだと、通常はwscriptで実行されてしまい、標準入出力が使えないのでエラーになってしまいます。
今回の修正により、普通にダブルクリックしただけでも自動的にcscriptで起動するようになりました。これでいちいちバッチファイルを作ったりする必要もなくなり、より手軽に使えるようになったと思います。
最近気付いたけど、何か実際に作ったりするときはFirebugとかの方が便利なんですが、JavaScriptの本を読みながらちょっと試してみたい時とかはこういうjssh.jsみたいなのを使うと簡単。ただMicrosoftのエンジンを使うところが難点となることもあるので、そういうときはRhinoとかで同じようなシェルを作ることはできるのかな。っていうかRhinoには付いてくるんだっけ?Mozilla系のエンジンでは無理?