Column This Week
あなたの仕事は自動化できますか!?~ Windows Scripting Host - Part 1 ~

Ryo Nishiya (西谷 亮)

October 22, 1998

サンプルファイル (自己解凍形式 c981021.exe 27KB)

はじめに

いま台風10号が接近してきている状況です。秋は、やはり台風が多い季節ですね。せっかく、紅葉してきれいな木々もみんな吹き飛ばされて、徐々に冬へと向かっていくのでしょう。ところが、今回の台風10号は、いつもとは違って、なにやら、巨大な上に勢力も強いらしく、せっかく、今、身に付けている知識が、思わず吹き飛ばされてしまうような勢いのようです。「そりゃ困る」と危惧していたおり、ついに、この SBN(Site Builder Network)のサイトで連載をすることになりました。それでは、ということで、風に飛ばされてはあまりにもったいない知識であろう、「Microsoft Windows Scripting Host」について、4回シリーズで連載することになったわけです。(もちろんこれで終わりというわけではなく、4回シリーズが終わっても別の話題でこの企画は続いていきます。)

さて、皆さんは、、"Microsoft Windows Scripting Host" を使っていらっしゃいますか?
どのぐらいの方がこの強力な新機能を知っているでしょうか。
この機能は、よく WSH などという形で略されている機能で、真剣に説明するならば、「Windows9x や WindowsNT などの 32Bit Windows プラットホーム上において動作する ActiveX スクリプティングエンジン用のホストである」となります。要は、Microsoft Visual Basic Scripting Edition(VBScript)と JScript で記述されたコードをネイティブで実行することができるというわけです。
では、この Microsoft Windows Scripting Host について、VBScript をベースに話を進めていくことにしましょう。

WSH の導入

とにかく、WSH を動かすところからはじめていきましょう。
さて、WSH のコードを記載していく際には、通常の言語製品などと異なって、コンパイルなどの作業は発生しません。単純にテキストデータとしてスクリプトを記載しておくだけでいいのです。そして、テキストデータとして、作成されたソースコードは、決まった拡張子で保存しておくことによって、そのスクリプトを動作させることができるようになっています。その拡張子は、そのプログラムで使用されているスクリプト言語によって決定されるようになっています。たとえば、VBScript を利用しているのであれば、拡張子は、"*.vbs" となり、JScript なのであれば、"*.js" となります。(ちなみに、この2つ以外の言語は利用できませんのであしからず...)

まずは、下記のソースを見てほしい。

'******* Hello.vbs *******
MsgBox "Hello, world.",,"WSH Sample"
'******* End of File *******

一行しかないこのソースコードを "Hello.vbs" という名称で保存して、ダブルクリックするなどして実行してみましょう。すると、図1のように表示されます。このスクリプトを解説するのであれば、「MsgBox 関数を用いて、画面上にメッセージボックスを表示した」となりますね。

図1

図 1

WSH の場合、基本的にソースファイルに書かれた内容を上から順に実行するといった動作をします。Visual Basic などのようなイベントドリブンという概念においてのプログラミングは行いません。とはいえ、スクリプトの中にサブプロシージャやファンクション(関数)を実装させることもできますので、ご安心のほどを。実際にプログラミングを行っていく際の方法として、イメージ的なものを言ってしまうのであれば、MS-DOS のころに存在したバッチファイルのようなものと考えるとわかりやすい方も多いかもしれませんね。ところが、WSH の本当の利点を言うと"バッチ"としての利用のみならず、その環境のインストールされているオブジェクトの再利用と WSH 自身で持っているオブジェクトの利用にあるのです。
たとえば、Windows98 の環境であれば、Windows98 のセットアップされたディレクトリの中にある Samples ディレクトリを参照してみてください。WSH ディレクトリの中にいくつかファイルがあるのを確認できるかと思います。(セットアップ時のオプションによっては、この場所にコピーされていないこともあるので、ご注意ください。)ここで、"Chart.vbs" を実行してみると、(Microsoft Excel が、あらかじめセットアップされているのが前提ですが、)Microsoft Excel が自動的に起動し、シート上に作成されたグラフがぐるぐると回転するではないですか。(図2)これは、WSHに実装されている機能を利用して、Microsoft Excel の機能を呼び出すという作業がスクリプトとして記述されているだけなのです。
このようなことができるものは、Microsoft Excel に限ったことではありません。開発者が、Visual Basic や Visual C++ といった開発言語製品を用いて作成した COM(Component Object Model)コンポーネントを WSH から呼び出して実行するといったことだって、当然できます。これらの機能を有効に利用していくためには、WSH において実装しているオブジェクトの構成要素をあらかじめ把握しておく必要があるのは言うまでもないことです。ここからが本題です。次に WSH のオブジェクトモデルの構成を見ていくことにしましょう。

