2006年07月29日

GUI上でもCUI上でもソレっぽく使えるWSH用入力関数を作ってみた。

JScript書いてて困った。

今までWSHでの開発にはVBScriptを使っていたが、だんだん面倒になってきた。というかIfとかForとか、頭文字の大文字にわざわざShift押すのがメンドクサイ。じゃあって事でWSH標準で使えるもう一つの言語、JScriptでコードを書いてみた

さて、途中でユーザの入力を受け取る必要が在った訳だが、『JScriptなんてしょせんJavaScriptクローン』と思っていた私は迷うことなく次のようなコードを書いた。

result = prompt('入力してください', '規定値');

……あれー、エラーになるー?
MSDNライブラリやWSHのヘルプを調べてみると、WSH上のJScriptにはprompt()は用意されていない模様。同等の働きをする関数も無い
ちょ、JScript使えねー。うーん、やっぱVBScript使うかなぁ。

しかし此処でふと思った。そういえばWSHの標準出力メソッドであるWScript.EchoGUI上でのアイコンダブルクリック等での実行の時はダイアログボックスで、CUI上でCSCRIPTコマンドで実行した場合はコマンドプロンプトの標準出力でと場合によってより相応しい方法での出力となる何で入力はそういう『場合分け』出来るメソッドが無いんだろう?

という訳でサクッと作ってみたのがinput.vbs。どうぞ煮るなり焼くなり御自由に。

var result;
result = aslib_input("プロンプト文字列", "デフォルト値");

プロンプト文字列を表示してキー入力待ち、入力内容が戻り値となる。何も入力しないでEnter押した場合はデフォルト値に設定したものが返る。あー、こういう時って変数がバリアント型な言語だと楽だなぁ。

本当はVBScriptInputBox()並みに高機能にしたかった……てか入力待ちの時間を制限するなんてWSHで出来るのか?

WScript.FullNameで実行エンジンがGUI(WSCRIPT使用)かCUI(CSCRIPT使用)かを調べ、それぞれInputBox()か、WScript.StdOut.Write()WScript.StdIn.ReadLine()のあわせ技かを切り替えている。うーん、GUICUIかの判定に『エンジン名を調べる』という方法しか取れなかったのが残念。WSCRIPT.EXE、CSCRIPT.EXE以外の第3のエンジンが在った場合判定しようが無いじゃないか。取り合えず『知らないエンジン名だったらエラー投げる』という仕様にしてある。

使う場合はスクリプト自体をWindows スクリプト ファイルにして<script>要素で読み込む必要が在る。

<?xml version="1.0" ?>
<package>
    <job id="testInput">
        <script language="VBScript" src="input.vbs"></script>
        <script language="JScript">
        <![CDATA[
        var res = input("prompt", "title", "default");
        WScript.Echo(res);
        ]]>
        </script>
    </job>
</package>
頭文字の大文字にわざわざShift押すのがメンドクサイ
VBScriptは大文字と小文字を区別しないのでどちらかだけで書けば良いだけの話なのだが。やっぱり、そこは、ねぇ?きちんとしたくならない?
JScriptでコードを書いてみた

今まで何でJScript使ってなかったのかというと、VBScriptCreateObject()に相当するものがActiveXObjectなんてそのものずばり過ぎる名前だった事。JavaScriptパクリ言語のイメージが有った事が原因。

ところで前者はWScript.CreateObject()を使う事で解決。……これって、VBScriptCreateObject()、JScriptのActiveXObjectとはまた別のものなのだろうか?

ラベル:WSH VBScript JScript GUI CUI
posted by 天井冴太 at 19:04| Comment(0) | TrackBack(0) | Hack | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください

この記事へのトラックバック