WSHで外部スクリプトのロード2007年04月24日 03時16分33秒

方針

すなおに.wsfにすればあまり苦労はないんだけど、XML中にスクリプトを書くのはなんとなく収まりが悪いので、.jsファイルのみの方向で。

基本的な考え方

とはいってもJScript自体にも、WScriptにもファイルをインクルードする機構はないから、eval()するしかない。

しかし、ライブラリロードでグローバル変数を消費するのはなんだかヤなので、withブロックで使い捨てスコープを形成することにする。

問題点

eval()はeval自身を呼び出した実行コンテキストをそのまま引き継ぐので(あってるのか?)ライブラリソースをevalする関数を作成すると、いつまでたってもグローバル空間にスクリプトはロードされない。

仕方ないので、ソースのロードのみ関数にして、あとはグローバルコンテキスト中でeval()することに。

で、実装

骨組みは以下の通り。

with( {
	// ライブラリのパスリスト
	libs : [
		/* ここにライブラリのパスを列挙する */
	],
	// libs[]のインデックス
	index : 0,
	// ソース取得メソッド
	getSource : function(path) {
		var stream, fso = new ActiveXObject("Scripting.FileSystemObject");
		try {
			stream = fso.OpenTextFile( path, 1 );
			return stream.ReadAll();
		} finally {
			stream.Close();
		}
	}
} ) {
	while( index < libs.length ) {
		try {
			eval( getSource( libs[ index++ ] ) );
		} catch(e) {
			WScript.Echo( e.description || e.message || "error" );
		}
	}
}

たとえば、

function test(a, b) {
	return a + b;
}
なんてソースを「lib.js」とした場合、
with( {
	// ライブラリのパスリスト
	libs : [
		"lib.js"
	],
	// libs[]のインデックス
	index : 0,
	// ソース取得メソッド
	getSource : function(path) {
		var stream, fso = new ActiveXObject("Scripting.FileSystemObject");
		try {
			stream = fso.OpenTextFile( path, 1 );
			return stream.ReadAll();
		} finally {
			stream.Close();
		}
	}
} ) {
	while( index < libs.length ) {
		try {
			eval( getSource( libs[ index++ ] ) );
		} catch(e) {
			WScript.Echo( e.description || e.message || "error" );
		}
	}
}
WScript.Echo( test( "A", "B" ) ); // 'AB'
となる。 このままだとShift_JISでローカルディスクにあるライブラリしかロードできないが、あとでXHRとADODB.Streamを組み合わせてgetSourceメソッドを書き換えればWebサーバにあるライブラリのロードもできるようになる。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/04/24/1462054/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。