とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

スポンサーサイト

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

スポンサードリンク

バッチファイルのif文やfor文で気をつけること

if文の中で変数の値が反映されない


バッチスクリプトでハマッた。
if文、for文の中で変数を操作する処理を書いても
予想した通りの結果になりません。

「遅延環境変数の展開」という機能を有効にする必要があるので
注意点をメモしておきます。

作ったバッチファイルは以下


変数[Delay]に1をセットして
if文の中で+1する。

結果は2となっているので
Delay is 1
Delay is 2
final:Delay is 2

が期待する動き。

でも結果は・・・・
Delay is 1
final:Delay is 2

if文の中で2になっているはずなのに判断されてないぞ!?

バッチファイルのif文for文の仕様


if文、for文の中に書いた処理は
「()を抜けてから」変数の値が反映されるようです。
バッチファイルにおいて、コマンドは1行ずつ処理するけど、
if文は括弧()を1行として解釈するみたい。

つまり、ifの中で変数を変更して、その結果を参照するような処理は
書いても無駄ってことだね。

でも、直感的に書きたいよね・・・

遅延環境変数の展開


というわけで直感的に書には、次の2つが必要です。

1.setlocalコマンドにオプション「enabledelayedexpansion」を付ける。
2.変数の展開は「%」ではなくて「!」で行なう。

修正したバッチファイル


結果は・・・・
Delay is 1
Delay is 2
final:Delay is 2

よかった・・・

この解決方法にたどり着くにはifじゃなくて
setlocalのヘルプにヒントが書いてある。


setlocal /?
バッチ ファイルで環境変更のローカル化を開始します。SETLOCAL を実行した後で
変更した環境設定は、そのバッチ ファイルだけで有効です。前の設定を復元するときは
ENDLOCAL を実行しなければなりません。バッチ スクリプトの終わりに達したとき、
暗示的な ENDLOCAL が、そのバッチ スクリプトによって発行されたすべての未完了の
SETLOCAL コマンドのために実行されます。

SETLOCAL

コマンド拡張機能を有効にすると、SETLOCAL は次のように変更されます:

SETLOCAL バッチ コマンドは、オプション引数を受け取ることができます:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
は、コマンド処理機能を有効または無効にできます。これらの
引数は、CMD /E:ON または /E:OFF スイッチよりも優先されます。
詳細については、CMD /? を参照してください。
ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
は、遅延環境変数の展開を有効または無効にできます。
これらの引数は、CMD /V:ON または /V:OFF スイッチよりも優先します。
詳細については、CMD /? を参照してください。
これらの変更は、SETLOCAL コマンドの実行前の設定にかかわらず、対応する
ENDLOCAL コマンドを実行するまで継続されます。

SETLOCAL コマンドに引数を指定すると、ERRORLEVEL の値が設定されます。


こんなんで分かるわけないです!
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:プログラミング - ジャンル:コンピュータ

コメント

コメントの投稿


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

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/79-8134dac6
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

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