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