7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【バッチファイル】if分やfor文の注意点。遅延環境変数を知ろう。

Posted at

バッチファイルとは(簡単に)

バッチファイルはWindows環境で実行できるコマンドをまとめたテキストファイルです。拡張子は「.bat」です。
複数のコマンドをバッチファイルに書くことで、上から順番に処理してくれます。
システムの運用などで定期的に実行しなければならない処理はバッチファイルに処理をまとめて自動的に実行すると便利です。
Windowsに標準搭載されている「タスクスケジューラ」やサードパーティのタスク管理ソフトウェアなどを使うとより便利に処理の自動化が実現できます。

if文やfor文を使うときは気を付けて

例えばこんな処理。果たして実行結果はどうなるでしょうか?

if文のサンプルコード
sample_01.bat
@echo off

set val=0

if %val% == 0 (
  set /a val += 1
  echo %val%
)

実行結果は以下のようになります。

実行結果
>sample_01.bat
0

「え...1じゃないの!?」と思った方も多いと思います。

このようなことはfor文でも起こります。例えばこんな例。

for文のサンプルコード
sample_02.bat
@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%**が読み込まれるのです。

もちろん解決策はあります!

遅延環境変数を使う

結論から言うと以下のようにしてください。

sample_01.bat
@echo off

:遅延環境変数を使用する宣言
setlocal enabledelayedexpansion

set val=0

if %val% == 0 (
  set /a val += 1
  echo !val!
)
sample_02.bat
@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文のみに関わらず
カッコ()**を使う際は注意が必要ですね。

最後に

なんだか難しいですが、バッチこ~い!の精神で頑張ります。バッチだけに。。。

参考サイト

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?