いま述べたとおり、WSHでは、オブジェクトを作成し、そのメソッドを呼び出すことで処理を行う。それではWSHスクリプトから利用可能なオブジェクトはどのようなものだろうか。前回説明したように、WSHスクリプトから外部のCOMオブジェクトを呼び出すことも可能だが、WSH自身もプログラムの実行制御などを行うためのオブジェクト群を提供している。
現行のWSH 5.6では、以下の14個のビルトイン・オブジェクトが定義されている。各オブジェクトは、図のような階層構造を持っている(各オブジェクトが提供する役割については下表を参照)。
図中のWScriptからWshUnnamedまでのオブジェクト(WScript、WshArguments、WshNamed、WshUnnamed)は、スクリプト・ホストを構成するwscript.exeやcscript.exeに埋め込まれたオブジェクトである(wscript.exeやcscript.exeについては前回の図「WSHの構成」を参照)。これに対しWshController〜WshRemoteErrorまではwshcon.dllとして、WshNetwortとWshShell〜WshScriptExecまではwshom.ocxとして提供されるCOMオブジェクトである。これらのオブジェクトは、WSH標準として、Windows NT 4.0やWindows 98から最新のWindows Server 2003まで、幅広いWindows環境で利用できる。つまり、これらのWSHオブジェクトを使用したスクリプトは、これらのいずれのWindows環境でも実行できるということだ。
図で、線でつながれた階層構造になっているオブジェクトは、上位オブジェクトのメソッドやプロパティから、下位のオブジェクトを取得できることを意味している。例えば、WshArgumentsオブジェクトは、WScriptのプロパティとして、次のようにして取得できる。
WScript.Arguments
オブジェクトのプロパティやメソッドにアクセスするには、このようにドット(.)を使って表記する。これらの詳細については、コード例を示しながら後で詳しく説明する。
図で黄色で示したオブジェクトは、複数のオブジェクトをアイテム(項目)として持つコレクション・クラスを意味している。コレクション・クラスの詳細についても以後の連載で詳しく説明するので、取りあえずは無視しておいて構わない。
各オブジェクトの役割を簡単にまとめると次のようになる。
オブジェクト | 役割 |
---|---|
WScript | オブジェクトの作成・接続、画面表示など |
WshArguments | コマンドライン引数にアクセスする |
WshNamed | 名前付きコマンドライン・パラメータにアクセスする |
WshUnnamed | 名前なしコマンドライン・パラメータにアクセスする |
WshController | リモート・スクリプト・プロセスを作成する |
WshRemote | コンピュータ・システムをリモートから管理する |
WshRemoteError | WshRemoteオブジェクトが異常終了した場合のエラー情報にアクセスする |
WshNetwork | ネットワーク共有の接続・切断など |
WshShell | プログラムの実行・環境変数の操作など |
WshShortcut | ショートカットを作成する |
WshUrlShortCut | インターネット・リソースへのショートカットを作成する |
WshScriptExec | Exec( )で実行したスクリプトに関するステータス情報、およびエラー情報を取得する |
WshEnvironment | 環境変数にアクセスする |
WshSpecialFolders | Windowsの専用フォルダにアクセスする |
WSHオブジェクトの役割 |
各オブジェクトについて、さらに詳細を知りたければ、MSDNのページを参照されたい。
ただしこれらすべての詳細を覚える必要はない。以後この連載で、具体的なサンプル・プログラムを提示しながら、各オブジェクトの実践的な活用法を紹介する予定である。
WSHスクリプトでは、前出のWSH標準オブジェクト以外にも、外部のCOMオブジェクトを操作することができる。特にWindowsシステムを管理するなら、WMI(Windows Management Instrumentation)とADSI(Active Directory Service Interfaces)が便利である。WMIはコンピュータの管理用インターフェイス、ADSIはActive Directoryの管理用インターフェイスであり、Windows 2000/Windows XP/Windows Server 2003の各環境で標準的に利用できる。
WMIでは、ディスク・ドライバ、イベント・ログ、ファイル、フォルダ、ファイル・システム、ネットワーク、OS設定、パフォーマンス・データ、プリンタ、プロセス、レジストリ設定、セキュリティ、サービス、共有フォルダ、ユーザーとグループなどをリソースとしてWSHスクリプトから管理できる。
一方のADSIでは、Active Directoryのユーザー、グループ、コンピュータ、組織単位(OU)、共有フォルダなどに対し、作成/閲覧/編集/削除の各処理が行える。
WMIやADSIを使いこなせば、面倒なWindows管理、ActiveDirectory管理の多くの作業を自動化できる。管理業務の軽減は本稿最大の目的なので早く話を進めたいところだが、より深くWSHを理解し使いこなすために、もうしばらくはWSHの基礎解説にお付き合いいただきたい。
冒頭で述べたとおり、スクリプト・ホストにはGUIベースのWScriptとコマンドライン(CUI)ベースのCScriptの2種類が存在する。これらは必要に応じて使い分ければよいのだが、次のような理由から、管理者はCScriptによるコマンドラインでの実行を好むだろう。
CScriptでスクリプトを実行するには、コマンド・プロンプトから次のように指定する。
CScript スクリプト・ファイル名 [オプション] [パラメータ]
ここで[パラメータ]は、スクリプトに渡されるパラメータである。エクスプローラでファイルをドラッグ&ドロップしたときには、そのファイルのファイル名がパラメータとして渡される。
オプションとしては以下のものが利用できる(実際には、コマンド・プロンプトからWScriptに以下のオプションを指定して実行することも可能)。オプションの開始記号が「//」というふうに、スラッシュ記号2個で始まっていることに注意していただきたい(大文字/小文字は無関係)。単にcscriptだけを実行するとヘルプ・メッセージが表示される。
オプション | 意味 |
---|---|
//B | バッチ・モード。画面出力を表示しない |
//D | Microsoft Script Debuggerがインストールされていれば、デバッガを使用可能にする |
//E:engine | 実行するスクリプト・エンジンを拡張子にかかわらず“engine”に指定する(engineにはVBScript、JScriptなどを指定する) |
//H:CScript //H:WScript |
デフォルトのスクリプト・ホストを変更する(インストールした直後の標準状態では、WScriptがデフォルトのスクリプト・ホストとしてレジストリに登録されている) |
//I | インタラクティブ・モード。画面出力を表示する |
//Job:xxxx | WSFジョブを実行する |
//logo | CScriptの起動時にロゴを表示する |
//nologo | CScriptの起動時にロゴを表示しない |
//S | タイムアウトやロゴ表示の設定を保存する。例えば、 cscript //nologo //S とすれば、次回からロゴは表示されない |
//T:nn | タイムアウトの秒数を指定する。指定した時間が経過すると、スクリプトの処理途中でも終了する |
//X | Microsoft Script Debuggerがインストールされていれば、デバッガでスクリプトを実行する |
//U | リダイレクトされた場合にUnicode(UTF-16)で入出力する |
//? | スクリプト・ホストのパラメータ一覧を表示する |
WSHで利用できる起動時オプション |
例えば“test.vbs”というスクリプトをバッチ・モードで実行するには次のようにする。
CScript test.vbs //B
コマンド・プロンプトから手入力で起動する以外にも、タスク・スケジューラにスクリプトを登録してスケジュール実行させたり、ログオン・スクリプトに指定して、ユーザーのログオン時にスクリプトを自動実行させたりするなどが可能である。タスク・スケジューリングなどはWMIを通してスクリプトから制御することもできる。これらスクリプトのさまざまな実行方法についても、以後の連載の適当なタイミングで取り上げることにしよう。
最後に、例として、メモ帳を起動する簡単なスクリプトを書いてみよう。以下がこのスクリプトである。
Set objShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "メモ帳を起動します。"
objShell.Run "notepad.exe"
アプリケーションを起動するには、WshShellオブジェクトのRunメソッドを使う。スクリプトの開始時にはWshShellオブジェクトは存在しないので、1行目ではWshShellオブジェクトを作成している。オブジェクトを作成するにはWScriptオブジェクトのCreateObjectメソッドを利用する。ただしWScriptオブジェクト自体は作成する必要がなく、スクリプトの中から常に参照できる。
オブジェクトのメソッドやプロパティにアクセスするには、オブジェクト名の後にドット(.)を付け、メソッド名やプロパティ名を記述する。つまり、
WScript.CreateObject
なら、WScriptオブジェクトのCreateObjectメソッドを呼び出すという意味になる。
メソッド呼び出しに続く( )の内部には、メソッドに渡すパラメータ(引数)を記述する。今回のWScript.CreateObjectメソッドでは、プログラムIDと呼ばれる文字列をパラメータとして指定する("WScript.Shell")。CreateObjectメソッドは、パラメータとして与えられたプログラムIDから作成すべきクラスを判断し、そのインスタンスを作成する。「"WScript.Shell"」はWshShellクラスを表すプログラムIDなので、これでWshShellのインスタンスが作成できる。
冒頭のSetは変数にオブジェクトを代入する文であり、ここでは作成したインスタンスをobjShellという変数に代入している。なお、VBScriptにはCreateObject関数という関数があるので、WScript.CreateObjectの代わりにCreateObjectのみでも同じことを記述できる。
2行目ではWScriptオブジェクトのEchoメソッドを利用して、「メモ帳を起動します。」と出力している。これは、スクリプト・ホストがWScriptであればメッセージボックスとして表示され、[OK]ボタンが押されるまで処理はそこで停止する。一方CScriptであれば文字列はコマンド・プロンプトに表示され、そのまま次の処理に進む。
3行目では1行目で作成したWshShellのインスタンスのRunメソッドを呼び出している。Runメソッドのパラメータには実行するコマンドラインを指定する。ここではnotepad.exeを指定しているので、メモ帳が起動されることになる。
CreateObjectの操作などは、まだ直感的には分かりにくいかもしれない。しかしあわてることはない。まだWSHスクリプトの勉強は始まったばかりである。
次回はWSHオブジェクトの詳細について、実際の活用法も念頭に入れ、さらに踏み込んで解説する予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.