🕌
【バッチ】遅延環境変数について
はじめに
遅延環境変数(以下、「コイツ」)を初めて仕事で見て散々に苦しめられた。
鉄は熱いうちに打て、ということでいつも通りメモ。
内容
百聞は一見にしかず。
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