検索
連載

第2回 WSHスクリプト・コーディングの第1歩Windows管理者のためのWindows Script Host入門(2/2 ページ)

WSHでは、OOPスタイルでWSHの標準オブジェクト、外部のCOMオブジェクトを操作する。その第1歩となる基礎知識を得る。

Share
Tweet
LINE
Hatena
前のページへ |       

WSHオブジェクト・モデル

 いま述べたとおり、WSHでは、オブジェクトを作成し、そのメソッドを呼び出すことで処理を行う。それではWSHスクリプトから利用可能なオブジェクトはどのようなものだろうか。前回説明したように、WSHスクリプトから外部のCOMオブジェクトを呼び出すことも可能だが、WSH自身もプログラムの実行制御などを行うためのオブジェクト群を提供している。

 現行のWSH 5.6では、以下の14個のビルトイン・オブジェクトが定義されている。各オブジェクトは、図のような階層構造を持っている(各オブジェクトが提供する役割については下表を参照)。

WSHオブジェクト・モデル
WSHオブジェクト・モデル
WSHでは、これら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のページを参照されたい。

 ただしこれらすべての詳細を覚える必要はない。以後この連載で、具体的なサンプル・プログラムを提示しながら、各オブジェクトの実践的な活用法を紹介する予定である。

WMIとADSI

 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によるコマンドラインでの実行を好むだろう。

  • 情報の出力時にインタラクティブな確認操作を伴わない(これについては前回詳しく述べた)。
  • 出力をリダイレクトすることで、スクリプトの実行結果を簡単にログ・ファイルに残すことができる。
  • スクリプトに対するパラメータの指定が容易。スクリプトの起動時に、操作対象やオプションなどをパラメータとして指定できる。
  • スクリプトの実行を途中でキャンセルするのが容易。コマンド・プロントからスクリプトを実行している場合、途中でスクリプトの実行を停止したければ、Ctrl+Cキーを押すだけでよい(あるいは、スクリプトを実行しているコマンド・ウィンドウを強制的に閉じてもよい)。これに対しWScriptスクリプト・ホストを利用してスクリプトを実行している場合、スクリプトを中断するにはwscript.exeの実行プロセスを強制終了するしか方法がない。

 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オブジェクトの詳細について、実際の活用法も念頭に入れ、さらに踏み込んで解説する予定である。


「運用 Windows管理者のためのWindows Script Host入門」のインデックス

Windows管理者のためのWindows Script Host入門

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
ページトップに戻る