遅延環境変数
環境変数に関する用語だよ
「遅延環境変数の展開」まででワンセットだよ
読み込むときじゃなくて実行するときに値に置き換えるよ
簡単に書くよ
遅延環境変数(読:チエンカンキョウヘンスウ)とは
「遅延環境変数の展開」という形で出てくる用語で「バッチファイル
(コマンドプロンプトで実行できるコマンドをまとめて書いたファイル)で使う変数
(値を入れておく箱)を、コード
(今回はソースコードのこと。人間語で書いたプログラムの元ネタ)を読み込むときではなくて、実際にその処理を実行するときに値と置き換えるよ」のこと
です。
詳しく書くよ
最初に留意事項です。
ちょっと紛らわしいのですが「遅延環境変数」という名前の変数(値を入れておく箱)があるわけでは ありません。
「遅延環境変数の展開(チエンカンキョウヘンスウノテンカイ)」という表現で
あ~、その変数を値に置き換えるのはさ~。その行を読み込んだときじゃなくて実際に実行するときにやってね~
を意味します。
……と、いきなり結論を言われても、よく分かりませんよね。
大丈夫です。
順番に見ていきましょう。
まずは予備知識から説明します。
まず、変数は「値を入れておく箱」です。
バッチファイルは「コマンドプロンプト(黒い画面)で実行できるコマンドをまとめて書いたファイル」です。
バッチファイルの拡張子(ファイルの種類を表す目印)は「.bat」の場合が多いでしょう。
また、このページの説明では「環境変数」という用語も出てきます。
環境変数自体の意味を気にする必要は ありません。
今回、大事なのは
バッチファイルで使われる変数は、基本的に環境変数である
ということです。
ですから「遅延環境変数の展開」は「遅延バッチファイルで使われる変数の展開」さらにもう一歩進めて
バッチファイルで使われる変数の展開が遅延する
と読み替えてください。
「変数の展開が遅延する」つまり「変数を値に置き換えるのが遅くなる」です。
バッチファイルにおいて、環境変数の中身を見るときは、変数を「%(パーセント)」で囲みます。
例えば、変数「hensu_a」に値「ピヨ太」を設定して画面に表示する処理は
set hensu_a=ピヨ太
echo %hensu_a%
と書きます。
この処理は、1行目の
set hensu_a=ピヨ太
で変数「hensu_a」に値「ピヨ太」を設定して、2行目の
echo %hensu_a%
で画面に表示しています。
表示するときの変数「hensu_a」は「%hensu_a%」のように「%」で囲まれていますよね。
これがバッチファイルで変数の中身を見るときのルールです。
それを踏まえて、以下のバッチファイルを見てください。
@echo off
set hensu_a=ピヨ太
if "%hensu_a%" == "ピヨ太" (
set hensu_a=ピヨ子
echo %hensu_a%
)
pause
「@echo off」と「pause」は実行したときの処理結果を確認しやすくするために入れているだけです。
無視して かまいません。
大事なのは
set hensu_a=ピヨ太
if "%hensu_a%" == "ピヨ太" (
set hensu_a=ピヨ子
echo %hensu_a%
)
の部分です。
この処理は、まず
set hensu_a=ピヨ太
で、変数「hensu_a」に値「ピヨ太」を設定しています。
次に
if "%hensu_a%" == "ピヨ太" (
の条件判定です。
「変数『hensu_a』の中身は『ピヨ太』ですか~?」な条件判定なので、結果は「そうで~す」となります。
その後、カッコ内の処理、
set hensu_a=ピヨ子
echo %hensu_a%
に進みます。
ここで変数「hensu_a」に値「ピヨ子」を設定して、値を画面に表示しています。
つまり全体の処理は
set hensu_a=ピヨ太
(変数「hensu_a」に値「ピヨ太」を代入)
if "%hensu_a%" == "ピヨ太" (
(「hensu_a」には「ピヨ太」が入っていますか?な条件判定)
set hensu_a=ピヨ子
(「hensu_a」に「ピヨ子」を代入)
echo %hensu_a%
(「hensu_a」の中身を表示)
)
です。
このバッチファイルを実行すると、どんな結果になると思いますか?
答えは
ピヨ太
と画面に表示されます。
「ピヨ子」では ありません。
「ピヨ太」です。
表示する直前で変数「hensu_a」に値「ピヨ子」を入たのに「ピヨ太」と表示されます。
どうしてでしょうね?
種明かしをすると
変数の中身は、その行を読み込んだときに値に置き換わる
からです。
実は
if "%hensu_a%" == "ピヨ太" (
set hensu_a=ピヨ子
echo %hensu_a%
)
の部分は、まとめて一気に読み込まれます。
カッコの中の処理
(
set hensu_a=ピヨ子
echo %hensu_a%
)
は
if "%hensu_a%" == "ピヨ太"
が読み込まれるのと同じタイミングで読み込まれるのです。
そして、読み込まれた時点で、変数は値に置き換わります。
if "%hensu_a%" == "ピヨ太"
が読み込まれる時点で、条件判定部分とその後のカッコの中にある「%hensu_a%」は、すべて「ピヨ太」に置き換わります。
つまり、該当箇所が読み込まれた時点で
if "%hensu_a%" == "ピヨ太" (
set hensu_a=ピヨ子
echo %hensu_a%
)
が
if "ピヨ太" == "ピヨ太" (
set hensu_a=ピヨ子
echo ピヨ太
)
になってしまうのです。
その後で、実際の処理が行われます。
そんな理屈で、画面上には「ピヨ太」と表示されるのです。
パッと見は
echo %hensu_a%
ですが、実際には
echo ピヨ太
と同じですからね。
余談ですが、これを「環境変数の即時展開」と呼んだりします。
環境変数の中身が、読み込まれた時点で即時に展開される(値に置き換わる)から「環境変数の即時展開」です。
これがバッチファイルにおける変数が値に置き換わるときのルールです。
でも、これでは困る場合がありますよね。
読み込んだときではなく、実際に実行するときに値に置き換えてほしいです。
大丈夫です。
ご安心ください。
実は、バッチファイルの最初の方に
setlocal enabledelayedexpansion
と書いて、変数の中身を見るときに「%」ではなく「!(エクスクラメーションマーク)」で囲むと、読み込むときではなく実行するときに値に置き換えてくれます。
@echo off
setlocal enabledelayedexpansion
set hensu_a=ピヨ太
if "%hensu_a%" == "ピヨ太" (
set hensu_a=ピヨ子
echo !hensu_a!
)
pause
と変えることで、実行結果が「ピヨ子」と表示されるようになるのです。
このような
実行時に変数を値に置き換える
のを「遅延環境変数の展開」と言います。
個人的には「遅延環境変数の展開」ではなく「環境変数の遅延展開」と呼ぶべきだと思いますけどね。
なんで「遅延環境変数の展開」なんでしょ?
一言でまとめるよ
まぁ「遅延環境変数」って単語が出てきたら「『遅延環境変数の展開』まででワンセットで、読み込むときじゃなくて実行するときに値と置き換えてね~なんだな~」と お考えください。
おまけ
■検索してみる?






