0
0

More than 3 years have passed since last update.

バッチファイルの遅延環境変数(簡単な例)

Last updated at Posted at 2021-04-12

Y子です。

昨日は大長編を書いてしまったので、簡潔スッキリ版も書いてみます。内容はだいたい同じです。

概要

「環境遅延変数」を使うべき例と、使い方をご紹介します。
うまく使わないと、if文やfor文の変数の値が、期待通りになりません。

コード

よくある失敗例

str_abbbを格納したが、echoで出力したらbbbにならないことがある」という例です。
(1)~(6)の順に、説明をお読みください。

delayedexpansion_sample_ng.bat
@echo off
set str_a=aaa
if 1==1 (       (1)if文中の %a% 形式の変数の値は、if文に入った時点の値に固定されるので、
  set str_a=bbb    (4)ここで格納した「bbb」が %str_a% で取得できるのは、if文を出た後です。
  echo %str_a%    (2)ここ(if文中)の %str_a% の値は、(1)時点の「aaa」です。
)
echo %str_a%     (5)if文を出た後なので、(4)で格納した「bbb」が取得できます。
実行結果
aaa          (3)「aaa」です。 ……(2)で書いた通り
bbb          (6)「bbb」です。 ……(5)で書いた通り

if文を例にしましたが、for文でも同じことが起きます。

改善例

前項から2か所修正しました。
・最初にsetlocal enabledelayedexpansion宣言を追加
echo出力に!str_a!を追加
(1)~(7)の順に、説明をお読みください。

delayedexpansion_sample_ok.bat
@echo off

rem 遅延環境変数の展開を有効にする
setlocal enabledelayedexpansion (1)これを書くと、 !a! 形式の変数が使えるようになります。

set str_a=aaa
if 1==1 (         (2)if文に入ると、 %str_a% は固定ですが、 !str_a! は格納した値。
  set str_a=bbb     (3)%str_a% は「aaa」のままですが、!str_a! は「bbb」に変わります。
  echo %str_a% !str_a! (4)if文中なので、%str_a%は(2)時点の値、!str_a!は(3)で格納した値。
)
echo %str_a% !str_a!  (6)if文を出た後なので、(3)で格納した「bbb」が %str_a% でも取得できます。
実行結果
aaa bbb         (5)「aaa bbb」です。 ……(3)(4)で書いた通り
bbb bbb         (7)「bbb bbb」です。 ……(6)で書いた通り

if文を例にしましたが、for文でも同じ対策が有効です。

おわりに

遅延環境変数を、なるべく少ない文章量で説明してみました。
わかりやすくなってるとよいのですが。

ではまた!

0
0
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
0
0