2005年10月29日

for ループ(その1)

今回は for ループ を見ていきましょう。

このループも、とっても利用価値があるんですよ。

前回、goto 文を使った単純なループの話をしました。
出口を作ってあげないと大変なことになるんですよね。

だったら、予め必要な回数だけループしてくれたら
便利だと思いませんか?


それを実現してくれるのが for ループなんです。
与えられた範囲の内、それぞれの値について、指定された
処理を実行します。構文は、

FOR [オプション] %変数名 IN (セット) DO (コマンド)

の形式を取ります。(help for も参照してね^^)


もう、最初の頃から説明もなしに使ってましたよね ^^;

変数名は、基本的に、1文字の英字を使用します。
大文字、小文字が区別されるため、52 種類が存在します。

バッチファイルで使用するときには、コマンドプロンプトに
for コマンドの変数であることを判って貰う必要があります。
% は、バッチファイルの中で変数を展開させるために使用
されてるので、変数名を展開してしまい、うまくいきません。

この場合、% をもうひとつ付けることによって対応します。
%% は、一文字の % に展開されます。%0 〜 %9 が引数に
展開されるのと同様に、このように定義されていると
思えばいいでしょう。なのでバッチファイル内では、

%%変数名  の形になります。

これも、うっかりすると発見しにくいバグになりますよ。
見つけたとき、「なぁ〜〜んだ」 と思うと同時に、
腹立たしくなってきます・・・(経験談より ^^;)


コマンド部には、実際に行いたい処理を記述していきます。
バッチファイルでは、括弧で括ることによって、複数行に
渡って処理を記述することが出来ます。
この処理の間だけ、変数が有効ですので、その値を利用して
処理を書いていくことになります。まあ、変数の使用は
必須じゃないんですけど、殆ど無意味になっちゃいますので・・・


オプションの無い一般的な形式では、セットには
引数を渡すのと同様に、スペース区切りでリストアップするか、
あるいは、ワイルドカードを使ったファイル名を指定します。

例えば、* とすれば、カレントホルダの全てのファイルに
一致しますし、*.txt とすれば、全ての txt 拡張子のファイル
????.* とすれば、4文字以内の名前をもつファイルに一致します。

これらでピックアップされたそれぞれが、変数に格納され、
コマンド部 で定義された処理に渡されます。そして、
すべての値を処理し終わったら、ループを抜けてくれます。


変数に何が代入されているかを確認するには、コマンド部に

@echo %変数名

を指定して実行してみてください。
処理される全ての変数名を列挙してくれますよ。


さて、オプションを指定する場合ですが・・・


/D および /R は、単なるファイルセットの指定ではなく、
ホルダを処理する場合や、指定したホルダ以下のサブホルダを
再帰的に検索し、全ての対象ファイルを処理する場合に使用します。

/L は、セットに 開始数値、ステップ量、終了数値 を指定
することを宣言します。変数には、これらの与えられた数値に
したがって数字が格納されます。

@echo コマンドで実際に試してみればすぐに判りますよ。


/F オプションはチョッとややこしいんですよね。
でも、それだけ色々なことが出来るってことなんですよ。
簡単な解析なら実現できますね。

私の場合、今では、usebackq による形式を基本的に使用します。
usebackq については、help for を参照してくださいね。

なぜなら、usebackq を指定しない形式では、スペースを含む
ファイル名などを2重引用符を使って指定できないので、
その場合だけ usebackq による形式を使用するよりも、
この形式を基本に考えておいたほうが判りやすい
っていう理由なんですがね・・・


おッ、それは 『手抜き』 だね?


うッ・・・否定できませんです・・・ハイ ^^;


この部分は非常に有用なので、次回に改めて
じっくりとお話していきますね。

応援ポチ  お願いしま〜す。

posted by Woody at 19:38 | 静岡 ☔ | Comment(0) | TrackBack(0) | コマンドプロンプト
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのTrackBack URL
http://blog.seesaa.jp/tb/8732589
※特に許可した場合を除き、一方的な TrackBack は
  SPAM として削除いたします。ご了承ください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。