今回は、状況に応じた動作を可能にするために条件判断と組み合わせて使用される「ジャンプ」にスポットをあてる。
前回解説したように、コマンドをただ並べるだけならば、テープレコーダーと同じで、毎回同じ動作しかできない。しかし条件判断を組み合わせることで、状況に応じた動作が可能になる。
このような動作を実現するために必要となる機能として、「ジャンプ」(「(無条件)分岐」ともいう)がある。これは、次に実行する行を指定するためのもので、多くの場合、条件判断と組み合わせて使われる。プログラムとは、命令などを一次元的に並べるものであり、条件判断を使う場合、実行されるべきところと、実行してほしくないところをこの一次元の中に並べなければならない。
このとき、ジャンプを使って、次に実行すべき場所を指定することで、条件により、実行すべきでない部分を飛ばすことが可能になる。ただし、Windows 2000では、ifコマンドの機能が従来のMS-DOSのものよりも拡張され、括弧によるコマンドのグループ化が可能になったので、こちらを使ったほうが一般的にはプログラムが分かりやすくなる(詳細については連載第3回を参照)。
コマンドプロンプト・スクリプトでは、“goto”というキーワードを使う。書式としては、
という形で使うほか、ifコマンドの実行部分に記述することもできる。ラベルは、次に実行する場所を示すためにスクリプト中に置かれるもので、コロンから始まる英数字で構成される(スペースを含むことはできるが、記号は入れることができない)。gotoでは、そのラベルの名前を(コロンを付けずに)指定する。
例えば、以下のような行があるとすると、
「実行部分0」、「実行部分1」、「実行部分2」、「実行部分3」という順番で、スクリプトが実行されていく。
ラベルは必ず先頭にコロン(“:”)を持ち、続いてラベル名が続く。このラベル名には、スクリプト言語のキーワードと同じものを書いてもよく、それもまたラベル名として認識され、コマンドとしては実行されない。また、gotoステートメントで指定されたラベル名が存在しない場合には、スクリプト自体がエラーとなり、実行が停止される。
なおWindows 2000の付属ヘルプ・ファイルによれば、ラベル名は先頭の8文字だけが有効とのことだが、実際にはこのような制限はなく、9文字目以降も正しく識別されているようである。
*注意 手元のWindows 2000+SP1環境で実験した限りでは、ラベル名は最大128文字まで有効であり、正しく識別されるようである。しかし129文字以上のラベル名が存在すると、gotoコマンドを実行した時点で(129文字以上のラベル名のある行に遭遇した時点で)コマンド プロンプトのプロセスそのものが突然異常終了してしまうようなので、注意されたい(単なるバグであろうが)。
またラベル名の検索は、gotoステートメントのあった行から開始され、最初に見つかったラベルが有効となる。スクリプト・ファイルの最後まで該当するラベル名が見つからない場合には、スクリプト・ファイルの先頭から検索を始め、最初に見つかったラベルへジャンプする。
Windows 2000では、特殊なラベル名として“:EOF”がある(ほかのラベルと違って、先頭にコロンが付いていることに注意。すべて小文字で“:eof”としてもよい。EOFはEnd Of Fileの略)。これは、スクリプトの最後の部分を表すもので、処理を終了させる場合の飛び先として利用できる(実際に“:EOF”ラベルをプログラムの最後に置く必要はない)。
スクリプトでは、ファイル末に達したときにプログラムが終了して実行を終了させるようになっており、スクリプトを終了させるための特別なコマンドはない。exitコマンドは、実行中のcmd.exeを終了させるため、結果的にスクリプトを終了させるが、これをコマンドラインから実行すると、スクリプトの終了と同時に実行中のコマンドプロンプト・ウィンドウも閉じてしまうため、コマンドとしては使いにくいものになる。このため、多くの場合、プログラム末へジャンプさせて、スクリプトを終了させなければならず、今までは最後に“:END”などのラベルを定義しておき、ここへのgotoコマンドを使ってスクリプトを終了させていた。その意味でいえば、“goto :EOF”は、頻繁に記述する記法を簡略化するためのものであるといえる。
gotoステートメントのラベル名には、環境変数を使うこともできる。例えば、
goto LABEL%L%
とすると、gotoステートメントの実行前に%L%の部分が評価され、環境変数Lの値に置き換えられる(環境変数の名前を“%”で囲むと、その変数の値が展開される)。例えば、環境変数Lの値が“12”という文字列だったとき、上のステートメントは、
goto LABEL12
として評価され、ラベルLABEL12へジャンプする。この機能により、gotoコマンドを多重分岐や間接ジャンプとして使うことが可能になる。
ここで出てきた環境変数とは,cmd.exeやcommand.comなどのシェルプログラムが情報を保持するためのものである。詳しい動作については次回に触れるが、ここではスクリプトの実行中に名前(変数名)を指定して文字列を記憶しておき、上記のように必要に応じてその文字列を取り出すものであるとご理解いただきたい。
Copyright© Digital Advantage Corp. All Rights Reserved.