連載
» 2004年04月23日 00時00分 公開

Windows管理者のためのWindows Script Host入門:第4回 WScriptオブジェクトの詳細(2) (2/4)

[海津 智宏,著]

実行時パラメータの取得:WScript.Argumentsプロパティ

 WSHスクリプトで実行時パラメータを取得するには、WScriptオブジェクトのArgumentsプロパティを利用する。このWScript.Argumentsプロパティからは、WshArgumentsコレクションを参照できる。WshArgumentsコレクションは複数の値を保持するコレクション・クラスで、スクリプトの実行時に指定されたパラメータは、すべてこのコレクションの内部に指定された順に(左から右に)保存される。

 またWshArgumentsコレクションには、NamedとUnnamedという2つのプロパティがあり、NamedプロパティからはWshNamedコレクションに、UnnamedプロパティからはWshUnnamedコレクションにそれぞれアクセスできる。WSHランタイムは、スクリプトの起動時に指定された全パラメータをWshArgumentsコレクションに格納するとともに、パラメータの種類(名前付きパラメータと名前なしパラメータ)によってフィルタリングし、WshNamedコレクションとWshUnnamedコレクションに分類して格納する。

WScriptオブジェクト・モデル WScriptオブジェクト・モデル(再掲)
起動時パラメータは、WScript.ArgumentsプロパティからアクセスできるWshArgumentsコレクションに格納されている。さらにパラメータの種類により、WshNamedコレクションとWshUnnamedコレクションにフィルタリングされて格納される(図中の「M」はメソッド、「P」はプロパティ)。

全パラメータが格納されるWshArgumentsコレクション

 いま述べたとおり、WScript.ArgumentsからアクセスできるWshArgumentsコレクションは複数のオブジェクトをまとめて扱えるコレクション・クラスで、すべての実行時パラメータがこのオブジェクトのItemプロパティから参照できる。コレクション・クラスは、複数のエレメントを格納することが可能なもので、後述するようにスクリプトからは配列と同じようにしてエレメントにアクセスできる。Itemプロパティ以外にも、WshArgumentsコレクションには以下のメソッド/プロパティがある。

メソッド/プロパティ 機能
メソッド
Count WshArgumentsコレクション内部に保存されているパラメータの数を返す
ShowUsage XML形式の.wsfファイルで<RUNTIME>セクションに指定された情報を返す
プロパティ
Named WshNamedコレクションへのアクセスを提供する。WshNamedコレクションには、名前付きパラメータ(/Name:Valueの形式)が出現順に格納されている
Unnamed WshUnnamedコレクションへのアクセスを提供する。WshUnnamedコレクションには、名前なしパラメータが出現順に格納されている
Length WshArgumentsコレクションに格納されているパラメータの数を保持する
Item(n) WshArgumentsコレクションのエレメントとして格納されたパラメータが保持されている。n=0で1番目のパラメータ、n=1で2番目のパラメータ…というふうにアクセスする
WshArgumentsコレクションのメソッド/プロパティ

 基本的には、WshArguments.Countメソッドでパラメータの数を知ることができ、WshArguments.Item( n )で実際のパラメータにアクセスできる。Itemプロパティでは、配列と同様に、カッコ内のnの部分に番号を指定することで、各要素にアクセスできる。

 なおShowUsageメソッドは、XML形式の.wsfファイルとしてWSHスクリプトを記述したときに使えるもので、<runtime>セクションにヘルプ・メッセージを記述しておき、ShowUsageメソッドを呼び出すとそのメッセージがダイアログで表示される。ただし管理者が手軽に使うという意味ではあまり必要ないので、本連載ではこれ以上は説明しない。詳細を知りたければ、以下のWindows TIPSを参照されたい。

 次の例は、指定された3つのパラメータを表示するスクリプトである。パラメータの数が3つでないときは、「パラメータを3個指定してください。」というエラー・メッセージを表示する。

1: If WScript.Arguments.Count = 3 Then
2:   WScript.Echo "最初のパラメータは" & WScript.Arguments.Item(0) & "です。"
3:   WScript.Echo "2番目のパラメータは" & WScript.Arguments.Item(1) & "です。"
4:   WScript.Echo "3番目のパラメータは" & WScript.Arguments.Item(2) & "です。"
5: Else
6:   WScript.Echo "パラメータを3個指定してください。"
7: End If

 これをarguments.vbsという名前で保存して実行すると次のようになる。

