バッチファイル内で、for文やif文で設定した変数を、for文やif文内で反映されるようにするには、遅延環境変数を利用する必要があるが、その遅延環境変数は、スコープ外で利用することもできる。
今回は、バッチファイル内で設定した遅延環境変数を、スコープ外で利用してみたので、そのサンプルプログラムを共有する。
前提条件
Windowsがインストールされた端末で操作すること。
サンプルプログラムの作成
バッチファイルの中身は以下の通りで、遅延環境変数のスコープ内で編集した値(num1)を、スコープ外の変数(num2,num3)に設定していることが確認できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | @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)に移動し、各ファイルの存在を確認する。
2) バッチファイル(delay_expansion_out.bat)を実行する。実行すると、コマンドプロンプトには以下の値が表示される。
要点まとめ
- バッチファイル内で、for文やif文で設定した変数を、for文やif文内で反映されるようにするには、遅延環境変数を利用する必要があるが、その遅延環境変数は、スコープ外で利用することもできる。
- スコープ外の変数に遅延環境変数を使って編集した値を代入するには、endlocalコマンドでスコープ終了時に、setコマンドでスコープ外の変数に値を代入すればよい。