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.jsevar sh = WScript.CreateObject("WScript.Shell");
var ret = sh.Popup("Hello World.", 0, "Windows Script Host", 0+0+0)
WScript.Echo(ret);
結果
補足
指定のアイコン種類によっては、ポップアップ表示時にサウンドを出力する。
VBScriptのMsgBox関数は、Popupで代替えが可能なはず。
テキスト入力ダイアログ
wsfファイルのVBScriptを呼び出す
サンプル
inputbox1.wsf<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を使用する
サンプル
inputbox2.jsefunction 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
- 64bitコマンドプロンプトでinputbox2.jseを実行する
- 「Microsoft JScript 実行時エラー: オートメーション サーバーはオブジェクトを作成できません。」エラーとなる
- 上記コマンドを64bitコマンドプロンプトで実行する
- 表示中のコマンドプロンプトが32bit環境になる
- 再度inputbox2.jseを実行する
- 動作する
- 64bitコマンドプロンプトでinputbox2.jseを実行する
- 例2
- 「ファイル名を指定して実行」などで上記コマンドを実行して32bitコマンドプロンプトを表示する
- 32bitコマンドプロンプトでinputbox2.jseを実行する
- 例3
- 64bitコマンドプロンプトで「%windir%\SysWoW64\cmd.exe /C cscript inputbox2.jse」など、32bitコマンドプロンプト経由で実行する
IEのpromptを使用する
サンプル
inputbox3.jsefunction 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
では、入力ストリームの文字列を返す。
サンプル
stdin.jsevar 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)
サンプル
stdin.jsevar 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)
サンプル
stdin2.jsevar 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の内容をコマンドプロンプトに出力します
名前なし引数(ドラッグ&ドロップ)
サンプル
args.jsevar 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
※ドラッグ&ドロップした場合、ファイルパスを表示する。
名前付き引数
サンプル
args2.jsevar test = WScript.Arguments.Named.Item('test');
WScript.Echo(test);
結果
C:\jscript>cscript args2.jse /test:"Hello World"
Hello World