図2-1

図2-1
図2-1

図2-2

WSH のオブジェクトモデル構成

WSH では、大きな流れに沿ってみると2つのインターフェイスを公開しています。そのひとつは、「スクリプトの実行とトラブルシューティング」、そしてもうひとつが、「それらの支援機能」という形です。「スクリプトの実行とトラブルシューティング」とは、実際のスクリプトの実行に関連するプロパティとメソッドのこと指します。これによって、スクリプトから WSH の操作や、画面上へのメッセージの表示、オブジェクトの操作などを行っていくことができるのです。また、「支援機能」とは、ネットワークドライブの割り当てやプリンタへの接続、環境変数の取得と変更などを行うためのプロパティ・メソッドをさします。これらの機能は、管理者が WSH を利用して簡単なログオンスクリプトを作成できるように、と提供されているものになるわけです。

そのなかでも、WSH では、大きく分けて4つのオブジェクトが提供されています。それは、以下に示すものです。


  • Wscript
  • WshArguments
  • WshShell
  • WshNetwork

これらのオブジェクトは、その中にさらにオブジェクトを実装している場合があるので、実数としてはもう少しいろいろなものがあると考えておくといいでしょう。Microsoft Excel などで VBA(Visual Basic for Applications)のプログラミング経験があれば、イメージはつかみやすいかもしれません。
さて、これらのオブジェクトを利用してどんなことができるのでしょう?
最初に、柱となる "Wscript" オブジェクトから見ていくことにしましょう。

Wscript オブジェクト

他のオブジェクトを利用するといった観点から見ると、一番よく利用されるのは、"CreateObejct" メソッドでしょう。この命令を利用することで、他のコンポーネントのインスタンスを作成し、それを利用することができるようになります。先ほど紹介した、"Chart.vbs" のように Microsoft Excel のインスタンスを作成するとなると、以下のようなソースコードを記述することになります。

'******* CreateObject.vbs *******
Dim objXL
Set objXL = Wscript.CreateObject("Excel.Application")
'******* End of File *******

しかし、このままであると、画面上には何も表示されないで終了してしまうため、下記のソースでは、あらかじめ用意されている Microsoft Excel ファイルを開いて、画面上に表示された状態で終了するように修正してあります。

'******* CreateObject.vbs *******
Dim objXL
Set objXL = Wscript.CreateObject("Excel.Application")
objXL.Workbooks.Open("C:\temp\sample.xls")
objXL.Visible = True
'******* End of File *******

C ドライブのtemp ディレクトリに Sample.xls というファイルを用意しておくことによって、このスクリプトを実行すると、自動的に Microsoft Excel が起動し、ファイルが開かれてくるはずです。WSH のオブジェクトを実際に利用しているのは、2行目に書かれている CreateObject メソッドにて Microsoft Excel のオブジェクトインスタンスを作成しているところだけで、残りの3行目以降は、Microsoft Excel の中で実装されているオブジェクト(ここでは、Excel の Application オブジェクト)を操作して、ファイルを開くといった動作をさせているのです。
このように、あらかじめ存在しているオブジェクトを操作して、その作業を自動化するといったことができるように設計されいるために、単にバッチとしての処理を行うのではなく、ひとつのアプリケーションのように動作させることもできるわけです。

CreateObject メソッドでは、クラス名からオブジェクトの生成を行いましたが、GetObject メソッドを用いれば、ファイルからオートメーションオブジェクトを取得することができます。GetObject メソッドの使用方法は、以下のとおりになっています。
Wscript.GetObject(strFileName[,ProdID]) = objObject
ここでは、主にオブジェクトの生成に関しての説明を行ってきましたが、これ以外にも Wscropt オブジェクトには、さまざまなメソッドやプロパティが用意されています。下記は、それらの名称と説明、利用方法を示しています。

Application プロパティ
Wscript の IDispatch インターフェイス
Wscript.Application = objWscript

Argument プロパティ
パラメータコレクションオブジェクト
Wscript.Argument = objArgument

FileName プロパティ
ホストの実行ファイルの完全パス
Wscript.FileName = strFineName

Interactive プロパティ
対話モードの状態の取得
Wscript.Interactive = Status

Name プロパティ
Wscript の通称(デフォルト プロパティ)
Wscript.Name = strName

Path プロパティ
Wscript.exe が格納されているディレクトリ名
Wscript.Path = strPath

ScriptFullName プロパティ
WSH によって実行されているスクリプトの完全パス
Wscript.ScriptFullName = strScriptFullPath

ScriptName プロパティ
WSH によって実行されているスクリプトのファイル名
Wscript.ScriptName = strScriptName

Version プロパティ
WSH のバージョン情報
Wscript.Version = strVersion

