WSHは分かりにくい存在である。例えばバッチであれば、一連のコマンドライン・コマンドの実行方法をテキスト・ファイルとして記述して.batや.cmdファイルとして保存し、コマンドラインからこれを実行することで、自動実行可能なものだと理解できる。UNIXのシェル・スクリプトも同様だろう。またOfficeアプリケーションで利用可能なVBA(Visual Basic for Applications)なら、VBライクな言語によってOfficeアプリケーションの処理を自動化できることも分かる。
すでに述べたとおり、WSHでは、スクリプト言語として、VBライクな言語であるVBScriptや、JavaScriptライクなJScriptを標準で利用できる。しかしサードパーティ製品を買い求めれば、Perl言語を使ってWSHスクリプトを作成することも可能だ。つまりWSHは特定の言語処理系に依存したものではない。
同じく、WSHスクリプトを利用してIEやOfficeアプリケーション、WMIやADSIといったCOMオブジェクトを制御できると述べたが、WSHとはこれらのオブジェクト環境を指すのかといえばそれも違う。WSHは、あくまでスクリプト言語を使って、これらのCOMオブジェクトを制御するためのものである。
WSHをひと言でいえば、「スクリプト言語を利用して、COMオブジェクトを含むさまざまなWindows機能の制御を可能にするスクリプト実行環境」ということになるだろう。WSH環境の内部構成(Windows 2000およびWindows XPのスクリプト実行環境であるWSH 5.6)を以下に示す。
図はWindows 2000やWindows XP、Windows Server 2003に搭載されているWSH(WSH 5.6)の内部構成を示したものだ。図のピンク色でくくった部分がWSH 5.6として提供されるものである。以下、この図を詳しく見ていこう。
WSHでは、標準でVBScriptもしくはJScriptを利用したスクリプト作成が可能である。これらはいずれもテキスト・ファイルで、それぞれ.vbs、.jsという拡張子を付ける(WSH2.0以降では、ほかのファイルをインクルードしたり、VBScriptとJScriptなどの複数の言語を組み合わせて記述したり、複数の タスクを記述したりすることができる.wsf形式も利用できるが、これについては今後解説する)。これらの拡張子を持ったファイルは、WSHスクリプトであるとデフォルトでレジストリに記述されているので、ファイルを作成したら、エクスプローラなどでファイルをダブルクリックするだけでスクリプトを実行できる。必要なら、ほかの拡張子をとWSHスクリプトを関連付けることも可能だが、特別な理由がなければデフォルトのままで問題ないだろう。
WSHスクリプトは、プレーン・テキストでなければならない。特殊な文字コードがファイル内に含まれていると実行時にエラーになる。意図して特殊なコードを挿入することはあまりないと思われるが、スクリプトの編集に高度な修飾機能を持つワードプロセッサなどを使うと、知らぬ間に特殊コードが保存される場合もあるので注意が必要である。このようなトラブルを避けるためには、テキスト・エディタを利用してスクリプトを編集するのがよい。機能は貧弱だが、短いスクリプトなら、Windowsに付属するメモ帳でも十分使える。ある程度長く複雑なスクリプトなら、マイクロソフトが販売する統合開発環境のVisual Studio .NETや、Officeアプリケーションに付属するスクリプト・エディタを活用してもよい。
WSHスクリプトの実行をつかさどるのがスクリプト・ホストである。実行されたスクリプト・ファイルが使用するスクリプト・エンジン(VBScriptか、JScriptかなど)を決定し、これらの言語エンジンを呼び出し、スクリプト内で指定されたCOMオブジェクトとのコミュンニケーションを制御する。
図に示したとおり、スクリプト・ホストにはwscript.exe(以下WScript)とscript.exe(CScript)の2種類が存在する。前者はGUIベース、後者はコンソール・ベースのスクリプト・ホストである。
両者で最も異なるのは、ユーザーに情報を表示したり、ユーザー入力を受け付けたりするスクリプトを作成した場合の取り扱いだ。通常CScriptでは、コマンド・プロンプトから入力を受け付け、コマンド・プロンプトに結果を出力する(標準入力から入力を受け付け、標準出力へ結果を出力する)。これに対しWScriptでは、Windows GUIであるダイアログ・ボックスで入力を受け付け、メッセージ・ボックスでユーザーに情報を表示する。
これら以外の部分では、WScriptとCScriptはほぼ同様の機能を提供する。つまり、ユーザーのインタラクションを伴わないスクリプトなら、どちらを利用しても変わりはないということだ。
ただし、今回想定するようなバッチ処理的な管理業務では、通常はCScriptを使った方が便利だろう。いま述べたとおりWScriptを使っても同様の処理は可能だが、ユーザーへの情報表示にメッセージ・ボックスが使われる。例えば以下は、メッセージを表示するだけのWSHスクリプトである(“Wscript”や“Echo”などの意味については、次回以降で詳しく述べる)。
Wscript.Echo "メッセージを表示します"
これを適当なファイル名(例えばtest.vbs)を付けて保存し、エクスプローラから実行すると、次のようなメッセージ・ボックスが表示される。このように、エクスプローラからダブルクリックでWSHスクリプトを実行した場合には、デフォルトでWScriptスクリプト・エンジンが使用されるということだ。表示内容を確認して処理を次に進めるには、確認用の[OK]ボタンをクリックする。従って例えば、100人のユーザーをActive Directoryに追加するスクリプトを書いたとして、一人分ずつ登録確認のメッセージを表示したとすれば、100回[OK]ボタンをクリックしなければならない。
次に、コマンド・プロンプトを開き、プロンプトで“test.vbs”とだけ入力してEnterキーを押す。この場合も、デフォルトではWScriptスクリプト・エンジンが使用され、上と同じメッセージ・ボックスが表示されるはずだ。
CScriptスクリプト・エンジンを使用してスクリプトを実行するには、明示的にそれを指定する。これにはcscriptコマンドにスクリプト・ファイルの名前をパラメータとして指定して実行すればよい。
このようにCScriptで実行したときには、メッセージはコマンド・ウィンドウに表示され、ユーザーの確認を待たずに処理が先に進む。このため、先の100ユーザーのActive Directoryの登録でも、メッセージが100行分表示されるだけで、ユーザーによる操作は不要である。単純な一連の処理や繰り返し処理をスクリプトで自動化するなら、通常はCScriptを利用した方が便利だということが分かるだろう。
WSHの優れた点は、スクリプトを実行するためのホスト環境(スクリプト・ホスト)と、スクリプト言語の処理エンジンを明確に分離したことだ。バッチとコマンド・プロンプト、シェル・スクリプトとシェルの関係は一対一だが、WSHでは、共通のスクリプト・ホストを使って異なる複数の言語エンジンを実装することができる。
WSH 5.6では、VBScriptとJScriptの2つの言語エンジンが標準で提供される。つまりこれらのスクリプト言語については、特に何かを追加インストールしなくても、WSH 5.6が利用可能なWindows環境ならどこでもスクリプトを実行できる。
標準でサポートされるのはVBScriptとJScriptの2つだけだが、サードパーティ製のソフトウェアを利用すれば、別のスクリプト・エンジンを利用することもできる。例えばActive State社は、WSH向けのPerlベースの言語エンジン(Active Perl)を提供している(Active State社のホームページ)。
スクリプト・エンジンの仕事は、スクリプト・ファイルに記述されたコード(特定の言語を前提として記述されたスクリプト・コード)をWSHが解釈可能な共通コードに変換することである。
すでに述べたとおり、WSHスクリプトからIEやWMI、ADSIなどの外部COMオブジェクトを制御することも可能だが、WSH自身も、プログラム実行の制御やネットワーク共有の接続/切断、スクリプトのリモート実行などを可能にするCOMオブジェクトを内部に備えている。これが図中のWSHオブジェクト・モデルである。ただし、WSHオブジェクト・モデルで制御できるのは基本的な処理だけで、高度な処理を行うには、WMIやADSIといった外部オブジェクト(オートメーション・サーバ)を利用する必要がある。
オートメーション・サーバとはWSHスクリプト制御できる外部のCOMオブジェクトである。この代表格がWMIやADSIということになるが、これ以外にもIEやOfficeアプリケーションなど、WSHから制御可能なインターフェイスを持つCOMオブジェクトは非常に幅広い。これらを利用すれば、WSHスクリプトによってさまざまな管理作業を自動化することができる(COMオブジェクトとして機能しないアプリケーションも、キーボード操作をエミュレートすることでスクリプトから制御することは可能だ。これについては続く連載で説明する)。
次回は、WSHの標準オブジェクト・モデルの詳細を解説し、これらを利用したスクリプトを実際に作成してみる予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.