WScriptオブジェクト解説の後編。標準入出力やCOMオブジェクトの操作について説明する。COMを使うために必要なタイプライブラリも解説。
今回は、前回に引き続き、WScriptオブジェクトのメソッド・プロパティを紹介し、その使用法について述べていく。
■連載目次
第1回 WSHを始めよう
第2回 VBScript基本(1)文字列の入出力
第3回 VBScript基本(2)計算と分岐処理
第4回 関数を使いこなす:文字列、数値、日付
第5回 データ型について理解を深めよう
第6回 VBScriptの配列を極める
第7回 Subプロシージャで処理を定義
第8回 Functionプロシージャで関数を定義
第9回 VBScriptのオブジェクトを使いこなす
第10回 WScriptオブジェクト(1)
第11回 WScriptオブジェクト(2)
第12回 WshShellオブジェクト(1)
第13回 WshShellオブジェクト(2)
第14回 WshShellオブジェクト(3)
第15回 WshNetworkオブジェクト
第16回 FileSystemObjectオブジェクト(1)
第17回 FileSystemObjectオブジェクト(2)
第18回 FileSystemObjectオブジェクト(3)
第19回 TextStream/Dictionaryオブジェクト
まずは、標準入出力(「標準入力」と「標準出力」をまとめてこう呼ぶ)や標準エラー出力を表すオブジェクトを返すプロパティであるStdInプロパティ(標準入力)、StdOutプロパティ(標準出力)、StdErrプロパティ(標準エラー出力)を見ていこう。 最初に、標準入出力、標準エラー出力とは何かについて簡単に述べておこう。例としてコンソール・アプリケーションの代表例である、コマンド・プロンプトを取り上げる。本連載はWSH(Windows Script Host)/VBScriptの連載なのでコマンド・プロンプトの使い方については詳しく述べないが、標準入出力、標準エラー出力とはどういうものであるかを簡単に示しておく。次の画面を見ていただきたい。
このように、標準入力と標準出力は、コンソール・アプリケーションにおいてはそれぞれキーボードとコンソール(画面)であることがお分かりいただけると思う。
このことから、標準入出力と標準エラー出力を示すStdIn、StdOut、StdErrプロパティも、キーボードとコンソールを扱うプロパティであることが推測できる。なお、コンソールを扱うということからも分かるように、これらのプロパティはcscript.exe(CUI版のWSH)でしか使用できない(GUI版のWSHであるwscript.exeで実行するとエラーが発生する)ということに注意が必要である。
これらのプロパティは、それぞれの意味を表す文字列のストリーム・オブジェクト(TextStreamオブジェクト)を返す。TextStreamオブジェクトは今後テキスト・ファイルを読み書きするときにも登場するのでここでは概説のみにとどめておくが、文字列ストリームに対してシーケンシャル・アクセス(データを先頭から順番に読み込む、あるいは書き込む)を行うためのオブジェクトである。このオブジェクトには大別すると文字列(String)型のデータを読み込む系統(Read系)のメソッドと書き込む系統(Write系)のメソッドがあり、それぞれStdInプロパティ、StdOutプロパティが返すTextStreamオブジェクトに対応する。
最も単純な例として、標準入力から1行の文字列を受け取って変数に代入し、その変数の値を標準出力に書き出すスクリプトを考えよう。
※ファイル:read_and_write_stdio.vbs
Option Explicit
Dim objStdIn, objStdOut
Set objStdIn = WScript.StdIn '標準入力ストリームを返す
Set objStdOut = WScript.StdOut '標準出力ストリームを返す
Dim strFromStdIn
'標準入力から文字列を1行読み込む
strFromStdIn = objStdIn.ReadLine()
'標準出力に文字列を1行書き込む
objStdOut.WriteLine strFromStdIn
objStdIn.Close() '標準入力ストリームを閉じる
objStdOut.Close() '標準出力ストリームを閉じる
'オブジェクトの破棄
Set objStdIn = Nothing
Set objStdOut = Nothing
このスクリプトの実行例は例えば次のようになる。なお、このスクリプトはcscript.exeで実行する。
このように、入力した文字列をそのまま出力するスクリプトであることが分かる。このスクリプトの動きを順に追ってみよう。
まず、最初の部分でWScriptオブジェクトのStdInプロパティ(標準入力ストリーム・オブジェクト)およびStdOutプロパティ(標準出力ストリーム・オブジェクト)を参照し、オブジェクト変数に代入している。その後、標準入力ストリーム・オブジェクトに対してReadLineメソッドを実行して標準入力から1行文字列を読み込んでいる。このときユーザーは文字列を入力できる。[Enter]キーを押すと改行したことになるので、標準入力から1行読み込まれたことになりスクリプトは次の行に進む。読み込んだ文字列はstrFromStdIn変数に代入されているので、それを標準出力ストリーム・オブジェクトのWriteLineメソッドで書き込んでいる。その結果、コンソールにはstrFromStdIn変数の中身が表示されるわけである。最後にこれらのストリーム・オブジェクトのCloseメソッドを呼び出し、ストリームを閉じている。
これらのオブジェクトの使い道だが、まずStdInプロパティが返す標準入力ストリーム・オブジェクトはInputBox関数を使わずにユーザーに文字列を入力させたいときに便利である。また、引数に数値を与えてReadメソッドを使うと指定数の文字だけ取得することができる(例えばstrFromStdIn = objStdIn.Read(5)のようにする)。
StdOutプロパティが返す標準出力ストリーム・オブジェクトはコンソールにユーザーのための情報を表示させるときに便利である。WriteLineメソッドはWScript.Echoとしたときと同じ効果が得られるが、こちらはcscript.exe専用なので、あえてcscript.exeで実行を強制させたいときに使うとよいかもしれない(wscript.exeではStdOutプロパティを参照しようとするとエラーになる)。Writeメソッドを用いると改行を加えず文字列を表示するので、工夫すればプログレス・バー(進ちょく状況を表示するバー)のようなものを作成できる(後で問題として紹介する)。
また、ここでは詳説しないが、標準入出力を扱えるということは、ほかのコンソール・アプリケーションやファイル、デバイスと連携ができるということである。興味のある方は「リダイレクト」や「パイプ」などをキーワードに調べてみるとよいだろう。その際、デフォルトで標準出力に出力される、
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
という文字列は、cscript.exeに//NoLogoオプションを与えることで抑制できることを頭に入れておくとよいだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.