Windows Script Host (MSH)


 
WScript ふたりのホスト
 

 Windows の GUI 環境からバッチ処理を実行したい。こんな目的で試していると混乱することがあった。実行方法に二通りあり、どちらかで使えないメソッドやプロパテイがあるのに気付くのは混乱した後からだ。 僕だけじゃないみたいです。googleで解決のヒントを検索していると、同じようなQ&Aがみかけられた。
 Windows98から導入されたWindows Script Hostの仕組みの実体はC:\WINDOWSにあるwscript.exeです。もう一つC:\WINDOWS\COMMANDにcscript.exeがありますが、これはコマンドライン用です。ホストが二人いた訳です。
 どちらのホストも、スクリプトの実行時、C:\WINDOWS\SYSTEMのwshom.ocx、vbScript.dll jscript.dllを利用してスクリプトを実行します。玄関先にポーターが二人いたということでしょうか。

1.  ダブルクリックでスクリプト

 Windows の GUI 環境からスクリプトを実行。これには、エクスプローラ内またはデスクトップ上でスクリプトをダブルクリックする。

[スタート] メニューの [ファイル名を指定して実行] をクリックし、スクリプトの名前を入力して実行。これも同じ効果です。

 この場合、wscript.exeがホストです。

2.  [ファイル名を指定して実行]

 [スタート] メニューの [ファイル名を指定して実行] をクリックします。[名前] ボックスに「cscript」または「wscript」と入力し、続けてスクリプトの名前を入力します。
 この場合、ホストが選べます。

3.   スクリプトを右クリック   

 Windows エクスプローラ内でスクリプトを右クリックします。wscript で実行するには [開く] をクリックし、cscript で実行するには [MS-DOS プロンプトで開く] (Windows 9x の場合) をクリックします。

 この場合、ホストが選べます。

4. DOSプロンプトのコマンド ライン

 DOSプロンプトのコマンド ラインに「cscript」または「wscript」と入力し、続けてスクリプトの名前を入力します。

 この場合、ホストが選べます。


 

既定のホスト
 

 インストール後の初期状態では、wscript が既定のホストとして設定されています。既定のホストを cscript に変更するには、コマンド ラインに次のように入力します。
cscript //h:cscript

また、cscript から wscript に切り替えるには、次のように入力します。
wscript //h:cscript

上の1.の場合、既定のホストの設定によって結果が違います。注意しましょう。


 

拡張子とホスト
 

 JScript(JavaScript)でコーデングすると拡張子はJSです。VBScriptですとVBS。XML形式にまとめるとWSFです。

 関連付けされていない拡張子を持つスクリプト ファイルをダブルクリックした場合は、[ファイルを開くアプリケーションの選択] ダイアログ ボックスが表示されます。このダイアログ ボックスで wscript を選択し、[このファイルを開くときは、いつもこのアプリケーションを使う] チェック ボックスをオンにすると、wscriptが既定のアプリケーションとしてが登録されます。

 拡張子により既定のホストの設定に違いがあるかもしれません。注意しましょう。
 .wsf ファイルを使うと、スクリプトごとにオプションを設定することができます。この形式に慣れるのがいいかもしれません。


 

ホストと標準出力
 

 DOSプロンプトで実行するにはcscript.exeを利用する。こう思うのは早合点のようでした。いったいwscript.exeとcscript.exeはどこが違う?

 "バッチ" と "インタラクティブ" の 2 つのモードがあります。

インタラクティブ モード (既定) では、スクリプトとユーザーとの対話機能が提供され、Windows Script Host に対する入出力が有効になります。スクリプトは、情報をダイアログ ボックスに対してエコーしたり、ユーザーの入力を待機することができます。

 バッチ モードでは、このようなユーザーとの対話はサポートされません。WSH に対する入出力は無効になります。
 また、Windows Script Host コマンド ラインのスイッチ //I (インタラクティブ) と //B (バッチ) を使って、スクリプトのモードを設定することができます。
 WScriptオブジェクトはInteractive プロパティを持ちますが、値はブール値を返します。

 リファレンスを読むと、上のように書いてあります。"インタラクティブ"はwscript.exe、"バッチ"はcscript.exeと推測できますが、そうでしょうか。

