WSH(JScript) 外部入力関連

WSH(JScript)での外部入力関連まとめ

ポップアップメッセージ

関数
ret = sh.Popup(strText, [nSecondsToWait], [strTitle], [nType])

引数
strText
ポップアップウィンドウに表示するテキスト

nSecondsToWait
ポップアップウィンドウを閉じるまでの待機時間(秒)
0:無期限

strTitle
ポップアップウィンドウのタイトル

nType
ポップアップウィンドウに表示するボタンとアイコンの種類
ボタン種類とアイコン種類と標準ボタンを加算した値を指定する。

ボタン種類
0: [OK]ボタンを表示(クローズボタンは[OK])
1: [OK]と[キャンセル]ボタンを表示(クローズボタンは[キャンセル])
2: [中止]と[再試行]ボタンを表示(クローズボタンなし)
3: [はい]と[いいえ]と[キャンセル]ボタンを表示(クローズボタンは[キャンセル])
4: [はい]と[いいえ]ボタンを表示(クローズボタンなし)
5: [再試行]と[キャンセル]ボタンを表示(クローズボタンは[キャンセル])

アイコン種類
0: アイコンなし
16: [Stop]アイコンを表示
32: [?]アイコンを表示
48: [!]アイコンを表示
64: [i]アイコンを表示

標準ボタン
0: 第 1 ボタン
256: 第 2 ボタン
512: 第 3 ボタン
768: 第 4 ボタン

戻り値
ポップアップウィンドウ終了時にクリックしたボタンを示す整数値
1: [OK]
2: [キャンセル]
3: [中止]
4: [再試行]
5: [無視]
6: [はい]
7: [いいえ]
-1: タイムアウト
Popup メソッド

解説
グラフィカルなメッセージボックスを表示します。

サンプル

var sh = WScript.CreateObject("WScript.Shell");
var ret = sh.Popup('Hello World.', 0, 'Windows Script Host', 0+0+0)
WScript.Echo(ret);

結果
Hello World

補足
指定のアイコン種類によっては、ポップアップ表示時にサウンドを出力する。
VBScriptのMsgBox関数は、Popupで代替えが可能なはず。

テキスト入力ダイアログ

wsfファイルのVBScriptを呼び出す

サンプル

<job>
  <script language="VBScript">
    function vbInputBox(msg, title, def)
      vbInputBox = InputBox(msg, title, def)
    end function
  </script>

  <script language="JavaScript">
    var name = vbInputBox("質問", "タイトル", "初期値");
    WScript.Echo(name);
  </script>
</job>

解説
wsfにVBScriptのコードを記述して、JScript側からVBScriptを呼び出す。

wscファイルのコードを実行する

サンプル
今更だが JScript で VBScript の Inputbox を使う - Qiita

解説
wscにVBScriptのコードを記述して、GetObjectで呼び出して使用する。

ScriptControlを使用する

サンプル

function InputBox(prompt, title, def) {
  var ret;
  var sc = new ActiveXObject("MSScriptControl.ScriptControl");
  sc.language = "VBScript";
  sc.addCode(''
      + 'Function vbInputBox()'
      + '    vbInputBox = InputBox("' + prompt + '", "' + title + '", "' + def + '") '
      + 'End Function');
  ret = sc.eval("vbInputBox");
  sc = null;
  return ret;
}

var ret = InputBox('質問', 'タイトル', '初期値');
WScript.Echo(ret);

解説
ScriptControl経由で実行する。

64bitのWindowsを使用している場合、32bit版のcscript/wscriptを使用しないとエラーになる。(特別なにもしない場合、64bit環境では64bit版を使用するため、エラーになる)

以下のコマンドで32bit用のコマンドプロンプトを呼び出せる。

%windir%\SysWoW64\cmd.exe
  1. 例1
    • 64bitコマンドプロンプトでinputbox2.jseを実行する
      • 「Microsoft JScript 実行時エラー: オートメーション サーバーはオブジェクトを作成できません。」エラーとなる
    • 上記コマンドを64bitコマンドプロンプトで実行する
      • 表示中のコマンドプロンプトが32bit環境になる
    • 再度inputbox2.jseを実行する
      • 動作する
  2. 例2
    • 「ファイル名を指定して実行」などで上記コマンドを実行して32bitコマンドプロンプトを表示する
    • 32bitコマンドプロンプトでinputbox2.jseを実行する
  3. 例3
    • 64bitコマンドプロンプトで「%windir%\SysWoW64\cmd.exe /C cscript inputbox2.jse」など、32bitコマンドプロンプト経由で実行する

