GO BACK

Windows Scripting Host教室 その1


「WSHの基礎を理解する」



■WSHの仕組み


 Windows Scripting Host(WSH)――最近になって名前ぐらいは耳にするようになってきたことでしょう。Windowsのバッチ言語らしい、ぐらいのことは知っているのではないでしょうか。

 WSHは、Windowsアプリケーションを簡単な言語を使って外部から操作する仕組みの名称です。ただし、これがややこしいのですが「WSH」という言語があるわけではありません。WSHは、「言語で操作する」という「仕組み」だけなのです。――もう少しわかりやすくいえば、「今まであった様々な機能を寄せ集めて、Windowsアプリケーションを言語で操作できるような仕組みを作った」のですね。ですから、そこがわかりやすいようでもあり、わかりにくいようでもあるところなんでしょう。

 Windowsの世界では、もともと「DLLオートメーション」という機能がありました。DLLは、皆さんお馴染みですね。ダイナミック・リンク・ライブラリというやつです。Windowsでは、様々なプログラムで自由に利用できるような機能を用意したい時は、DLLとしてプログラムを用意します。DLLは、その中にどんな機能があってどうやって呼び出せばいいのか定義されたライブラリです。こうしておくことで、例えばVisual C++やVisual Basicといった開発環境から、そのDLLの機能を実行したりできたわけです。

 DLLオートメーションというのはそれを利用したもので、アプリケーションの機能を外部から呼び出すための機能をDLLとしてまとめたものです。例えば、Excelなどは、作成したマクロを外部から実行させたり、表やグラフを外部から操作できるととても便利じゃないか…なんて考えますよね。そこで、DLLオートメーション機能を使って、外部とやり取りする出入り口を用意してやると、それを使ってVisual BasicなどからExcelを操作できるようになる、ということなのです。

 ここまでくれば、「だったらVisual BasicとかVisual C++とかそんなちゃんとした開発言語じゃなくて、MS-DOSのバッチのようにもっと簡単手軽にそうした機能を利用できるような仕組みがあってもいいじゃないか」と誰もが考えますよね? そこで考え出されたのがWSHなのです。

 WSHは、文字通り「Windowsで実行したScripting言語の命令を処理するHost機能」なのです。WSHに対応したスクリプト言語の命令をテキストファイルなどで用意しておくと、それを実行したときに命令を受け取って処理していく機能です。

 「スクリプト言語」というのは、「プログラミング言語ほど難しくない簡易言語」だと思って下さい。このスクリプト言語で記述したプログラムリストを「スクリプト」と呼びます。――現在、WSH対応のスクリプト言語としては、Visual Basic Script(VBScript)とJavaScript(JScript)という2つのものが用意されています。

 これらのスクリプト言語の他、WSHで利用できるような各種のオブジェクトもあわせて用意されています。例えばファイルやフォルダを扱うためのオブジェクトなどですね。こうしたオブジェクトをスクリプト言語から利用することで、実際にファイルなどを操作するスクリプトを作成し、実行できるというわけです。



 このWSHは、Windows 98では標準でインストールされている、はずです。が、Windows 98のプレインストールマシンだと、メーカーなどによっては標準で入っていないものもあるようです。コントロールパネルの「アプリケーションの追加と削除」を起動し、「Windowsファイル」タブを開いて下さい。そしてファイルの種類から「アクセサリ」を選んで「詳細」ボタンを押すと、アクセサリの一覧が現れます。ここで「Windows スクリプティング ホスト」がONになっていれば、インストールされています。もしOFFだったら、これをチェックしてWindows 98のCDからインストールして下さい。

 ――ということで、WSHがどんなものか、なんとなくイメージとしてわかりました?



■WSHを使う


 では、とりあえずWSHがどんなものか、実際に何か作って試してみることにしましょう。WSHは標準でVBScriptとJavaScriptが使えますが、ここではVBScriptを利用することで統一したいと思います。理由は、Windows内で利用する限りでは、VBScriptのほうが多機能で柔軟なスクリプティングが行えるからです。JavaScriptはホームページで広く使われるなどWindows以外のところでは多用されていますが、WSHに限ってはVBScriptで記述するのが一般的なようです。

 WSHのスクリプトは、ノートパッドなどのテキストエディタで記述します。「VBS」という拡張子のファイルとして保存すると、WindowsはこれをVBScriptのスクリプトファイルであるとみなし、ダブルクリックでそのスクリプトを実行するようになるのです。

 では、実際にやってみましょう。「ノートパッド(Notepad.exe)」またはその他のテキストエディタを起動し、以下の命令を書いてみて下さい。

