単語帳スクリプトに機能を追加してみよう

基本的な機能が理解できたところで、スクリプトにいくつかの機能を追加してみましょう。

得点の履歴を記録する

毎回のテストでどれだけ自分が単語を覚えられたかが把握できるように、得点の履歴を記録してみましょう。先ほどのword.vbs末尾に、以下のようなコードを追加します。

Set ts2 = fs.OpenTextFile(fs.BuildPath(DATA_FOLDER, "point.dat"), 8, True)
ts2.WriteLine(Now & Chr(9) & correct)
ts2.Close()

テキストファイルを書き込み用に開くには、OpenTextFileメソッドの第2引数に2か8を指定するのでした(先ほどの表「引数「モード」の設定値」もご覧ください)。2と8との違いは、書き込みを常にファイルの先頭から行うか、それとも、ファイルの末尾に追記するかです。この場合、履歴をどんどん積み重ねていきたいので、追記モードの8を指定してください。新規書き込みモードの2では毎回最新の履歴だけが記録され、古い記録は削除されてしまいます。

テキストファイルを追記モードで開いたら、あとはWriteLineメソッドでテキストを書き込むだけです。Nowは現在時刻、Chr(9)はタブ文字、correctは正解数を表します。つまり、ここでは「2009/02/21 2:12:22[タブ]3[改行]」のような文字列がテキストファイルに書き込まれることになります。

もう一度、スクリプトを実行して、終了後、point.datというテキストファイルに時刻と正解数とが記録されていることを確認してみましょう。

スクリプトをコマンドプロンプトで動かしたい

先ほどの例では、英単語帳をGUIツールとして動かしましたが、少しコードを書き換えることで、コマンドプロンプト上で動かすこともできます。変更した部分だけを、以下に抜粋します。

word_cui.vbs(変更点)

Set input = WScript.StdIn   '…(1)

Do While Not ts.AtEndOfStream
  cnt = cnt + 1
  line = Split(ts.ReadLine(), Chr(9))
  WScript.Echo("第" & cnt & "問:" & line(0))
  answer = input.ReadLine() '…(2)
  ...中略...
Loop

word_cui.vbs(全部)

Const DATA_FOLDER="C:\tmp"
Dim line, answer, cnt, correct
cnt = 0
correct = 0

Set fs = WScript.CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile(fs.BuildPath(DATA_FOLDER, "data.dat"), 1, True)
Set input = WScript.StdIn

Do While Not ts.AtEndOfStream
    cnt = cnt + 1
    line = Split(ts.ReadLine(), Chr(9))
    'answer = InputBox(line(0), "第" & cnt & "問")
    'If answer = "" Then WScript.Quit()
    WScript.Echo("第" & cnt & "問:" & line(0))
    answer = input.ReadLine()
    If line(1) = Trim(answer) Then
        WScript.Echo("正解!")
        correct = correct + 1
    Else
        WScript.Echo("残念!正解は'" & line(1) & "'でした...")
    End If
Loop
ts.Close()

WScript.Echo(cnt & "問中、正解は" & correct & "問でした。")

Set ts2 = fs.OpenTextFile(fs.BuildPath(DATA_FOLDER, "point.dat"), 8, True)
ts2.WriteLine(Now & Chr(9) & correct)
ts2.Close()

ポイントとなるのは(1)(2)のコードです。まずコマンドプロンプトからの入力を取得するには、StdInプロパティで標準入力ストリームのオブジェクトを取得します(1)。標準入力ストリームとは、プロンプトから入力された値を取得するためのオブジェクトです。

このオブジェクトが取得できてしまえば、あとはReadLineメソッドで入力された文字列を行単位で読み込むだけです(2)。これでプロンプトは入力待ち状態になり、改行が入力されたところで、そこまでに入力された文字列を返します。

実際に動作も確認してみましょう。コマンドプロンプトを立ち上げ、以下のようにコマンドを入力します。

> cd c:\tmp … カレントフォルダをスクリプトの保存先に移動
> cscript word_cui.vbs  … スクリプトを実行

以下のように、先ほどはインプットボックスとして表示されていた内容がプロンプト上に表示され、かつ、プロンプトから文字列が入力できることが確認できます。

単語帳スクリプトをコマンドプロンプト上で実行

以上、今回はスクリプトからテキストファイルに対して読み書きをする方法について紹介しました。テキストファイルを利用することで、ちょっとしたデータも簡単に管理できるようになりますので、スクリプトの可能性もぐんと広がります。また、ユーザーからの入力を受け取るInputBox関数、StdInプロパティも大切な内容なので、しっかりと理解しておきましょう。

山田祥寛(WINGS)