Windowsのバッチファイルは文法が腐りきっていてハマった 

Windowsのバッチファイルは文法が腐りきっていてハマったという話。

みんなWindowsバッチファイルなんか書かないだろうから簡単に説明すると、Windowsバッチファイルではif文は簡単に言うと以下の様な構成になる。

if "%VAR%"=="STRING" (
    文1
    文2
    :
)


なので、変数に値を代入して算術演算する以下の様な文を書いてみた。

set AAA=
set BBB=0
set VAR=STRING
if "%VAR%"=="STRING" (
    set AAA=10
    set /a BBB=%AAA%+20
)
echo %BBB%



このバッチファイルは期待される値30ではなくて20と出力します。10+20=20になるのです、意味が分かりません。
こんな短い文のどこに間違いが入り込む余地があるのかという位短いけれど、echo文を追加してバッチファイルの実行を追いかけてみると、set AAA=10 で値が代入されるのだけれど、次の行になると変数AAAの値が消え失せてしまうのだ。

で、ようやくto_dk notebookを見つけたのだけれど、とてもびっくりした。

バッチファイルではif文の()内の変数代入は、()から出た後に有効になる。

なん…だと…?
if文の()の中で代入した変数の値は、()の中で参照してはいけないという"仕様"と来たもんだ。これって、MSDOSの頃の貧弱なハードウェア上に実装しなければならなかったという制限のために、仕方なく我慢して作った仕様だよね。
その後ずっとほったらかしにしたままなんじゃねぇか、まともじゃないよ!

とにかくも正しく動作させるためには以下のように変更する必要がある。

set AAA=
set BBB=0
set VAR=STRING
if "%VAR%"=="STRING" (
    set AAA=10
)
set /a BBB=%AAA%+20
echo %BBB%


やれやれ、だからバッチファイルなんか書きたくないんだよ!

コメント

コメントの投稿















管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://haginov.blog35.fc2.com/tb.php/274-703ea23e