WindowsScriptHost


 
ActiveXの司令塔
 

 HTMLに動的な要素を加えたのがJavaScriptです。1995年に Netscape が、Sun と共同で開発しました。Microsoft は、JavaScriptと同等な機能をVisual Basic を元に開発し、VBScript として1997 年のWin98で世に送り出しました。ブラウザの後発会社であった事情で、JavaScripコンパテイブルのJScriptを同時に公開しました。

 COM(Componet Object Model)インターフェースを基盤として、マルチタスクOSであるWindowsは、その時大きく変貌していた。アプリケーション間通信を実現したWindowsOSは、アプリケーションとOSの境界を限りなく低いものとし、さらに、オブジェクトモデルをスクリプトで操るスクリプトワールドを提供しました。

 出発点の事情により、ページ記述言語JavaScriptはスクリプト言語として、OSの操作、アプリケーションのカスタマイズに深く関係することになった。本来、ローカルPCのファイルアクセスを 制限した設計であったJavaScriptは、MicrosoftMicrosoftOS上ではScripting.FileSystemObjectを利用できる。利用に際しては、セキュリテイ上の理解と配慮が必要となる。

 プレゼンテーションという観点から、インターネットのHTMLは避けて通れない。 エンジニアとして、報告書の作成と計算アプリケーションの両面からJavaScript(正式にはJScript)は、限りない武器といえる。EXCEL、AutoCAD,Webページを自由に操れると、どんな世界がひらけるのだろう。

 こような観点に立って、MicrosoftWindowsスクリプトワールドの指令塔、WindowsScriptHost、WSCRIPT.EXEを見てみよう。

 
wscript.exe
 

 IE6をインストールすると、C:\WINDOWS\wscript.exeがインストールされているはずだ。これが、WindowsScriptHostの実体。

 javaScriptで記述した手順のページを拡張子JSで保存すれば、そのファイルをダブルクリックで自動実行できます。Windows版バッチファイルです。

 拡張子JSのスクリプトファイルがダブルクリックされると、関連づけに従ってwscript.exe(スクリプティングホスト)に渡されJScriptエンジンを呼び出す。同時に、オートメーションコントローラーとして、ActiveXコントロールを制御する。

このスクリプトワールドのオブジェクト階層構造はつきのようである。
WScriptオブジェクト モデル


 Windows Scripting Hostは、メッセージを画面に出力したり、CreateObject や GetObject でCOM機能をスクリプトに提供する。つまり、各オブジェクトのプロパティとメソッドを操作する環境を提供する。
 wscript.exe自体がCOM化されているので、WSHの機能は、他のアプリケーション,たとえばEXCELから呼び出すこともできる。逆に、ActiveXコントロールを提供するEXCELを操作することもできます。

 wscript.exe単独で提供するオブジェクトは、上のオブジェクト体系のWscript(ルートオブジェクト)だけである。その子供のArguments、その子供のNamed,UnNamedは管轄外のようだ。

 
WScript オブジェクト
 

 WScriptオブジェクト自体のメソッドとプロパティは次のようなものがある。

メソッド.
CreateObject object.CreateObject(strProgID[,strPrefix])
GetObject object.GetObject(strPathname [,strProgID], [strPrefix])
Echo メッセージボックスにデータを表示する。項目間はカンマで区切る。
Quit プロセスを終了させる。終了コードは省略可能。その場合0
Sleep プロセスを中断。ミリ秒単位で指定
ConnectObject オブジェクトの出力インターフェイスをスクリプト ファイルに接続
DisconnectObject 接続解除。オブジェクトのイベントに応答しなくする
プロパティ .
Interactive true false falseにすると入出力をしなくなる。
Arguments コマンド引数のコレクション
Name WScript オブジェクト (ホストファイル) の名前
Version WScript オブジェクト (ホストファイル) のバージョン
FullName WScript オブジェクト(ホストファイル)の絶対パス
Path WScript オブジェクト(ホストファイル)の格納デイレクトリ
ScriptName 実行中のスクリプトファイルのファイルの名
ScriptFullName 実行中のスクリプトファイルの絶対パス

WScript.Interactive = true; WScript.Echo ("Host="+WScript.Name," Version="+WScript.Version ); WScript.Echo (WScript.Path," ", WScript.FullName); WScript.Echo ("Script="+WScript.ScriptName," ", WScript.ScriptFullName); objArgs = WScript.Arguments; for (i = 0; i < objArgs.length; i++) { WScript.Echo(objArgs(i)); } WScript.Quit(1);