C:\>cscript arguments.vbs test1 test2 test3
最初のパラメータはtest1です。
2番目のパラメータはtest2です。
3番目のパラメータはtest3です。

 ここでは実行時パラメータとして、test1、test2、test3を渡している。スクリプトでは、これらをWScript.Arguments.Item(0)、Item(1)、Item(2)として取り出すことができる。このように、要素番号は1からではなく、0から始まるので注意が必要だ。

 指定されたパラメータの数を超えてItemプロパティを取り出そうとすると(上記の例なら3以上を指定すると)、「インデックスが有効範囲にありません」というスクリプト・エラーになる。従ってパラメータにアクセスする前に、WScript.Arguments.Countメソッドでパラメータ数を確認している(1行目)。Countが3でなければ、6行目のElse節が実行され、エラー・メッセージが表示される。IfとThenの間に条件式を書くと、End If(もしくはElseIfやElse)までのブロックは条件が満たされた場合のみ実行される。

 試しにパラメータを4つ指定してみると、エラーが表示される。

C:\> cscript arguments.vbs test1 test2 test3 test4
パラメータを3個指定してください。

 なお、ここではWshArgumentsのCountメソッドでパラメータ数を取得したが、WshArgumentsのLengthプロパティを使ってもまったく同じ処理が行える。このLengthプロパティは、JScriptの言語仕様における配列操作との互換性を確保するために用意されたものだ。通常、VBscriptではCountメソッドを使い、JScriptではLengthプロパティを使う。

■For Each文を利用したコレクションのアクセス

 VBでの配列処理同様、For Each文を利用してコレクション・クラスのエレメントにアクセスできる。For Each文を使えば、WScript.Arguments.Item(0)などとして1つずつエレメントにアクセスしなくても、コレクション中のすべてのエレメントに対して繰り返し処理を行える。

 例えば次のようにする(argments.vbsとしてスクリプトを作成)。

WScript.Echo "パラメータの一覧を表示します:"
For Each strArg In WScript.Arguments
  WScript.Echo "  " & strArg
Next

 実行結果は次のとおり。

C:\> cscript arguments.vbs test1 test2 test3
パラメータの一覧を表示します:
  test1
  test2
  test3

 この例ではFor Each文を使ってWshArgumentsコレクションに含まれるすべてのエレメントを表示している。使用法は、For Eachの後に繰り返し処理のエレメントを格納する変数名(strArg)を記述し、Inキーワードに続けて繰り返し処理対象のコレクションを指定する。“strArg”の“str”は、この変数が文字列であることを示すもので、ハンガリー記法と呼ばれる。ハンガリー記法の詳細は下のコラム「ハンガリー記法を利用した変数の命名」を参照のこと。Nextまでのブロックがコレクションのエレメントの数だけ繰り返し実行される。繰り返し処理ブロックの中からは、最初に指定した変数で各エレメントを参照できる。

 もちろん、For文を使ってまったく同じ処理を記述することが可能である。For Each文の部分をFor文で書き直すと次のようになる。

For i=0 To WScript.Arguments.Count-1
  strArg = WScript.Arguments.Item(i)
  WScript.Echo "  " & strArg
Next

 For文では、ループ・カウンタとなる整数の変数を指定し、初期値と最終値を指定して繰り返し処理を行う。1回処理を行うと、ループ・カウンタは1だけ加算される。For文では、ループ・カウンタの値がToの後に記述した値を超えないかぎり、ブロックを実行する。従ってこの場合は、コレクションのエレメント数よりも1だけ小さい値を指定する。

 分かりにくければFor文を使えばよいが、慣れるとFor Each文の方が記述は簡単である。

【コラム】ハンガリー記法を利用した変数の命名

プレフィックス

文字列(string) str

整数(integer) int, n, i

整数(long) lng, l

浮動小数点数(double) dbl, d

論理値(boolean) bln, b

オブジェクト(object) obj, o

コレクション(collection) col

ハンガリー記法のプレフィックスの例

 VBScriptは型のない言語なので、各変数がどのような値を保持しているのか一見して分かりにくいという欠点がある(正確には、あらゆる変数が何でも格納できる「バリアント型」という型で扱われる)。このような言語では、変数名の先頭部分に「型」を示す文字列を付ける「ハンガリー記法(ハンガリアン記法)」という命名規則がよく用いられる。ハンガリー記法では、あらかじめ型ごとに数文字のキーワード(プレフィックス)を決めておき、変数名の直前(先頭)にそのプレフィックスを付けるようにする。例えば文字列を格納する「Target」という変数なら、「strTarget」、整数を格納する「TimeOut」なら、「nTimeOut」といった具合だ。プレフィックスとしてよく使われる文字列の例を次表に示す。ネットなどで公開されているスクリプトでも、ハンガリー記法が使われているものは少なくない。本稿でも、必要に応じてハンガリー記法で変数名を付けることにする。
 なお、ハンガリー記法で示した型名は、あくまでプログラマが期待する型であり、実際にその型の値が入っている保証はないことに注意しよう。


Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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