msgBox "Hello."

 たった1行だけですが、これでも立派なスクリプトです。記述したら、「Test.vbs」というファイル名で保存します。これでスクリプトファイルができました。

 では、実行してみましょう。――作成したTest.vbsファイルをダブルクリックして下さい。自動的に記述されたスクリプトが実行され、画面に「Hello」というメッセージウィンドウが表示されますよ。



 WSHのスクリプトの作成と実行は、たったこれだけ。すなわち「テキストエディタで命令を書いて○○.vbsというファイル名で保存し、できたファイルをダブルクリックする」というだけのことです。実に安直!

 問題は、「VBScriptという言語を覚えないといけない」ということですね。WSHを勉強する場合、まずはVBScriptの基本文法を覚え、それがマスターできたら、次にWSH用に用意されているオブジェクトの使い方を覚えていく、というのが基本的な流れとなるでしょう。

 ここで使った「msgBox …」というのも、VBScriptの命令の1つです。これは、msgBoxという命令の後に書いてあるテキストや数字などを画面に表示する働きを持つ命令です。

 VBScriptにはこうしたメッセージを表示するための命令や、各種計算のための演算記号、命令を制御するための制御構文といったものが用意されています。そう複雑な言語ではありませんし、全ての文法を覚えなくても取りあえずは使えますから、まずWSHの基本的な文法だけでも頭に入れておきましょう。



■VBScriptの基本文法


●四則演算と変数●

まずは、演算と変数からです。VBScriptでは、基本的に「計算の結果を変数に収め、それを使ってさまざまな処理を行なう」というやり方をします。四則演算は、「+-*/」といった記号をそのまま使うことができます。また、やや特別なものとして「\(またはバックスラッシュ)」「mod」というものもあります。\記号は割算で小数点以下を切り捨てたもの、modは割算の余りを計算したものとなります。  そしてもう1つ覚えておきたい記号が「=」です。これは計算式の場合、「右辺の結果を左辺に代入する」という役割を果たします。右辺にはさまざまな計算式を書き、左辺には値を収めておいたい変数を書くのです。こうすることでその変数に値が代入されます。――じゃ、やってみましょうか。

x = 10 \ 3
msgBox x

 これを先ほどと同じようにテキストエディタで書いてVBSという拡張子のファイルとして保存しましょう。そしてダブルクリックで実行すると、画面には「3」と表示されますよ。

 この2行のスクリプトをよく見ると、まず「x = 10 \ 3」となってますね。ここで「10 \ 3」の結果を「x」というものに入れていることがわかります。そして次の「msgBox x」で、xを画面に表示しています。msgBoxの細かな説明はいずれするとして、ここでは「10 \ 3の答えがxという変数に収まり、そのxを表示するとちゃんと『3』という数字が表示される」ということをよく理解して下さい。

 なんか不思議な感じもしますが、変数というのはこんな具合に=記号で何かの値をおさめると、その時点で自動的に作成されるようになっています。ここではxという変数が作成されましたね? この変数は、そのスクリプトの実行が終了されるまで値を保持しています。ですから、変数に値を収めたり、また取り出して使ったりできるのです。

 変数の名前は、半角アルファベット+数字の組み合わせで作った単語であればだいたい問題なく使えます。ただし、VBScriptの予約語と同じものや、1文字目が数字で始まるものなどはうまく動きません。もし変数がうまく動かなかったら、「この名前は使えないんじゃないか?」と疑ってみて下さい。


●テキストについて●

テキストは、VBScriptでは前後に"記号をつけて記述します。例えば「ABC」というテキストであれば、 "ABC" と書くわけです。テキストはそのまま命令などで使う値として記述できますし、=記号で変数に代入して使うこともできます。例えば、「x = "ABC"」とすれば、変数xに「ABC」というテキストが収められます。

 また、もし複数のテキストや変数をまとめて表示したい時は「&」という記号を使うとよいでしょう。これは2つのテキストをつなげるための記号です。例えば「msgBox "ABC" & "XYZ"」などとすれば、「ABCXYZ」というテキストが表示されます。


●msgBox命令●