IEのpromptを使用する

サンプル

function prompt(text, value) {
  var ie = new ActiveXObject("InternetExplorer.Application");
  ie.Visible = 0;
  ie.Navigate("about:blank");

  while (ie.Busy) {}

  var ret = ie.Document.parentWindow.prompt(text, value);
  ie.Quit();
  ie = null;
  return ret;
}

var ret = prompt('質問', '初期値');
WScript.Echo(ret);

解説
IEのpromptを使用する。

タイトルが"Explorer ユーザープロンプト"になる。
質問の前に"スクリプト プロンプト:"の表示が増える。
表示位置が画面中央ではないことがある。
プロンプトの起動が遅い。

IEのexecScriptで実行する

解説
IEのexecScriptで実行する。(エラーとなる)

InputBox関数は、クロスサイトスクリプティング対策で正常に実行できずエラーとなる。

標準入力

関数
WScript.StdIn.ReadAll(strText)

引数
なし

戻り値
入力ストリーム全体を読み込み文字列
ReadAll メソッド (Windows Script Host)

解説
cscript.exeのWSHエンジンでのみ使用可能です。
wscript.exeでは、エラーとなる。
cscript.exeでは、入力ストリームの文字列を返す。

サンプル

var text = '';
while (!WScript.StdIn.AtEndOfStream) {
  text += WScript.StdIn.ReadAll();
}
WScript.Echo(text);

結果(パイプから入力)

C:\jscript>echo Hello World | cscript stdin.jse
Hello World

結果(ファイルから入力)

C:\jscript>cscript stdin.jse < fileout.txt
Hello World

※fileout.txtを事前に準備する必要あり
 fileout.txtの内容をコマンドプロンプトに出力します

テキストファイル入力(FileSystemObject)

サンプル

var fs, file, text;
fs = new ActiveXObject("Scripting.FileSystemObject");
file = fs.OpenTextFile("c:\\jscript\\fileout.txt");
text = file.ReadAll();
file.Close();
WScript.Echo(text);

結果

C:\jscript>cscript filein.jse
Hello World

※fileout.txtを事前に準備する必要あり
 fileout.txtの内容をコマンドプロンプトに出力します

テキストファイル入力(ADODB.Stream)

サンプル

var sr, fullpath, type, option, charset;
fullpath = "c:\\jscript\\fileout.txt";
type = 2;               // 2: テキストファイル
charset = 'shift-jis';  // Shift-JIS

sr = new ActiveXObject('ADODB.Stream');
sr.Type = type;
sr.Charset = charset;
sr.Open();
sr.LoadFromFile(fullpath);
text = sr.ReadText();
sr.Close();
sr = null;
WScript.Echo(text);

結果

C:\jscript>cscript filein2.jse
Hello World

※fileout.txtを事前に準備する必要あり
 fileout.txtの内容をコマンドプロンプトに出力します

名前なし引数(ドラッグ&ドロップ)

サンプル

var args = [];
for (var i=0; i<WScript.Arguments.Unnamed.length; i++) {
  args.push(WScript.Arguments.Unnamed.Item(i));
}

WScript.Echo(args.join('\n'));

結果

C:\jscript>cscript args.jse Hello World
Hello
World

※ドラッグ&ドロップした場合、ファイルパスを表示する。

名前付き引数

サンプル

var test = WScript.Arguments.Named.Item('test');
WScript.Echo(test);

結果

C:\jscript>cscript args2.jse /test:"Hello World"
Hello World

ファイル選択ダイアログボックス

ファイル保存ダイアログボックス

フォルダ選択ダイアログボックス

参考

WSH JScriptを使いこなそう ~情報の入力方法~

関連

  1. WSH(JScript) 外部出力関連
  2. WSH(JScript) 外部入力関連

コメント: 2

shoshiminpapa さんのコメント...

すいません。教えて下さい。
『ScriptControlを使用する』で64bit環境で動かしたいのですが、よく分かりません。
『%windir%\SysWoW64\cmd.exe』をどのように使えばよいのでしょうか。
上のコードの一番上に入れるのでしょうか?

よろしくお願いいたします。

toshi さんのコメント...

shoshiminpapaさん

遅くなりましたが、『ScriptControlを使用する』の使用例を3例追記しました。

ご確認ください。

コメントを書く