アクセラと+αな生活
アクセラとα350と共に過ごす気まぐれ日記です。
Firefox ブラウザ無料ダウンロード
2017年08月
≪07月  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31    09月≫
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
いや~、知らなくて悩まされました....><;

題名からして、とてもマニアックなお話です。
バッチファイルの検証をしていて、思ってもみなかった動作で困ってました...

以下のようなバッチだと

@echo off
setlocal
set AAAA="1"
if %AAAA% == "1" (
set AAAA="2"
echo %AAAA%
)
endlocal


echoコマンド(標準出力に出すコマンド)の直前に"2"をセット(set AAAA="2")してますから、"2"が出力されると思ってましたが....
実際には"1"が出力されます。

何で何で、ありえないありえない???
と悩んで調べてみると、





バッチはコマンド実行時に環境変数が展開されるのではなく、テキスト行が読み取られるときに展開されるようです。
つまり、echoコマンドが実行されるときには「set AAAA="2"」は無視されて、「AAAA」は"1"と解釈されてしますのです...
(これを環境変数の即時展開というらしい)

で、解決策としては「環境変数の遅延展開」というのがあり、
「setlocal enabledelayedexpansion」を宣言し、環境変数を"!"でくくると即時展開を避けることができるのですwwww
つまり、「AAAA」はechoコマンドが実行されるときには直前の「set AAAA="2"」の結果が反映されて展開されるようになります。

で、上の例では

@echo off
setlocal enabledelayedexpansion
set AAAA="1"
if %AAAA% == "1" (
set AAAA="2"
echo !AAAA!
)
endlocal

とすると、「set AAAA="2"」が有効となり、「AAAA」は"2"となるため、"2"が出力されるようになります。

う~ん、そんなこと、今まで知りませんでした。。。。
知ってればたいしたことなのかもしれないけど、無知な私はすご~~~~く悩まされました...とさ。


コメント
この記事へのコメント
URL :
コメント :
パスワード :
管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
Template designed by アクセラと+αな生活

Powered by .
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。