とりあえず一番多用する命令として「msgBox」は覚えておきましょう。これは、画面にメッセージを表示する命令です。「msgBox 《テキストや変数》」という具合に、表示したいテキストや変数をmsgBoxの後に続けて書けば、それが画面に表示されます。

 実は、このmsgBoxには他にもさまざまなオプション機能があるのですが、それらはいずれ必要があれば紹介しますので、まずはこの一番基本的な形をしっかり覚えておきましょう。


●条件分岐●

条件をチェックして、それが成立するかどうかで実行する命令を変える、というものです。プログラミングになれないとちょっとわかりにくいですが、要するに「状況に応じて実行する命令を変える」ということができる、と考えて下さい。

If 《条件となるもの》Then
	……正しい時の命令……
Else
	……正しくない時の命令……
End If

 これが条件分岐構文の一般的な形です。If 〜 Thenの間に条件となるものを書いて、それが正しいかどうかで、Then以降を実行するか、Else以降を実行するかを決めます。Else以降の部分は省略することもできます。つまりThenの後に実行する命令を書いたら、すぐにEnd Ifとするわけですね。こうすると、正しい時にはその命令を実行し、そうでないときは何も実行しません。

 問題は、《条件となるもの》の部分にどんなものを書けばいいか、でしょうね。これはまあ、正しいか正しくないか判断できるような式、というしかないのですが…。まあ、実際に何か書いてみればなんとなくイメージがつかめるでしょう。

x = 3
If x mod 2 = 0 Then
	msgBox x & "は偶数だよ。"
Else
	msgBox x & "は奇数だよ。"
End If

 これは、変数xの値が偶数か奇数かを調べて表示するスクリプトです。最初の「x = 3」という部分を、3以外の数字にいろいろと書き換えて動作を試してみて下さい。どんな数字でも、偶数か奇数かきちんと表示してくれますよ。ちゃんと数字によって、異なる命令が実行されていることがわかるでしょう?

 ここでは、条件となる部分に「x mod 2 = 0」というものが書かれています。これを見て「あれ? 計算式は右辺でないといけないんじゃない?」と思った人、なかなか鋭い!――実は、ここでの=記号は、「値の代入」の=記号ではないのです。これは「2つの値が同じものである」ということを示す、比較の記号なのです。=記号には、このように2つの働きがあるのですね。

 これで「x mod 2」と「0」が等しければ、この式は正しいですからThen以降を実行します。そして正しくなければ、Else以降を実行するのです。条件となるものには、この「=記号による比較」以外にもいろいろなものがあります。例えば「<>」という記号は=の反対で「両者が等しくない」というものですし、「<」「>」「<=」「>=」といった記号は、どちらが大きいかを示すものとして使われます。これらは中学の数学あたりで習ったものですから、覚えていますよね?


●繰り返し構文●

条件分岐と共に多用される構文が「繰り返し」です。要するに、決まった回数だけ命令を繰り返し実行するものですね。この繰り返し構文はいくつか種類があるのですが、まずは一番単純なものだけ覚えておきましょう。

For《変数》=《始まりの数》To《終わりの数》
	……繰り返し実行する命令……
Next

 ちょっと最初の部分がややこしそうですね。この「For 〜」という構文は、変数と2つの数字で定義されます。これはどういうことかというと、この変数の値の変化で繰り返しをチェックしているからなのです。  例えば、「For i = 1 To 3」とした場合、まず最初に変数iに1が代入されます。そして繰り返しの最後のNextまできたらまたForに戻り、変数iの数字を1増やすのです。また最後のNextまできたら最初に戻ってiを1増やします。そしてiの値が「3」になったら、今度は実行後Nextを抜けて先へと進んで行きます。

 このように、For構文では、繰り返すごとに変数の値が1ずつ増えていきます。そしてToの数字と同じになったところで、実行後Nextを抜けていくようになっているのです。――では、これも簡単な例をあげましょう。

x = 0
For i = 1 To 10
	x = x + i
Next
msgBox x

 これを実行すると、1〜10の数字を全て足して「55」という答えを画面に表示します。Forの開始数と終了数をいろいろと書き換えて、どのように結果が変化するか試してみるとよいでしょう。

 また、余談ですが、繰り返し構文で使う変数は「i」から始まり、j,k,l…と使っていくのが古くからの慣習となっています。これは、別に今はそうする必要などないのですが、ほとんどのプログラマはこの慣習通りに書いていますので、皆さんもそうしましょう。


