第3回 WScriptオブジェクトの詳細(1)Windows管理者のためのWindows Script Host入門(3/3 ページ)

» 2004年03月11日 00時00分 公開
前のページへ 1|2|3       

データ入出力

 WSHスクリプトでのデータ出力には、通常WScript.Echoメソッドを使う。コマンドライン・モードのCScriptで実行すれば、結果の文字列はコマンドプロンプトに、GUIモードのWScriptで実行すれば、結果の文字列はメッセージ・ボックスにそれぞれ表示される。本稿の第1回で次の例を示した。

WScript.Echo "メッセージを表示します"

 これをtest.vbsというファイルに保存し、エクスプローラから実行すると(WScriptで実行すると)次のメッセージ・ボックスが表示される。

WScriptでの実行 WScriptでの実行
文字列はメッセージ・ボックスとして表示される。

 一方同じtest.vbsをコマンドラインからCScriptで実行すると、次のようになる。

CScriptでの実行 CScriptでの実行
メッセージはコマンドラインに表示される。

 コマンドライン・モードのCScriptから実行する場合には、Echoメソッドによる文字列の表示だけでなく、StdIn、StdOut、StdErrの各プロパティを利用した標準入力/標準出力/標準エラー出力の操作を行える。各プロパティは、次のようにTextStreamオブジェクトのインスタンス(オブジェクト)になっている。

WScript.StdIn/WScript.StdOut/WScript.StdErrプロパティ WScript.StdIn/WScript.StdOut/WScript.StdErrプロパティ
各プロパティは、TextStreamクラスのインスタンス(オブジェクト)になっており、TextStreamのメソッドやプロパティを利用できる。

 このTextStreamオブジェクトは、スクリプトの実行時にスクリプト・ホストによって自動的に生成されるので、プログラマが明示的に生成する必要はない。明示的に生成しなくても、すぐに使うことができる。

 名前から分かるとおり、StdInは標準入力、StdOutは標準出力、StdErrは標準エラー出力をそれぞれ制御するプロパティだ。ただし前述したとおり、これらのプロパティが利用できるのはコマンドライン・モード(CScript)で実行した場合のみで、GUIモードのWScriptでは、スクリプトからこれらのプロパティを使おうとした段階で「無効なハンドルです」というエラーが発生する。GUIモードでデータ入力を受け付けるには、VBScriptのInputBox関数を使用する。

 図から分かるとおり、StdOutとStdErrプロパティでは、Write、WriteLine、WriteBlankLinesの各メソッドが利用でき、データを標準出力/標準エラー出力に書き出すことができる。各メソッドの機能は以下のとおりである。

メソッド 機能
Write パラメータとして指定した文字列が出力される。改行(CR+LF)は追加されない
WriteLine パラメータとして指定した文字列が出力される。文字列の最後に改行(CR+LF)が自動的に追加される
WriteBlankLines パラメータとして指定した数の空行が出力される
StdOut/StdErrで利用可能なメソッド

 Writeでは、パラメータに指定した文字列が改行されずに連続して表示される。

WScript.StdOut.Write "Writeメソッドでは"
WScript.StdOut.Write "パラメータで指定した文字列が"
WScript.StdOut.Write "改行されずに連続表示されます。"

 これをコマンドラインから実行すると表示は次のようになる。

Writeメソッドではパラメータで指定した文字列が改行されずに連続表示されます。

 これに対しWriteLineメソッドでは、文字列の最後に自動的に改行(CR+LF)が追加される。

WScript.StdOut.WriteLine "WriteLineメソッドでは"
WScript.StdOut.WriteLine "パラメータで指定した文字列が"
WScript.StdOut.WriteLine "自動的に改行されます。"

 実行結果は次のとおり。

WriteLineメソッドでは
パラメータで指定した文字列が
自動的に改行されます。

 WScript.StdOut.WriteLineは、前述したWScript.Echoと同じ動作をする。WScript(Windows GUIベース)でも、CScript(コマンドライン・ベース)でも、どちらでも実行できるスクリプトにしたければ、WScript.Echoを使うべきである(前述のとおり、WScript.StdOut.WriteLineはCScriptでしか使えない)。

 出力するデータとデータの間を空行で区切りたければ、WriteBlankLinesメッソドを使う。パラメータには出力する空行の数を指定する。

WScript.StdOut.WriteLine "WriteBlankLinesメソッドでは"
WScript.StdOut.WriteBlankLines 1
WScript.StdOut.WriteLine "パラメータで指定した数の空行が"
WScript.StdOut.WriteBlankLines 2
WScript.StdOut.WriteLine "出力されます。"

 こちらの実行結果は次のとおり。

WriteBlankLinesメソッドでは

パラメータで指定した数の空行が


出力されます。

 一方のStdInプロパティでは、Read、ReadAll、ReadLine、Skip、SkipLineの各メソッドを利用し、標準入力からの入力を読み込むことができる。

メソッド/プロパティ 機能
Read パラメータとして指定した文字数を標準入力より読み込み、結果の文字列を返す
ReadAll 入力データ全体を読み込み、結果の文字列を返す
ReadLine 1行分のデータを読み込み、結果の文字列を返す
Skip パラメータとして指定した文字数をスキップし、入力ポインタを進める
SkipLine パラメータとして指定した行数の入力をスキップする
AtEndOfLine 入力データが行末になったかどうかを表す(ブール値)
AtEndOfStream 全入力データの最後かどうかを表す(ブール値)
StdInで利用可能なメソッド/プロパティ

 文字数のパラメータは、日本語文字にも対応しており、半角英数字でも全角漢字でも1文字として計数される。

 文字数を指定してデータを読み込むにはReadメソッドを利用する。繰り返しReadメソッドを呼び出すことで、続きのデータを読み込むことが可能である。

