« システムドライブのSSDを換装する | トップページ | Androidアプリのソースをリビルドする »

2012/10/04

WindowsのバッチファイルのFOR内で 遅延環境変数の展開 をしつつ、FORの外でその値を参照する方法

タイトルがむっちゃ長くてしかも何を言っているのかさっぱりなんですが、Windowsのコマンドが解る人には解ると思います。たぶん。

最近、Windowsのバッチファイルを作る機会が多くあり、すっかり忘れていたコマンドの使い方を覚えなおしています。
ちなみに、ネットで調べるとき、「コマンド」で調べるとLinuxにヒットしてしまうので、コマンドプロンプト と付けると割りと探しているものが見つかります。

で、バッチファイルを作っている際に困った状態になりました。

settei.ini という 設定ファイルに
A
B
C

と書かれていて、この値を1個ずつ引数にして別のバッチを動かし、
その別のバッチで設定したメッセージを取得したい場合、

SUBBAT.bat に

~いろんな処理
SET SUBMESSAGE=メッセージ

と書かれていて、


MAINBAT.bat で

SET MESSAGE=
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=%MESSAGE%%SUBMESSAGE%
)

と SUBBAT.bat にある %SUBMESSAGE% を MAINBAT.bat のループ内の %MESSAGE% に追記しようとしても
うまくいきません。

というのも、 FOR のカッコ内は、FORが実行される時に変数が展開されてしまうから、
この時点で %MESSAGE% にも %SUBMESSAGE% にも値が無いので
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=
)
と同じことになってしまいます。

そんなわけで、SET MESSAGE= の時に変数を展開させるため、

SET MESSAGE=
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F %%VAL in (settei.ini) do (
  CALL SUBBAT.bat %%VAL
  SET MESSAGE=%MESSAGE%,%SUBMESSAGE%
)
ENDLOCAL
ECHO %MESSAGE%

とすると、途中まで想定通りに動きます。
しかし、ECHO %MESSAGE% では何も表示されません。

というのも、ENDLOCAL を通り過ぎると %MESSAGE% が SETLOCAL を通る前の値に戻るので、
設定した値を参照できないからです。


どうすればいいのだ?と思って調べたら、
IIJIMASの日記って所に
バッチファイルで、setlocal~endlocal内での変数の値を外部に引き継ぎたい!
というズバリな記事がありました。

ENDLOCAL && SET MESSAGE=%MESSAGE%

とすれば、ENDLOCAL を通り過ぎても %MESSAGE% の値を参照できました。


できたのはいいが、
なんで Windows のバッチファイルは毎度毎度、こんなに裏技っぽいんだろう???

|

« システムドライブのSSDを換装する | トップページ | Androidアプリのソースをリビルドする »

Windows」カテゴリの記事

コマンド」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/54336/55808720

この記事へのトラックバック一覧です: WindowsのバッチファイルのFOR内で 遅延環境変数の展開 をしつつ、FORの外でその値を参照する方法:

« システムドライブのSSDを換装する | トップページ | Androidアプリのソースをリビルドする »