「メモ帳」に上のように打ち込み、JSの拡張子で保存する。そしてダブルクリック。
メッセージボックスが開く。
1行目インタラクテイブモードに設定。
2行目スクリプトホストの名前とバージョンの表示。
3行目スクリプトホストのある場所の表示。
4行目実行中のスクリプトの名前とファイルのある場所の表示。
5〜9行目引数の表示。
10行目 プロセスを終了させる。

 ダブルクリックの結果、小さなメッセージボックスが開き、OKをクリックで3枚表示する。コマンドに引数がないので5〜9行目の表示をしなくなる。
 1行目のtrueをfalseにして実行すると、何も表示をしない。 バッチモードでスクリプトを実行したことになるが、出力は無効状態になる。

 ただこれだけの機能だが、ActiveXの司令塔の能力は大きい。例えば、OSのShell機能を利用して「メモ帳」を自動実行できる。

var WshShell = WScript.CreateObject("WScript.Shell"); WshShell.Run("notopad"); WScript.Sleep(100); WshShell.AppActivate("メモ帳"); WScript.Sleep(100); WshShell.SendKeys("1{+}2"); WScript.Sleep(1000); WshShell.SendKeys("="); WScript.Sleep(500); WshShell.SendKeys("3"); WScript.Sleep(2500); WScript.Quit(1);

 DOS窓からnotopadと打ち込むと「メモ帳」が起動する。そのウインドウをアクティブにすると 、キーボードの入力はそのアプリケーションに反映する。これをスクリプトに記述したのが、上のコード。あるウインドウをアクテイブにするAppActivateメソッドと、キーストロークを送信するSendKeysメソッドを使つている。

 WScript.CreateObject("WScript.Shell")により、ShellすなわちDOS窓がCOM化されて、スクリプトで操作できるようになった。CreateObjectはCOMインターフェースを持つオブジェクトを有効にする魔法使いとも言える。


 
Excelを操作する
 

 ExcelはActiveXObject製品の代表選手。WSHなしでコントロール可能だ。 WSHでShellをCOM化すると、そのExcelにキーボード入力が送れる。

var ExcelApp = new ActiveXObject("Excel.Application"); ExcelApp.Visible = true var ExcelSheet = new ActiveXObject("Excel.Sheet"); ExcelSheet.ActiveSheet.Cells(1,1).Value = "ここは、A1"; ExcelSheet.ActiveSheet.Cells(3,3).Value = "ここは、C3"; var WshShell = WScript.CreateObject("WScript.Shell"); WScript.Sleep(1000); WshShell.SendKeys("1"); WScript.Sleep(1000); WshShell.SendKeys("3"); WScript.Sleep(1000); WshShell.SendKeys("{ENTER}"); WScript.Sleep(2500); WScript.Echo (); WScript.Quit(1);


1、2行目、Application オブジェクトとしてExcel生成。表示させる。
3行目、Sheet オブジェクトをExcelSheetに割り当てる
4行目、シートの先頭のセルに文字を入力
5行目、シートのC3セルに文字を入力
6行目、Shellオブジェクトを生成
7〜13行目、SendKeysメソッドでアクテイブセルに文字入力
14行目、メッセージボックスで確認
15行目、プロセスの終了

 Excelは、VBAで木目細かなコントロールができる。Excelだけなら十分だが、Excel以外からのコントロールにはWSHが役立つこともある。

同様なことが、Microsoftの製品ではできる。この場合のApplication名は下記のようだ。
  • Word.Application
  • InternetExplorer.application
  • Shell.application

 
Shell.Aplication
 

 Shell.applicationとはexplorerのこと。GUIベースのShell。
var Shell = WScript.CreateObject("Shell.Application"); var Wins = Shell.Windows(); WScript.Echo(Wins.Count); var IE = WScript.CreateObject("InternetExplorer.Application"); E.Visible = true; WScript.Echo(Wins.Count); WScript.Sleep(2000); var str = ""; for(var i = 0; i < Wins.Count; i++) { str += i + " : "+Wins.item(i).FullName+"\n"; } WScript.Echo(str); var str = ""; WScript.Sleep(2000); for(var i = 0; i < Wins.Count; i++) { if(Wins.item(i).FullName.match(/iexplore.exe$/i)) str += i + " : iexplorer\n"; else str += i + " : explorer\n"; } WScript.Echo(str); IE.Quit(); WScript.Quit(1);


1行目、Application オブジェクトとしてのShell生成。(Shell.Visible = trueはエラーとなる)
2行目、Shell.Windows()をWinsに割り当てる
3行目、Shell.Windowsの数を確認
4、5行目、Application オブジェクトとしてInternetExplorer生成。表示する。
6行目、Shell.Windowsの数を確認
7〜12行目、各Windowのフルネームを確認
13〜21行目、ieとexplorer\のWindowsの数で確認
22行目、IEを終了
23行目、Shellを閉じる

ieとexplorerはShell統合されたことを確認してみた。

 さて、wscript.exeとはここで別れる。DOS窓で
CScript.exe //H:CScript と打ち込む。以後スクリプトホストはC:\WINDOWS\COMMANDのcscript.exeが規定値として務める。

 標準出力は小さなメッセージボックスからDOS窓の画面に変わる。
ArgumentsオブジェクトとStdOut StdIn StdErrが有効になる。

2003.11.09
by Kon