Do Until WScript.StdIn.AtEndOfLine
   strInput = WScript.StdIn.Read( 5 )
   WScript.Echo strInput
Loop

 このサンプルでは、Readメソッドにパラメータ5を指定して入力データから5文字を読み込み、WScript.Echoメソッドでそのままデータを表示している。Do Until〜Loopは、Do Untilの次に指定した条件が真(true)になるまでループを繰り返すステートメントである。ここではAtEndOfLineプロパティを指定し、行末データ(CR+LF)に出会うまでループを繰り返している。

 例えば標準入力から「WSHを使えば煩雑なWindows管理業務を軽減できます」という文字列を指定して上記スクリプトを実行すると、結果は次のように5文字ずつに区切られて表示される。

WSHを使
えば煩雑な
Windo
ws管理業
務を軽減で
きます

 このように、全角文字も、半角文字もそれぞれ1文字として扱われる。

 1行分のデータをまとめて読み込むには、ReadLineメソッドを使う。スクリプトの実行途中で何らかのユーザー入力を受け付ける場合は、このReadLineメソッドを使うことになるだろう。これを利用すれば、ユーザーがEnterキーを入力するまでのすべてのデータを取り出せる。

strInput = WScript.StdIn.ReadLine
WScript.Echo strInput

 この場合、標準入力から先の「WSHを使えば煩雑なWindows管理業務を軽減できます」を指定してスクリプトを実行すると出力は次のようになる。

WSHを使えば煩雑なWindows管理業務を軽減できます

 入力データから任意の文字数をスキップしたければ、Skipメソッドを利用する。例えば最初の10文字をスキップして、残りのデータをすべて読み込み、それらを表示するには次のようにする。

WScript.StdIn.Skip( 10 )
Do Until WScript.StdIn.AtEndOfLine
   strInput = WScript.StdIn.Read( 1 )
   WScript.StdOut.Write strInput
Loop

 同じく「WSHを使えば煩雑なWindows管理業務を軽減できます」を指定すると、結果は次のように、先頭の10文字が欠落した文章が表示される。

Windows管理業務を軽減できます

 なお、StdInに対して書き込みのメソッドを使用したり、StdOut、StdErrに対して読み込みのメソッドを使用したりした場合には「ファイルのモードが不正です」というエラーになる。

電卓のサンプル・スクリプト

 ここまでに説明したメソッドを利用して、ユーザーから入力された数式を計算するサンプル・スクリプトを作成してみよう。

Do
  WScript.StdOut.Write "数式を入力してください:"
  strExpr = Wscript.StdIn.ReadLine
  If strExpr = "" Then Exit Do

  WScript.StdOut.WriteLine "計算結果:" & _
    strExpr & " = " & Eval(strExpr)
Loop

 実行結果は次のようになる。

D:\WSH>cscript calc.vbs
数式を入力してください:1+2
計算結果:1+2 = 3
数式を入力してください:3*4
計算結果:3*4 = 12
数式を入力してください:

D:\WSH>

 このプログラムでは、全体がDo〜Loopで囲まれたループになっている。ループの終了条件は入力の後で確認するため、UntilやWhileでの条件指定は省略している。2行目では、StdOut.Writeメソッドを利用して、標準出力に「数式を入力してください:」と出力する。Writeメソッドは改行を出力しないので、カーソル位置は「:」のすぐ右にある。そして3行目でStdIn.ReadLineメソッドを利用して入力を読み取り、strExpr変数に代入する。ここでユーザーに入力が問い合わせられることになる。ユーザーがキー入力を行うと、カーソル位置である「:」のすぐ右に入力されたデータが表示される。この例では、キーボードから「1+2」「3*4」を入力している。

 次の4行目で入力を確認し、入力が""と等しかったら、つまり何も入力されなかった場合はExit Doステートメントによりループを終了する。好みによって"exit"や"quit"などの文字列を使用してもよいだろう。

 6行目と7行目で、StdOut.WriteLineメソッドを使って計算結果を表示している。この2行は、本来は1行で表記すればよいのだが、長いので2行に分け、「_」(アンダースコア)で連結した。このようにVBScriptでは、行末を「_」にすることで、複数の行を1行に連結できる(逆にいえば、長い1行を複数行に分割表記できる)。ただしこれはVBScript(およびVisual Basic)独特の表記法である。VBScriptでは、物理的な行末が(プログラムの)文の終了を表すため、このようにして文が複数行に渡っていることを表す必要がある。これに対しJScriptでは、コードの論理的な1行の終わり(デリミタと呼ばれる)として「;」を表記することになっているため、「;」を指定するまでは、コードを物理的に何行にわたって書いても1行の扱いになる。

 「&」は文字列を連結する演算子である。EvalはVBScriptの関数であり、VBScriptの式として与えられた文字列を評価し、結果を返す。

 こうして、文字列 “計算結果:”と入力値“1+2”、文字列“ = ”、計算結果“3”を連結した“計算結果:1+2 = 3”が出力される。


 次回も引き続き、WScriptオブジェクトの残るメソッドとプロパティについて解説する。


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

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

前のページへ 1|2|3       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。