🕌

【バッチ】遅延環境変数について

2023/03/15に公開

はじめに

遅延環境変数(以下、「コイツ」)を初めて仕事で見て散々に苦しめられた。
鉄は熱いうちに打て、ということでいつも通りメモ。

内容

百聞は一見にしかず。

set creature="猿"

if %creature%=="猿" (
    echo %creature%が進化しました。
    set creature="ニンゲン"
    echo %creature% 「私は%creature%です。」
)

このバッチを実行した結果は、以下のようになる。

猿が進化しました。
猿「私は猿です。」

なんで????????

詳細

実はこの挙動は正しく、通常はsetにて値を設定すると、以降の変数部分に即座に反映される。そのため、if文の条件判定を行っている頃には既に『猿「私は猿です。」』と出力されることは決まっていた。

こういったことをなくし、想定した動きをさせたい場合、コイツを使う必要がある。

まず、コイツを使うために、setlocal enabledelayedexpansionと宣言をする必要がある。
劇的に読みにくいが、enable delayed expansion、つまりコイツを有効にする呪文となる。

この呪文を唱えた後、コイツを使えるようになるのだが、通常の変数と違いパーセントではなくエクスクラメーション(!マーク)で変数を囲う必要がある。(%creature%ではなく、!creature!と言った具合)

コイツを使い終えたら、後始末としてendlocalを唱える。
こうすることで以降はコイツに囚われなくて済むようになる。

以上を踏まえると、最初に提示したソースコードはこうなり、結果も想定したものとなる。

setlocal enabledelayedexpansion
set creature="猿"

if !creature!=="猿" (
    echo !creature!が進化しました。
    set creature="ニンゲン"
    echo !creature! 「私は!creature!です。」
)
endlocal

猿が進化しました。
ニンゲン「私はニンゲンです。」

まとめ

Windowsのバッチは一癖も二癖もあるが、上手く使いこなして効率よく業務をこなして行きたい。

Discussion