記事一覧

DOSバッチでユーザー環境別に固有のプロパティを読み込む方法



目次



バッチファイルについて

ハロー、みなさん。エジソンです。

やっぱり、何だかんだ言っても DOSバッチ を使うのはやめられませんね。早いところ、Power Shell にでも移行したい所では有りますが、いまだに DOSバッチ 界隈をウロウロしている、エジソンでございます。

Wikipedia - バッチファイル
バッチファイル(Batch File)とは、MS-DOS、OS/2、Windowsでのコマンドプロンプト(シェル)に行わせたい命令列をテキストファイルに記述したもの。

バッチファイルを実行すると、シェルプログラム(一般に COMMAND.COMやcmd.exe)がそのファイルを読み、その中のコマンドを(通常)一行ずつ実行する。バッチファイルはUNIX系オペレーティングシステムのシェルスクリプトに相当する。

DOSのバッチファイルの拡張子は.BATである。他の環境のバッチファイルの拡張子は様々である。例えば、Windows NTやOS/2では.CMD が使われており、4DOS というフリーウェアでは .BTM が使われている。

今回は、そんなついつい存在を忘れがちな DOSバッチについて、ユーザー環境別に固有のプロパティを読み込んでバッチの挙動を変える方法を、まとめて行きたいと思います。

ユーザー環境別に固有のプロパティを読み込む

バッチ作成時に、困ることの一つとして、自分の環境では動作していたものが、人に渡してしまうと動かなくなってしまうということがあります。

そのため、以下の図のようにプロパティファイルに環境情報を定義し、バッチファイル実行時に読み込ませるという手法を用いることで、環境依存情報を局所化して管理できるようになります。


図1




ただ、これだと上手の吹き出しにも書かれているように、編集後にSVNなどのバージョン管理ツールに誤ってコミットすることもあるため、注意が必要です。

このような誤操作を根本的になくすには、オリジナルのファイルを上書き編集するのではなく、環境ごとに異なるファイルを読み込ませることで、危険を減らすことができます。例えば、実行する端末名の一部をファイル名にするという方法が挙げられます。


図2




今回は、図2のように動作するバッチファイルを動かすべくサンプルを紹介することにします。

[バッチサンプル] - カレントディレクトリのパスを変数に格納する

バッチ本体とプロパティファイルは同一フォルダに存在するという前提で読み込みを行うため、バッチ実行時のバッチ本体のパスを取得します。

相対パスで実施するという方法もありますが、作業ディレクトリによっては失敗するケースがあるため、フルパスを取得してファイルパスを構築するのが無難といえます。

test.bat
@echo off

set curpath=%cd%
set curpath=%~dp0

echo %curpath%

@echo on

[バッチサンプル] - バッチ実行のためのプロパティバッチを実行する

バッチ本体からプロパティファイルを実行します。プロパティファイルには変数が定義されており、プロパティファイルを実行することで、変数を読み取ることができます。それらの変数は、”var1”・”var2”という二つの変数です。

test.bat
@echo off

set curpath=%cd%
set curpath=%~dp0

call %curpath%test_prop.bat

echo %var1%
echo %var2%

@echo on

test_prop.bat
set var1=あいうえお
set var2=かきくけこ

[バッチサンプル] - ホスト名に紐づくプロパティバッチを実行する

ホスト名は、hostnameコマンドで得られます。ただし、コマンドの結果値を変数に格納するには少々工夫が必要で、for文を使う必要があります

端末名を結果として得られたら、環境ごとのプロパティファイルが存在するかをチェックし、存在していれば環境ごとのプロパティファイルを読み込み、ファイルがない場合はデフォルトのプロパティファイルを読み込むといった処理の流れになっています。

test.bat
@echo off

set curpath=%cd%
set curpath=%~dp0

for /f "usebackq" %%t in (`hostname`) do set hname=%%t

if exist %curpath%test_prop_%hname%.bat (
	call %curpath%test_prop_%hname%.bat

) else (

	call %curpath%test_prop.bat
)

echo %var1%
echo %var2%

@echo on

test_prop_[端末名].bat
set var1=さしすせそ
set var2=たちつてと

まとめ

ユーザー環境別に固有のプロパティを読み込む際に、端末に固有なホスト名を取得するのも良いと思いますし、端末に固有の情報を読み込む別の方法があるならば、そちらを利用するのも良いかと思います。

今回の話は、バッチに限らず様々な場面で応用できる考え方です。僕がこのような処理に思い至るきっかけになったのは、fuelphpというphpのフレームワークにて、環境設定ファイルをディレクトリ別に管理する仕組みがあるのを見たおかげです。

良いものは貪欲に吸収し、自らの血と肉になるように取り込んでいきたいものですね。

関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp