Wednesday, August 10, 2011

環境変数の展開について

  • 環境変数の即時展開
    バッチファイルを書いていると、変数が思っても見なかった動きをして、困ってしまうことがあります。例えば
    @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"という出力結果を得ることが出来るようになります。

No comments:

Post a Comment