バッチファイル

バッチファイルの遅延環境変数をスコープ外で利用してみた

バッチファイル内で、for文やif文で設定した変数を、for文やif文内で反映されるようにするには、遅延環境変数を利用する必要があるが、その遅延環境変数は、スコープ外で利用することもできる。

今回は、バッチファイル内で設定した遅延環境変数を、スコープ外で利用してみたので、そのサンプルプログラムを共有する。

前提条件

Windowsがインストールされた端末で操作すること。

サンプルプログラムの作成

サンプルプログラムの構成は、以下の通り。
サンプルプログラムの構成

バッチファイルの中身は以下の通りで、遅延環境変数のスコープ内で編集した値(num1)を、スコープ外の変数(num2,num3)に設定していることが確認できる。

@echo off

REM 遅延環境変数(変数を!で囲んだもの)を利用すると、
REM その変数を読み込むタイミングを、『行に入った瞬間』から
REM 『その変数を使うコマンドにたどり着いた瞬間』に変更できるので、
REM forループやif文内で変更した変数の値が反映されている。

REM 設定値を確認するための変数を宣言
set num1=0
set num2=0
set num3=0
set num4=0

echo ***** 遅延環境変数のスコープ外のnum1,num2,num3,num4の値 *****
echo num1の値: %num1%
echo num2の値: %num2%
echo num3の値: %num3%
echo num4の値: %num4%
echo.

REM 遅延環境変数を利用して、forループ内で変数値を変更
setlocal enabledelayedexpansion
echo ********** 遅延環境変数のスコープ内 start **********
echo.
echo ***** forループ内でのnum1の値 *****
for /l %%a in (1, 1, 3) do (
   set /a num1 = %num1% + %%a
   
   echo num1の値^(遅延環境変数を利用しない場合^): %num1%
   echo num1の値^(遅延環境変数を利用した場合^)  : !num1!
   echo.
)
echo ********** 遅延環境変数のスコープ内 end **********
echo.

REM 遅延環境変数を利用するための宣言を終了し、
REM スコープ外のnum2,num3にスコープ内のnum1の値を代入する
REM その際、スコープ外のnum1には値が設定されない
endlocal && set num2=%num1% && set num3=%num1%

echo ***** 遅延環境変数のスコープ外のnum1,num2,num3,num4の値 *****
echo num1の値: %num1%
echo num2の値: %num2%
echo num3の値: %num3%
echo num4の値: %num4%



「Envader」はLinuxコマンドやDatabase SQL等のスキルを、環境構築不要で習得できる学習サイトだった「Envader」は、ITエンジニアとしてよく使うLinuxコマンドやDatabase SQL等のスキルを、解説を読んだ上で、問題を解き...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) コマンドプロンプトを起動し、バッチファイルが存在するディレクトリ(C:\tmp)に移動し、各ファイルの存在を確認する。
サンプルプログラムの実行結果_1

2) バッチファイル(delay_expansion_out.bat)を実行する。実行すると、コマンドプロンプトには以下の値が表示される。
サンプルプログラムの実行結果_2

要点まとめ

  • バッチファイル内で、for文やif文で設定した変数を、for文やif文内で反映されるようにするには、遅延環境変数を利用する必要があるが、その遅延環境変数は、スコープ外で利用することもできる。
  • スコープ外の変数に遅延環境変数を使って編集した値を代入するには、endlocalコマンドでスコープ終了時に、setコマンドでスコープ外の変数に値を代入すればよい。