2011年10月19日水曜日

[バッチファイル][変数の外部ファイル化]

WindowsのバッチファイルはUNIX系のシェルに比べて機能が弱く、文法も独自で使い勝手が悪い。
しかし開発等でWindowsでバッチファイルを作って効率化しなければならない局面は多い。
バッチファイルで問題となるのが絶対パスの指定等が必要な場合である。

パス指定は開発者の環境によって変わりうるため、必然的に可変部分を外部ファイルとして切り出したいニーズが出てくる。
可変となる設定部分を外部ファイル化してバッチファイルで読むサンプルは、次の通り。

まず最初に、可変の設定値を集めたテキストファイルを作成する。(例えばsetup.txt)
設定値は "[設定値の名前]=[設定値]" の形式で記述する規則とする。
以下、設定サンプル。

USER_NAME=user
PASSWORD=password

次に作成した設定値のファイルをバッチから読み込むコードを記述する。
バッチファイルを作成し、次のように記述して設定値が読めることを確認する。

@echo off
for /f "tokens=1,2 delims==" %%a in ('findstr USER_NAME setup.txt') do set USER_NAME=%%b
for /f "tokens=1,2 delims==" %%a in ('findstr PASSWORD setup.txt') do set PASSWORD=%%b
echo %USER_NAME%
echo %PASSWORD%
pause

設定ファイル内の設定を読む場合などに重宝するのはforを使った繰り返し処理である。
(下記箇所が、設定を読み込んでいる記述)

for /f "tokens=1,2 delims==" %%a in ('findstr USER_NAME setup.txt') do set USER_NAME=%%b

for /f [解析文字列]
と記述することで、解析文字列内で指定した方法でトークンを切り出すことができるようになる。
"tokens=1,2 delims==" と書いた場合、文字列中にトークンが2つあり、"=" で区切られていると解釈される。
"USER_NAME=user" という設定が書いてあった場合は、トークン1がUSER_NAME、トークン2がuserと解釈される。

%%aはループ内変数を示し、"token=1,2" と書いてあった場合はトークン1(USER_NAME)を示す。
%%bはトークン2(user)を示す。

in ()の括弧内にシングルクオートで囲んだ文字列を指定した場合、コマンドを実行した結果を示す。
in ('findstr USER_NAME setup.txt') とあった場合は、setup.txtというファイル内にUSER_NAMEという文字列があるかfindstrコマンドで探した結果が入る。
上記例でsetup.txtには "USER_NAME" という文字列を含む "USER_NAME=user" という行データが入る。

do以下は、forループで実行されるコマンドを記述する。
set USER_NAME=%%bでUSER_NAMEというバッチ変数にuserという文字列を代入している。
これにより、ファイルから読み込んだ値をバッチファイル内の変数としている。

0 件のコメント:

コメントを投稿