●InputBox命令●

msgBox命令の他に、もう1つ覚えておきたい命令があるので紹介しましょう。それは「テキストや数字を入力する」ための命令です。このInputBoxというのもいろいろなオプションがあるのだけど、まずは一番基本的な使い方だけ覚えておきましょう。

《変数》= InputBox(《表示するテキスト》)

このようにすると、画面に《表示するテキスト》で指定したテキストを表示したウィンドウが現れます。msgBoxと異なるのは、ウィンドウの下に1行だけテキストを書き込めるようになっていることです。そしてここにテキストを書き込んでOKすると、ウィンドウを閉じ、書き込んだテキストを《変数》に代入します。もしキャンセルボタンを選ぶと、変数はからっぽ(つまり何もないテキスト)となります。

 つまり、このInputBoxを使えば、ユーザーから数字やテキストを入力してもらうことができるのです。――では、これも簡単な例をあげましょう。

x = InputBox("入力してください。")
If x <> "" Then
	msgBox "あなたが入力したのは、「" & x & "」です。"
Else
	msgBox "何か書いてよ!"
End If

 これを実行すると、まず最初に「入力して下さい」とユーザーにテキストの入力を求めてきます。ここで何かを入力すると、そのテキストを画面に表示します。もし何も書かなかったり、キャンセルをした場合には「何か書いてよ!」と文句をいいます。



■スクリプトをいろいろ書いてみよう!


 では、実際にこれらの基本的な文法と2つの命令だけでどんなことができるのでしょうか。実は、意外にいろいろとできるんですよ。ちょっとした計算とかなら、これらの知識だけで十分実用的なスクリプトが書けるのです。

 例えば、消費税の計算をするスクリプトなんてのは、すぐにでもできそうですね。

x = InputBox("金額を入力してください。")
If x > 0 Then
	y = x * 1.05
	y = y  1
	msgBox x & "円の消費税込み金額は、" & y & "円です。"
End If


 これを実行すると、まず最初に金額を尋ねてきます。ここで数字を入力すると、消費税5%を加算した値が表示されます。

 このスクリプトでは、まずInputBoxで数字を入力してもらいます。そしてその値が0でなければ、1.05をかけ、その後で1で割った整数部分を取り出してmsgBoxで表示をしています。「y 1」は、要するに小数点以下を切り捨ててるんですね。

 また、キャンセルした時にはxの値は0とみなされ、計算はされません。また、数字ではなくテキストを書いた場合にはエラーが起きてしまいますので注意して下さい。

 単なる計算だけではちょっとつまらないので、数字を使った、ちょっとしたゲームを作ってみましょう。これは「石とりゲーム」という古典的な数字ゲームです。交互に1〜3個の石をとっていき、最後の1個をとった方が負け、というものです。

Kazu = 10
For i = 1 To 100
	x = InputBox("残りは「" & Kazu & "」個です。あなたの取る数を入力してください。(1〜3のいずれか)")
	If x <= 0 Then
		msgBox "取る数が少なすぎます。ルール違反で、あなたの負けです。"
		Exit For
	End If
	If x > 3 Then
		msgBox "取る数が多すぎます。ルール違反で、あなたの負けです。"
		Exit For
	End If
	Kazu = Kazu - x
	If Kazu = 1 Then
		msgBox "残り1個となりました。あなたの勝ちです!"
		Exit For
	End If
	If Kazu <= 0 Then
		msgBox "あなたの負けです。残念でした!"
		Exit For
	End If
	y = (Kazu - 1) mod 4
	If y = 0 Then
		y = 1
	End If
	msgBox "私は、「" & y & "」個とります。"
	Kazu = Kazu - y
Next


 コンピュータとあなたで、お互いに1〜3個の石をとっていきます。0個以下や4個以上とったら、反則負け。で、最後の1個をとる羽目になってしまったら負けです。やってみるとわかりますが、はっきりいってコンピュータは強いです(笑)。

 というわけで、VBScriptの基本的な文法だけでも、意外に面白いことができることがわかったでしょう? ただし、これらはあくまで「VBScript」というスクリプト言語の機能で、WSHとは関係がありません。WSH特有のオブジェクトが全く登場していませんから。では、次はそのWSHのオブジェクトについて説明をしていきましょう。


GO NEXT


GO HOME