- 環境変数の即時展開
バッチファイルを書いていると、変数が思っても見なかった動きをして、困ってしまうことがあります。例えば@echo off
といった内容のバッチファイルがあったとします。これをぱっと見ると"hogehuga"という出力がされると期待してしまいますが、実際に実行してみる と"foobar"という出力結果が得られます。なぜこのような結果になるかといいますと、各コマンドが実行されるときに環境変数が展開されるのではな く、バッチファイルのテキスト行が読み取られるときに展開が行われてしまうからで、上の例は次のように解釈されているために期待した結果が得られないので す。
setlocal
set HOGEHOGE="foobar"
if %HOGEHOGE% == "foobar" (
set HOGEHOGE="hogehuga"
echo %HOGEHOGE%
)
endlocal@echo off
これを、環境変数の即時展開と呼びます。
setlocal
set HOGEHOGE="foobar"
if "foobar" == "foobar" (
set HOGEHOGE="hogehuga"
echo "foobar"
)
endlocal - 遅延環境変数の展開
環境変数の即時展開を避けたい場合には"遅延環境変数の展開"という機能を使います。setlocal enabledelayedexpansion
と、バッチファイル中に書きますとその行から、endlocalに達するまで遅延環境変数の展開が有効になり、変数名を"!"(感嘆符)で囲うことで即時展開を避けることが可能になります。@echo off
このようにしますと"hogehuga"という出力結果を得ることが出来るようになります。
setlocal enabledelayedexpansion
set HOGEHOGE="foobar"
if %HOGEHOGE% == "foobar" (
set HOGEHOGE="hogehuga"
echo !HOGEHOGE!
)
endlocal
Wednesday, August 10, 2011
環境変数の展開について
バッチファイル内での特殊文字のエスケープについて。
バッチファイル(というかコマンドプロンプト)での特殊文字のエスケープについてメモしておきます。
※ ここでいう「特殊文字」というのは、以下の記号のことです。
- 「
<
」 (小なり記号) - 「
>
」 (大なり記号) - 「
|
」 (縦棒/パイプ記号) - 改行
とくにリダイレクト関係の記号については、そのまま使うと「コマンドの構文が誤っています。」とおこられること請け合いです。
話は単純でして、上記のような特殊な文字をバッチファイル内(やコマンドプロンプト)でただの文字として使用するには、特殊文字の前に「^
」 (サーカムフレックス/ハット記号)を置けばよいです。
つまり、
ECHO ^< ECHO ^> ECHO ^| ECHO aaa^ bbb
のように記述すれば、
< > | aaabbb
と表示されるわけなのでした
Subscribe to:
Posts (Atom)