コネタ+小物シェル2007年05月10日 21時30分20秒

WSH オブジェクト

dara-j自身は最近まで知らなかったが、JScriptにて次の評価が true を返す。

WSH === WScript
ようするに、WScript.Argumentsだのと記述するときにちょっとだけタイプ量を減らせるっちゅーことですな。

ついでにシェル環境

っていうのかな。コンソールでスクリプト入力して即評価するっつーよくあるやつです。

いずれもっと高機能なやつを考えてるけど、これはこれでコンパクトなので公開。

ソースはこれだけ。

if( /wscript\.exe/i.test( WSH.FullName ) ) {
	new ActiveXObject( "WScript.Shell" ).Run( "cmd /k cscript //nologo \"" + WSH.ScriptFullName + "\"" );
	WSH.Quit();
}

// ↓これ、いらないじゃん(07.5.10 23:46)
//function print() {
//	var a = [];
//	for( var i = 0; i < args.length; i++ ) a.push( arguments[ i ] );
//	WSH.Echo( a );
//}

with( {
	$_A : function( args ) {
		var a = [];
		for( var i = 0; i < args.length; i++ ) a.push( args[ i ] );
		return a;
	},
	_p : "js>",
	_print : function() {
		var a = arguments;
		for( var i = 0; i < a.length; i++ ) WSH.StdOut.Write( a[ i ] );
	},
	_in : "",
	print : function() {
		WSH.Echo( this.$_A( arguments ).join( "" ) );
	},
	read : function(m) {
		if( m ) this._print( m );
		return WSH.StdIn.ReadLine();
	}
} ) {
	while( ( _in = read( _p ) ) != "exit" ) {
		try {
			print( eval( _in ) );
		} catch( e ) {
			print( e.description );
		}
	}
}
特に機能はなくて、せいぜいが
  • print()関数がある。引数リストはすべて連結される。ex. print(1,2,3)// 123
  • exitステートメント(?)で終了
ぐらいです。 ごにょごにょとwithブロックで囲ってるのは、式評価時に参照されるグローバル変数を作りたくなかったから。これなら実行時にどんな(いいすぎ。組み込みの名前は保護できないし)名前の変数を宣言してもこのスクリプト自身の環境を壊さないので。

追記:ああ、print()関数は保護されないや、よく見たら。

さらに追記:うあ、グローバルな定義のprint()関数、いらないじゃん。てことでコメントアウト。