第7回 forコマンド(その1):Windows 2000 活用講座 Windows 2000 コマンドライン徹底活用(1/3 ページ)
GUIだけでは面倒な定型処理やシステムのメンテナンスも、コマンドラインを使えば効率よく作業できる。
今回は、多くのプログラムで使われる繰り返し構造を実現するforステートメントについて解説する。繰り返しは、プログラムの基本ともいえる構造であり、これを使いこなすことで記述を簡潔にすませることができる。例えば、5つのファイルに何かコマンドを適用するのに、コマンドを5回書いてもいいが、繰り返しを使えば1行で済む。またWindows 2000のcmd.exeは、従来のMS-DOSやWindows 9x/Meのcommand.comよりも大幅に機能が拡張されており、かなり複雑な繰り返しを記述することができる。
forステートメントの書式
forステートメントの基本形は、
for %%変数 in (セット) do コマンド
という形式である。「変数」はアルファベット1文字で、大文字、小文字が区別される変数の名前であり、これは、「コマンド」部分で(スクリプト・ファイル中では)“%%変数”という形で参照が可能となっている。ただしスクリプト・ファイル中でなく、コマンドライン上でインタラクティブに直接入力、実行する場合には、変数は“%%V”ではなく“%V”と記述しなければならない(例:コマンドラインならば「for %V in (*.*) do echo %V」とし、スクリプト・ファイル中では「for %%V in (*.*) do echo %%V」とする)。
「セット」は、変数に順次代入される値で、スペースで区切った文字列やワイルドカードを含むファイル名などが指定できる。この値は、必ずしもファイル名である必要はなく、単なる文字列でも構わないが、ワイルドカード文字(“*”や“?”)が含まれていると、(マッチするものがあれば)ファイル名に展開される。例えばカレントディレクトリのファイルすべてに対して処理を行いたいような場合には、
for %%V in ( *.* ) do コマンド %%V
などとする。ここまではforステートメントの基本で、今まで説明した範囲なら、どのWindowsやMS-DOSでも同じように動かすことができる。
Windows 2000/NTの拡張機能を使うと、さらに高度な記述も可能になる。まずコマンド部分に複数のコマンドを記述したい場合、コマンドをグループ化する“(”と“)”を使って、次のように記述することができる。
for %%V in ( *.* ) do (
コマンド1
コマンド2
:
:
コマンド n
)
いくつかのコマンドは、引数として複数のファイル名やワイルドカード表記を受け付けるので、そのようなコマンドを単体で実行するなら、わざわざforステートメントを使う必要はない。逆に、ワイルドカードを受け付けないようなコマンドを一連のファイルに適用させるような用途などにforステートメントを使うことができる。
forステートメントでは、このような場合を想定して、変数には、
%%~オプション 変数名
という特殊な表記(展開オプションの指定)を行うことで、パスやファイル名、拡張子などを取り出すことができる(注:ここでは表記の都合上「オプション」と「変数」の間に空白が入っているが、実際には間に空白を入れずに連続して記述すること)。
具体的には、「%%V」という変数を使っている場合、
%%~pV
と表記すると、パス名の部分(例:「%V」が「C:\WINNT\system32\notepad.exe」なら「\WINNT\system32\」)を取り出すことができる。なお、オプション指定が矛盾しないかぎり複数のパス指定も可能で、例えばフルパス名を表す
%%~fV
は、次のように、
%%~dpnxV
と記述することもできる。ここで“d”はドライブ名、“p”はパス名、“n”はファイル名、“x”は拡張子をそれぞれ表す。以下に修飾子の一覧をあげておく。
修飾子指定 | 機能 |
---|---|
%V | 与えられた引数そのもの |
%%~V | %Vから、一番外側の引用符(ダブルクォート)を削除したもの。以下すべて同様に、引用符が削除された形式になる |
%%~fV | %Vが含むファイル名を完全なパス名(フルパス)に展開する |
%%~dV | %Vのフルパス名からドライブ指定(コロンを含む)を取り出す |
%%~pV | %Vのフルパス名からドライブ指定とファイル名、拡張子を抜いたパス部分(最後に“\”を含む)のみを取り出す |
%%~nV | ファイル名(ただし拡張子なし)を取り出す |
%%~xV | 拡張子(ピリオドを含む)を取り出す |
%%~sV | 8.3形式(短い形式)でのフルパスに展開する |
%%~aV | %Vが指定するファイルの属性に展開する |
%%~tV | %Vが指定するファイルの更新日時に展開する |
%%~zV | %Vが指定するファイルのサイズに展開する |
%%~$環境変数名:V | %Vが指定するファイル名を指定された環境変数名の中に記述されているパスから探し、最初に見つけたパスを使ってフルパスに展開する。指定に使う環境変数はPathと同じくパス名をセミコロンで区切って複数指定可能 |
変数の修飾子一覧 forコマンド中で使用する変数に修飾子を付けると、さまざまパターンに展開することができる。複数の修飾子をまとめて指定することも可能である。なお、スクリプト中では“%%V”のように記述するが、コマンドライン上で直接入力する場合は“%V”のように、“%”は1つしか付けてはいけない。 |
なお、forステートメントで指定できる変数名はアルファベット1文字なので、常に最後の1文字が変数名として解釈され、それ以外は、展開オプションとして扱われる。このため、展開オプションと同じアルファベットを変数名として使っても展開を間違えることはないが、後からプログラムが見にくくなる。このため、できれば変数名にはこれらの文字を避けるか、大文字を使うようにしてひと目で区別できるようにしておくとよいだろう(forステートメントの変数名は大文字、小文字を区別するので注意)。
これらの展開指定は、バッチファイルの引数を指定する“%1”〜“%9”でも利用できる。というわけなので、ここで展開指定付きの変数の使い方について詳しく解説しておくことにしよう。
Copyright© Digital Advantage Corp. All Rights Reserved.