以下のコードをwscrpt-intra.jsとして保存し、DOS窓から実行してみました。
WScript.Interactive = true; WScript.Echo (WScript.Path); WScript.Echo (WScript.FullName); WScript.Echo (WScript.Version); WScript.Echo (WScript.Name); WScript.Echo (WScript.ScriptFullName); objArgs = WScript.Arguments; for (i = 0; i < objArgs.length; i++) { WScript.Echo(objArgs(i)); } WScriptオブジェクトを
インターラクティブモードにする。
WScriptのフロパティを5個表示する。


引数はないので無視されるでしょう。
 小さなメッセージボックスが開き、OKを押すと、順次プロパティを表示して行きました。確かに僕のWScriptは5.6です。WScript.Interactive = false;とすると、何の反応もありませんでした。
 同じ事をcscript.exeで実行してみました。
WScript.Interactive = true;の結果が上です。
DOS窓にエコーが帰されてきました。
WScript.Interactive = false;とすると、画面は真っ黒のままでした。 cscript.exeでも"バッチ" と "インタラクティブ" の 2 つのモードがあるということでしょう。

WScript.Interactive = true;としてJSの関連付けをwscript.exeとしダブルクリック。DOS窓は開かず、メッセージボックスだけが開く。
WScript.Interactive = true;としてJSの関連付けをcscript.exeとしダブルクリック。DOS窓は開くが、一瞬にして消える。多分エコーが帰されていたでしょう。

まとめます。
wscript.exeはGUI環境からスクリプトを実行する。DOS窓は開かない。
DOS窓からの実行もできる。標準出力はメッセージボックス

cscript.exeはDOSプロンプト用。標準出力は画面(コンソール)。
関連付けによりGUI環境からダブルクリックで実行させられる。

両者"バッチ" と "インタラクティブ" の 2 つのモードがある。


 
StdOut  StdIn   StdErr
 

 WScriptオブジェクトのプロパテにStdOut、StdIn、stdErrがある。入力、出力、監視システムの既定値を標準入力StdIn、標準出力StdOut、標準エラーstdErrと呼ぶ。
 具体的には、PCのOSそのものをWScriptオブジェクト、キーボードを標準入力、モニター画面を標準出力と考えていいのだろう。

 WScriptオブジェクトの子供オブジェクトにShellオブジェクトがある。このShellオブジェクトのEXECメソッドを実行すると、StdOut、StdIn、stdErrにアクセスできる。ただし、cscript.exeを使う場合と限定されている。
 DOS窓からcscript.exeでスクリプトを実行すると、キーボード入力値、画面への出力、エラーメッセージを参照できる。ただし、インタラクティブモードでないと意味がない。

 リファレンスには、以下のサンプルコードが記載されている。
batch.js
var WshShell = new ActiveXObject("WScript.Shell"); var oExec = WshShell.Exec("test.bat"); var input = ""; while (true) { if (!oExec.StdOut.AtEndOfStream) { input += oExec.StdOut.Read(1); if (input.indexOf("Press any key") != -1) break; } WScript.Sleep(100); } oExec.StdIn.Write("\n"); while (oExec.Status != 1) WScript.Sleep(100);

 実行させるtest.batは”dir ”とした。C:\Windows\Commandに置いた。

そこより ”はるかに遠いデレクトリ”に、次の内容の batch.bat を置いた。
cscript batch.js
これをダブルクリックする。

予想はこうだ、

(1)batch.batは拡張子の関連付けがDOS窓だからDOSプロンプトが 立ちあがり、
既定のC:\Windowsでcscript test.batが実行される。

(2)cscript.exeのあるC:\Windows\CommandにはPATHが通っているので cscript.exeは実行される。batch.jsも同じ。

そして実行した。

-------以下工事中----------
var WShell = WScript.CreateObject("Wscript.Shell");
var oExec = WShell.EXEC("command.com /c dir /s");
var execOUT = oExec.StdOut;
WScript.Echo(execOUT);



2003.11.17
by Kon