[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

遅延環境変数

pointこの用語のポイント

point環境変数に関する用語だよ

point「遅延環境変数の展開」まででワンセットだよ

point読み込むときじゃなくて実行するときに値に置き換えるよ

スポンサーリンク

簡単に書くよ

遅延環境変数とは

「遅延環境変数の展開」という使い方で「バッチファイルで使う変数を、コードを読み込むときではなくて、実際にその処理を実行するときに値と置き換えるよ」のこと
です。

image piyo

詳しく書くよ

紛らわしいのですが「遅延環境変数」という名前の変数(値を入れておく箱)があるわけではありません。
「遅延環境変数の展開」という表現で「あ~、その変数を値に置き換えるのはさ~。その行を読み込んだときじゃなくて実際に実行するときにやってね~」を意味します。

……と、いきなり結論を言われてもよく分からないですよね。

大丈夫です。
順番に見ていきましょう。

まず、変数は「値を入れておく箱」ね。

遅延環境変数

バッチファイルは「コマンドプロンプト(黒い画面)で実行できるコマンドをまとめて書いたファイル」です。
バッチファイルの拡張子は「.bat」の場合が多いでしょう。

遅延環境変数2

また、このページの説明では「環境変数」という言葉も出てきます。
環境変数自体の意味を気にする必要はありません。
ここで大事なのは

バッチファイルで使われる変数は、基本的に環境変数である

ということです。

ですから「遅延環境変数の展開」は「遅延バッチファイルで使われる変数の展開」さらにもう一歩進めて

バッチファイルで使われる変数の展開が遅延する

と読み替えてください。
「変数の展開が遅延する」つまり「変数を値に置き換えるのが遅くなる」です。

バッチファイルにおいて、環境変数の中身を見るときには、変数を「%(パーセント)」で囲みます。
例えば、変数「hensu_a」に値「ピヨ太」を設定して画面に表示する処理は

set hensu_a=ピヨ太
echo %hensu_a%


と書きます。
一行目の

set hensu_a=ピヨ太

で変数「hensu_a」に値「ピヨ太」を設定して、二行目の

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


と変更することで、実行結果が「ピヨ子」と表示されるようになるのです。

このように「実行時に変数を値に置き換える」ようにすることを「遅延環境変数の展開」と言います。

個人的には「遅延環境変数の展開」ではなく「環境変数の遅延展開」と呼ぶべきだと思いますけどね。
なんで「遅延環境変数の展開」なんでしょ?

image piyo2

一言でまとめるよ

まぁ「遅延環境変数」って単語が出てきたら「『遅延環境変数の展開』まででワンセットで、読み込むときじゃなくて実行するときに値と置き換えてね~のことなんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク