バッチファイルとは(簡単に)
バッチファイルはWindows環境で実行できるコマンドをまとめたテキストファイルです。拡張子は「.bat」です。
複数のコマンドをバッチファイルに書くことで、上から順番に処理してくれます。
システムの運用などで定期的に実行しなければならない処理はバッチファイルに処理をまとめて自動的に実行すると便利です。
Windowsに標準搭載されている「タスクスケジューラ」やサードパーティのタスク管理ソフトウェアなどを使うとより便利に処理の自動化が実現できます。
if文やfor文を使うときは気を付けて
例えばこんな処理。果たして実行結果はどうなるでしょうか?
if文のサンプルコード
@echo off
set val=0
if %val% == 0 (
set /a val += 1
echo %val%
)
実行結果は以下のようになります。
>sample_01.bat
0
「え...1じゃないの!?」と思った方も多いと思います。
このようなことはfor文でも起こります。例えばこんな例。
for文のサンプルコード
@echo off
set val=0
for /l %%i in (1, 1, 5) do (
set /a val+=1
echo %val%
)
これも「1 2 3 4 5」と返ってくると思いきや以下のようになります。
>sample_02.bat
0
0
0
0
0
for文でこうなってしまうと、繰り返し途中で条件分岐できないのではと不安になりますよね。。。(安心してください。後ほど解決策を記載します。)
実はこれはバッチ特有の仕組みなのです。まずはこうなってしまう理由を説明します。
バッチが変数を読み込むタイミング
バッチファイルでは、処理したい行に移ったときに変数が読み込まれます。さらにその変数が読み込まれた時点で、同じ行に存在する同じ変数も読み込まれてしまうのです。
そして重要なのは、たとえ改行していたとしても**カッコ()**の中の処理は同じ一行として認識されます。
先ほどのif文の例でいうと
if %val% == 0 (set /a val += 1 echo %val%)
このように一行で認識され、ifの後の**%val%が読み込まれると同時にインクリメント処理を飛ばして、最後の%val%**が読み込まれるのです。
もちろん解決策はあります!
遅延環境変数を使う
結論から言うと以下のようにしてください。
@echo off
:遅延環境変数を使用する宣言
setlocal enabledelayedexpansion
set val=0
if %val% == 0 (
set /a val += 1
echo !val!
)
@echo off
:遅延環境変数を使用する宣言
setlocal enabledelayedexpansion
set val=0
for /l %%i in (1, 1, 5) do (
set /a val+=1
echo !val!
)
setlocal enabledelayedexpansionコマンドで遅延環境変数宣言をして、変数を**!val!のようにビックリマークで囲みます。
こうすることで、!!で囲まれた変数は、実際に実行するときに変数を値に置き換えます。
このことを「遅延環境変数の展開」と言うそうです。
if文やfor文のみに関わらずカッコ()**を使う際は注意が必要ですね。
最後に
なんだか難しいですが、バッチこ~い!の精神で頑張ります。バッチだけに。。。
参考サイト