1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT(ドス・バット

ループ使用のためのWindows batスクリプトを解説

2022-01-01 15:02:23

Windowsのbatスクリプトにおけるfor文の基本形は、以下の通りです。

david@ubuntu:~/Desktop/goldfish$ make


make: execvp: arm-eabi-gcc: Permission denied


  CHK include/linux/version.h


make[1]: `include/asm-arm/mach-types.h' is up to date.


  CHK include/linux/utsrelease.h


  SYMLINK include/asm -> include/asm-arm


  CC kernel/bounds.s


/bin/sh: arm-eabi-gcc: Permission denied


make[1]: *** [kernel/bounds.s] Error 126


make: *** [prepare0] Error 2

cmd ウィンドウとバッチファイルを区別する理由は、どちらの環境でもコマンド文の動作は基本的に同じですが、細部が若干異なるからです。最も明らかなのは、cmd ウィンドウでは、後の形式変数 I をパーセント記号 1 つで参照しなければならない、つまり %I とするのに対し、バッチファイルでは、形式変数 I をダブルで参照しなければならない点です。 以下の説明は、特に強調しない限りバッチファイルの環境に基づいています。

まず、for文の基本的な要素にはどのようなものがあるのかを見てみましょう。

  1. for、in、doはfor文のキーワードで、この3つはどれも欠かせない。
  2. Iはfor文の形式変数への参照で、do以降の文の実行に変数lが関与しない場合でも、必ず出現させなければならない。
  3. in の後、do の前の括弧は省略できない。
  4. command1 は文字列または変数に、command2 は文字列、変数またはコマンド文に使用します。

  以下は、Windowsのbatスクリプトのデモです(demo1と記します)。

 david@ubuntu:~/Desktop/goldfish$ arm-eabi-gcc


bash: /home/david/Desktop/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: Permission denied

  これを.batファイル(バッチファイル)として保存し、実行すると、ポップアップするバッチウィンドウに次のメッセージが表示されます。

  バッチファイルのforループは、このようにシンプルです。ここでは、for文の「やるべきこと」と「やってはいけないこと」を説明し、より複雑なforループの例を実行します。

  • for文の形式変数Iは、大文字と小文字を区別する26文字のいずれかに置き換えることができます。つまり、%%Iと%%iは同じ変数とはみなされません。形式変数Iは他の文字に置き換えることもできますが、バッチ内の10の形式変数%0~%9と競合しないように、%%Iを%%0~どれか一つに任意に置き換えないように注意してください。
  • inとdoの間のcommand1で表される文字列や変数は1つでも複数でもよく、それぞれの文字列や変数を要素と呼び、各要素の間はスペースバー、ジャンプボックス、カンマ、セミコロン、等号で区切られます。
  • for文は、command1の各要素を順番に抽出し、その値を形式変数Iに代入し、doの後にcommand2に持ってきてコマンドの実行に参加させる。また、1要素ずつ抽出し、command2に持ってきてコマンド2の動作に参加するかどうかに関係なく、一旦doの後のコマンド文の実行に入る。doの後のステートメントの実行が1回終了したとき doステートメントが実行された後、command1の次の要素が抽出され、再びcommand2が実行されるというように、command1のすべての要素が抽出され、forステートメントの終了が宣言されるまで、doの後のステートメントは実行される。

それを踏まえて、次の例を見てみましょう。demo1 の一部を変更する(demo2 と記す)と、結果が大きく変わります。

david@ubuntu:~/Desktop/goldfish$ sudo arm-eabi-gcc


sudo: arm-eabi-gcc: command not found

  実行結果は以下の通りです。

bbs.bathome.cn という文字列のドットを、スペース、空白、等号に置き換えると、demo2 と同じ結果になります。

さて、demo2のコードの中のfor文の実行を解析してみましょう。

  1. for文は、文字列A,B,Cを3つの要素にスライスしている。カンマを区切りとしてA,B,Cの3つの要素にスライスしているので、doの後の文が3回実行されることが確定しています。 

  2. 最初の実行は次のようになる。文字列bbsは形式変数Iの値としてポストdo文に持ち込まれる、すなわち, したがって、1回目の実行結果は画面上の文字列Aとなる。2回目の実行は、Iの値が置き換わった以外は1回目と同じである。2回目の実行は、Iの値が command1 の2番目の要素である文字列Bに置き換えられた以外は1回目と同じであり、以下、3度目の echo を実行して for 文全体を完了し、その時点で次の文、pause 命令が実行される。

 高度な使い方

1) カレントディレクトリにどんなファイルがあるか検索する?

david@ubuntu:~/Desktop/goldfish$ env | grep PATH


XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0


XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0


DEFAULTS_PATH=/usr/share/gconf/ubuntu-2d.default.path


PATH=/home/david/Desktop/perbuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:/home/david/Desktop/prebuilt/linux-x86/toolchain/arm-eabi -4.4.3/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:opt/jdk1.7.0_03/bin:/ opt/jdk1.7.0_03/jre/bin


MANDATORY_PATH=/usr/share/gconf/ubuntu-2d.mandatory.path


CLASSPATH=. :/opt/jdk1.7.0_03/lib

2) カレントディレクトリにあるすべてのテキストファイルを検索しますか?

@echo off
for %%i in (*.txt) do echo "%%i"
pause

概要

Windows bat script for loop usageの記事は以上です。Windows bat script for loop usageの詳細については、過去の記事を検索するか、以下の関連記事を引き続き参照してください。