それでは、WScriptオブジェクトの各メソッドとプロパティについて、サンプル・スクリプトなども交えながら詳しく説明していこう。まずはCOMオブジェクトの生成と参照を行うためのCreateObjectメソッドとGetObjectメソッドである。
CreateObjectメソッドとGetObjectメソッドは、WSHでも最も重要な機能の1つである。WSHスクリプトでは、Windows環境のさまざまなコンポーネントを操作できる。これには、まず始めに、操作したいコンポーネント(COMオブジェクト)を生成・取得しなければならない。このために利用するのがCreateObjectメソッドとGetObjectメソッドである。WScriptオブジェクトは明示的に生成しなくても使うことができるが、それ以外のオブジェクトは、基本的にこれらのいずれかのメソッドで生成・取得する必要がある。
CreateObjectは、プログラムIDを引数にとり、そのプログラムIDで表されるCOMオブジェクトのインスタンス(実体)を作成して、そのオブジェクトを返すメソッドである。ここでいう「プログラムID」とは、Windows環境で利用可能なコンポーネントに付けられた名前である。クラスIDの一覧は、レジストリのHKEY_CLASSES_ROOT以下に記述されている。例えば以下は、レジストリ・エディタを起動して、HKEY_CLASSES_ROOT以下を表示したところである。
画面のツリー(左側のペイン)に一覧されているのがプログラムIDである。スクリプトでは、これらの名前(例えば「Wscript.Shell」)によって特定のCOMオブジェクトを指定できる。
また上の画面では、「WScript.Shell」以下に記述された値を表示している。「CLSID」というのはクラスID(Class ID)のことで、こちらは文字列ではなく128bitの数値である。各COMオブジェクトには、このようにユニークなクラスIDが割り当てられている。CreateObjectメソッドにプログラムIDを指定してオブジェクトの生成を指示すると、内部的には、プログラムIDがこのクラスIDに変換され、実際のDLLファイルなどが呼び出されることになる。ただしこれらの処理はWSHスクリプト・ホストが自動的に行うので、プログラマは意識する必要はない。
前回の最後に「メモ帳」を起動するスクリプトを紹介した。
Set objShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "メモ帳を起動します。"
objShell.Run "notepad.exe"
この1行目で、WScriptのCreateObjectメソッドを呼び出している。CreateObjectメソッドのパラメータとして、“WScript.Shell”というプログラムIDを指定している(レジストリ・エディタの画面で表示したもの)。このメソッド呼び出しの結果、WScript.Shellオブジェクトが生成され、その結果が戻り値として返される。スクリプトでは、その結果のオブジェクトをobjShellという変数に代入している。
先頭にあるSetというキーワードは、単純な数字や文字列の変数への代入には指定しないが、オブジェクトを代入する場合には必ず指定する(逆にSetが指定されていたら、オブジェクトの代入だと見なしてよい)。Set文の特徴は、通常の数値や文字列の代入のように、値そのものを変数にコピーするのではなく、オブジェクトへの参照を代入するということだ。C言語をご存じなら、ここでいう参照は、一種のポインタのようなものだと思えばよい。オブジェクトの実体をコピーするのではなく、実体はそのままに、その実体を指すポインタだけを変数に代入するわけだ。従ってSet文による代入を繰り返しても、オブジェクトの実体は常に1つで、コピーされたりしない。同じオブジェクトの実体を指す名前(=変数)が増えるだけである。
GetObjectは、パラメータとしてファイル名を指定し、そのファイルを操作するためのオートメーション・オブジェクトを取得するメソッドである。CreateObjectとは違い、すでにそのオブジェクトが存在していれば、新しいオブジェクトは作成せずに存在しているオブジェクトを返す(これがCreateではなくGetであるゆえんだ)。存在していなければオブジェクトを生成する。
例えば次のようにする。
Set objExcel = WScript.GetObject("D:\WSH\test.xls")
WScript.Echo objExcel.Sheets("Sheet1").Cells(1,1)
この例では、test.xlsというExcelファイルを指定し、そのオブジェクトへの参照をobjExcelという変数に代入している。そして2行目では、objExcelのSheetsプロパティで“Sheet1”という名前のWorksheetオブジェクトを取得し、Cellsプロパティで1行1列目のセルの値を取得し、WScript.Echoメソッド(後述)でその内容を表示している。これで、test.xlsの1行1列のデータの内容を表示できる。
このスクリプトが実行されると、スクリプト・ホストはレジストリを参照し、“.xls”ファイルがOfficeアプリケーションのExcelに関連付けられていることを認識し、プログラムIDが“Excel.Sheet”であるオブジェクトを返す。つまり、プログラムIDを明記しなくても、レジストリでの対応関係が自動的に走査される。
しかし場合によっては、同じ拡張子に対応するアプリケーションが複数存在するかもしれない。このような場合には、対象となるオートメーション・オブジェクトのプログラムIDをGetObjectの第2パラメータに明示的に指定できる。例えば上記リストの1行目は、次のようにしてもよい。動作はまったく変わらない。
Set objExcel = WScript.GetObject("D:\WSH\test.xls", "Excel.Sheet")
詳しくは以後の連載で述べるが、WMIやADSIを利用する場合も、最初にGetObjectでオブジェクトを取得する。例えば次のようにする。
Set objWMIService = WScript.GetObject("winmgmts:")
GetObjectの第1パラメータとして指定している“winmgmts:”は、ファイル名ではなく、WMIを表す文字列である(Windows Managementsの略だと思われる)。これはURLの先頭で利用するプロトコルを指定する「http:」のようなキーワードだと考えればよい。通常のファイルではない特別な参照方法である。
VBScriptには、CreateObjectというVBScript独自の関数があり、これをWScript.CreateObjectメソッドの代わりに使うことができる。またVBScriptとJScriptには、GetObjectという言語独自の関数があり、これをWScript.GetObjectの代わりに使うことができる。しかしこれらの関数の機能は、WScript.CreateObjectおよびWScript.GetObjectでそれぞれ包含されている。
従ってスクリプトでは、一貫してWScript.CreateObjectとWScript.GetObjectを使えばよいし、本稿ではそうするつもりだ。ただしインターネットなどで公開された他人のスクリプトの中には、これら言語独自の関数を利用したものも多い。これらを見かけたら、基本的にはWScript.CreateObjectとWScript.GetObjectに置き換えて理解すればよい。一部パラメータの扱いなどが異なるので、詳細については以下のリンクからVBScriptとJScriptの言語仕様を参照されたい。
Copyright© Digital Advantage Corp. All Rights Reserved.