CreateObject メソッド
オブジェクトを生成し、そのイベントを確立する
Wscript.CreateObject(strProdID,[strPrefix]) = objObject

DisconnectObject メソッド
事前に接続されていたオブジェクトを WSH から開放する
Wscript.DisconnectObject objObject

Echo メソッド
ウィンド、または、[ファイル名を指定して実行] ウィンドのコマンドプロンプトにパラメータを表示する
Wscript.Echo [anuArg....]

GetObject メソッド
ファイルからオートメーションオブジェクトを取得する
Wscript.GetObject(strFileName[,strProdID]) = objObject

Quit メソッド
実行をやめて、指定されたエラーコードを返す
Wscript.Quit [intErrorCode]

サンプル

Wscript オブジェクトを利用したサンプルをここで公開したいと思います。ここでご覧に入れるのは、Microsoft Excel のオブジェクトインスタンスを作成し、Wscript オブジェクトの持つプロパティの値をシート上に表示するといった内容のものです。同様の動作をするものが、Windows98 のサンプルとして入っていますが、この例では、理解しやすいようにより簡素化したものになっています。おのおのの動作に関しては、コメントを追加してありますので、参照してください。

Dim objXL
Dim intIndex
'
' CreateObject メソッドで Microsoft Excel オブジェクトの
'インスタンスを作成する
'
Set objXL = Wscript.CreateObject("Excel.Application")
objXL.Visible = TRUE				'Microsoft Excel を画面上に表示する
objXL.WorkBooks.Add				'Microsoft Excel のWorkbook を作成する。
objXL.Columns(1).ColumnWidth = 15		'表のセルの幅を設定する
objXL.Columns(2).ColumnWidth = 50		'表のセルの幅を設定する
objXL.Columns(3).ColumnWidth = 50		'表のセルの幅を設定する
objXL.Cells(1, 1).Value = "プロパティ名"	'表の列に対する説明を代入する
objXL.Cells(1, 2).Value = "値"		'表の列に対する説明を代入する
objXL.Cells(1, 3).Value = "説明"		'表の列に対する説明を代入する
'
'値の表示される列の見た目を整えるためにセルの表示を左揃えにする。
'
objXL.Columns("B:B").Select
objXL.Selection.HorizontalAlignment = &hFFFFEFDD	

'
' シート上に値を表示するたえのフラグ変数を設定
'
intIndex = 2	

'
' Wscript のプロパティを Microsoft Excel の
' シート上に表示するため、"Show" サブプロシージャに値を渡す。
'
Call Show("Name",		WScript.Name,	"Wscript の通称")
Call Show("Version",	WScript.Version,	"Wscript の Version")
Call Show("FullName",	WScript.FullName,	"ホストの実行ファイルの完全パス")
Call Show("Path",		WScript.Path, "Wscript.exe が格納されているディレクトリ名")
Call Show("Interactive",   	WScript.Interactive,    "対話モードの状態")
Call Show("ScriptFullName", WScript.ScriptFullName, "WSHによって実行されているスクリプトの完全パス")
Call Show("ScriptName", WScript.ScriptName, "WSHによって実行されているスクリプトのファイル名")

'
' 引き渡されたデータをもとに Microsoft Excel のシートに
' 値を挿入していくためのサブプロシージャ
'
Sub Show(strName, strValue, strDesc)
	'Microsoft Excel のオブジェクトを操作して、
	'3つの引数の値をシート上に代入する。
	objXL.Cells(intIndex, 1).Value = strName
	objXL.Cells(intIndex, 2).Value = strValue
	objXL.Cells(intIndex, 3).Value = strDesc
	intIndex = intIndex + 1
	objXL.Cells(intIndex, 1).Select
End Sub

おわりに

今回は、Wscript オブジェクトとの利用方法に終始しました。それは、すでに述べたとおり、オブジェクトの再利用ということを考えているからです。もちろん、それだけではなく、さまざまな支援機能があるわけです。次回以降は、それらの支援機能について説明していきたいと思います。また、Site Builder Network Japan Teamでは、皆さんからの様々なメッセージをお待ちしています。私達に伝えたい事があれば、kksbnreq@microsoft.com までお送りください。もちろん、日本語で結構です。

RyoRyo Nishiya:最近、すっかり鉄道模型に凝っている彼は、Site Builder Network Japanで新しく始まったこのコラムに、他の誰よりも早く、ネタを提供してくれました。彼は、新宿にあるマイクロソフトの新しいオフィスで、Windows DNAの啓蒙活動に勤しんでいます。また、少しでも皆さんの役に立てればと、毎日、多くの技術系書籍の中に埋没しながら生活しています。(編集K)

© 1999 Microsoft Corporation. All rights reserved.


Page view tracker