コンソールの入出力2007年05月08日 00時56分41秒

CScriptでの標準入出力

まあ、特に難しいことはないのだが、コンソールへの入出力+αのまとめってことで。

まず一番シンプルな「1行出力」。これは至極簡単で

WScript.Echo( "行出力" );
でよい。ただし、ホストがWScript.exeの場合はポップアップメッセージになるので注意。

次に入力だが、これはWScript#StdInオブジェクトを経由する。こんな感じ。

var input = WScript.StdIn.ReadLine();
WScript#StdInプロパティは、fsoのTextStreamオブジェクトとほぼ同等のメンバを備えているので他にReadメソッドも使えるが、結局Enterキーが必要になるので実質的にこのReadLineメソッドを使用することになる。ちなみにホストがWScript.exeの場合、StdInプロパティへのアクセスはエラーになるのでCScript実行時のみ使用すること。

改行を出力しない文字列出力は、WScript#StdOutプロパティを経由して、こんな感じで行う。

// 次の2行の実行で、
// 「WScript.StdOut.Write()」とひとつながりで出力される
WScript.StdOut.Write( "WScript." );
WScript.StdOut.Write( "StdOut.Write()\r\n" );
WScript#StdOutもTextStreamと同様に(出力専用だが)扱えるのでWriteLineメソッドも使用できる。この場合は、WScript#Echoと同様に改行込みで出力される。WScript実行時にエラーになるのはStdInと同様。

おまけになるが、CScript起動でもポップアップメッセージは使用できる。WScriptオブジェクトではなく、WshShellオブジェクトを使用する。

new ActiveXObject("WScript.Shell").Popup( "ポップアップです。" );
このコードはホストに依存しないので、WScriptだろうがCScriptだろうが、さらにはHTAだろうがWshShellオブジェクトをcreateできるなら実行可能。Popupメソッドは指定秒後に自動的に閉じるなど、WScript#Echoよりも機能があるのでリファレンスを確認してみると使い道がいろいろあるかも。

ユーティリティオブジェクトにまとめてみる

ここまでの説明で普通に入出力はできるが、なんとなくユーティリティオブジェクトにまとめたサンプルを載せてみる。 ついでに起動ディレクトリ(実行中のjsファイルがあるディレクトリ)などの情報もまとめて「JScript」オブジェクトをでっち上げてみた。

var JScript = {
	// WshShellのインスタンス
	shell : new ActiveXObject("WScript.Shell"),
	// 起動ディレクトリ
	startupPath : WScript.ScriptFullName.substr( 0, WScript.ScriptFullName.lastIndexOf("\\") ),
	// スクリプトファイル名
	name : WScript.ScriptName,
	console : {
		// 文字列出力
		print : function(str) {
			WScript.StdOut.Write( str || "" );
		},
		// 文字列の行出力
		println : function(str) {
			WScript.Echo( str || "" );
		},
		// 文字列入力
		readln : function() {
			return WScript.StdIn.ReadLine();
		},
		// ポップアップアラート(consoleじゃないけど)
		popup : function(str, title) {
			JScript.shell.Popup( str || "", 0, title || WScript.ScriptName );
		}
	}
}
// cscriptで起動しなおし
if( /wscript\.exe$/i.test( WScript.FullName ) ) {
	JScript.shell.Run( "cscript \"" + WScript.ScriptFullName + "\"" );
	WScript.Quit();
}

// println
JScript.console.println( "println()で出力" );

JScript.console.println();

// print
JScript.console.print( "print()で出力..." );
JScript.console.print( "しました。\r\n" );

JScript.console.println();

// startupPathとnameをprintlnで出力
with( {
	keys : [ "startupPath", "name" ],
	index : 0
} ) {
	do {
		JScript.console.println( keys[index] + " -> " + JScript[ keys[index] ] );
	} while( ++index < keys.length )
}

JScript.console.println();

// print + readln -> println
JScript.console.print( "なんか入力してください > " );
JScript.console.println( "あんたの入力 => " + JScript.console.readln() );

JScript.console.println();

// popup
JScript.console.popup( "おわり", "JScript.console テスト" );
コマンドライン引数の展開機能やWshShell#Execで外部プロセスを実行した結果を取得する機能などを追加したりするとちょっとしたライブラリになるかと。

コメント

コメントをどうぞ

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

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

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

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/05/08/1492422/tb

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