第3回 WScriptオブジェクトの詳細(1):Windows管理者のためのWindows Script Host入門(3/3 ページ)
いよいよ、WSHの標準オブジェクトを利用した実践的なスクリプト作成に入る。まずは基本となるWScriptオブジェクトから始めよう。
データ入出力
WSHスクリプトでのデータ出力には、通常WScript.Echoメソッドを使う。コマンドライン・モードのCScriptで実行すれば、結果の文字列はコマンドプロンプトに、GUIモードのWScriptで実行すれば、結果の文字列はメッセージ・ボックスにそれぞれ表示される。本稿の第1回で次の例を示した。
WScript.Echo "メッセージを表示します"
これをtest.vbsというファイルに保存し、エクスプローラから実行すると(WScriptで実行すると)次のメッセージ・ボックスが表示される。
一方同じtest.vbsをコマンドラインからCScriptで実行すると、次のようになる。
コマンドライン・モードのCScriptから実行する場合には、Echoメソッドによる文字列の表示だけでなく、StdIn、StdOut、StdErrの各プロパティを利用した標準入力/標準出力/標準エラー出力の操作を行える。各プロパティは、次のようにTextStreamオブジェクトのインスタンス(オブジェクト)になっている。
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オブジェクトの残るメソッドとプロパティについて解説する。
Copyright© Digital Advantage Corp. All Rights Reserved.