トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

CMD.EXEの遅延環境変数の展開


参照
http://f32.aaa.livedoor.jp/~kobun/index.php?CMD.EXE%A4%CE%C3%D9%B1%E4%B4%C4%B6%AD%CA%D1%BF%F4%A4%CE%C5%B8%B3%AB

環境変数の即時展開

バッチファイルを書いていると、変数が思っても見なかった動きをして、困ってしまうことがあります。例えば

@echo off
setlocal
set HOGEHOGE="foobar"
if %HOGEHOGE% == "foobar" (
  set HOGEHOGE="hogehuga"
  echo %HOGEHOGE%
)
endlocal

といった内容のバッチファイルがあったとします。これをぱっと見ると"hogehuga"という出力がされると期待してしまいますが、実際に実行してみると"foobar"という出力結果が得られます。なぜこのような結果になるかといいますと、各コマンドが実行されるときに環境変数が展開されるのではなく、バッチファイルのテキスト行が読み取られるときに展開が行われてしまうからで、上の例は次のように解釈されているために期待した結果が得られないのです。

@echo off
setlocal
set HOGEHOGE="foobar"
if "foobar" == "foobar" (
  set HOGEHOGE="hogehuga"
  echo "foobar"
)
endlocal

これを、環境変数の即時展開と呼びます。

遅延環境変数の展開

環境変数の即時展開を避けたい場合には"遅延環境変数の展開"という機能を使います。

setlocal enabledelayedexpansion

と、バッチファイル中に書きますとその行から、endlocalに達するまで遅延環境変数の展開が有効になり、変数名を"!"(感嘆符)で囲うことで即時展開を避けることが可能になります。

@echo off
setlocal enabledelayedexpansion
set HOGEHOGE="foobar"
if %HOGEHOGE% == "foobar" (
  set HOGEHOGE="hogehuga"
  echo !HOGEHOGE!
)
endlocal

このようにしますと"hogehuga"という出力結果を得ることが出来るようになります。

他の手段としては

call echo %%HOGEHOGE%%

とする

[カテゴリ: OS > Windows > コマンドプロンプト]


  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2008年05月25日 22時57分46秒