JScript書いてて困った。
今までWSHでの開発にはVBScriptを使っていたが、だんだん面倒になってきた。というかIf
とかFor
とか、頭文字の大文字にわざわざShift押すのがメンドクサイ。じゃあって事でWSH標準で使えるもう一つの言語、JScriptでコードを書いてみた。
さて、途中でユーザの入力を受け取る必要が在った訳だが、『JScriptなんてしょせんJavaScriptクローン』と思っていた私は迷うことなく次のようなコードを書いた。
result = prompt('入力してください', '規定値');
……あれー、エラーになるー?
MSDNライブラリやWSHのヘルプを調べてみると、WSH上のJScriptにはprompt()
は用意されていない模様。同等の働きをする関数も無い。
ちょ、JScript使えねー。うーん、やっぱVBScript使うかなぁ。
しかし此処でふと思った。そういえばWSHの標準出力メソッドであるWScript.Echo
はGUI上でのアイコンダブルクリック等での実行の時はダイアログボックスで、CUI上でCSCRIPTコマンドで実行した場合はコマンドプロンプトの標準出力でと場合によってより相応しい方法での出力となる。何で入力はそういう『場合分け』出来るメソッドが無いんだろう?
という訳でサクッと作ってみたのがinput.vbs。どうぞ煮るなり焼くなり御自由に。
var result;
result = aslib_input("プロンプト文字列", "デフォルト値");
プロンプト文字列を表示してキー入力待ち、入力内容が戻り値となる。何も入力しないでEnter押した場合はデフォルト値に設定したものが返る。あー、こういう時って変数がバリアント型な言語だと楽だなぁ。
本当はVBScriptのInputBox()
並みに高機能にしたかった……てか入力待ちの時間を制限するなんてWSHで出来るのか?
WScript.FullName
で実行エンジンがGUI(WSCRIPT使用)かCUI(CSCRIPT使用)かを調べ、それぞれInputBox()
か、WScript.StdOut.Write()
とWScript.StdIn.ReadLine()
のあわせ技かを切り替えている。うーん、GUIかCUIかの判定に『エンジン名を調べる』という方法しか取れなかったのが残念。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使ってなかったのかというと、VBScriptの
CreateObject()
に相当するものがActiveXObjectなんてそのものずばり過ぎる名前だった事。JavaScriptパクリ言語のイメージが有った事が原因。
ところで前者は
WScript.CreateObject()
を使う事で解決。……これって、VBScriptのCreateObject()
、JScriptのActiveXObject
とはまた別のものなのだろうか?