バッチファイルから外部の設定ファイル(txtやini)を読み込んで値を取得する方法は、システム管理や自動化スクリプトでよく使われますよね。
この記事では、具体例を交えながらその手順を解説します。
Windowsをもっと使いたおす方法
この記事ではWindowsのかいつまんだ機能について紹介していますが、Windowsをもっと使いたおすための学習方法ついてはこちらにまとめています。
設定ファイルの準備
まず、以下のような設定ファイル 「settings.ini 」を用意します。
path1=\\server001\test\
filename1=template1.xlsx
path2=\\server002\test\
filename2=template2.xlsx
ここでは「それっぽく」するために、設定ファイルの名前を拡張子iniにしていますが、拡張子は.txtでも.csvでも構いません。その場合は下記のコード内で「settings.ini」と記述のあるところを .txt や .csv に変更してください。
バッチファイルの記述
次に、バッチファイルでこの設定ファイルを読み込み、値を取得するような流れを作ります。
以下のような「sample.bat」を作成しましょう。
set exist_flg=0
for /f "delims==, tokens=1,2" %%a in (%~dp0settings.ini) do (if "path1"=="%%a" set path1=%%b)
for /f "delims==, tokens=1,2" %%a in (%~dp0settings.ini) do (if "filename1"=="%%a" set filename2=%%b)
for /f "delims==, tokens=1,2" %%a in (%~dp0settings.ini) do (if "path2"=="%%a" set path2=%%b)
for /f "delims==, tokens=1,2" %%a in (%~dp0settings.ini) do (if "filename2"=="%%a" set filename2=%%b)
rem ファイル存在確認
if exist %path1%%filename1% (
echo OK
) else (
echo NG
set exist_flg=1
)
if exist %path2%%filename2% (
echo OK
) else (
echo NG
set exist_flg=1
)
if %exist_flg% equ 1 (
echo 不足ファイルがあるため処理を中断します
pause
exit
)
rem Pythonスクリプトなどに値を渡す
cd /d %~dp0
d:\WPy64-31050\scripts\python D:\test.py %path1%%filename1% %path2%%filename2%
バッチファイルのポイント
可読性の悪い3行目を取り上げて説明しておきます。
for /f "delims==, tokens=1,2" %%a in (%~dp0settings.ini) do (if "path1"=="%%a" set path1=%%b)
delims==
イコールが2つ続いているのは、区切り文字を”=”にするために、delims=で”=”を指定しています。
tokens=1,2
区切られた各文字列1つ1つのことをトークンと呼びます。ここでは「1番目と2番目のトークをとってきて」という書き方にしています。
%%a
2つ以上のトークンを指定した場合、2つ目以降のトークンは指定したアルファベット%%aの次の文字が勝手に宣言されて使用されます。ここでは2つ目のトークンは%%b
初めにaを指定しているので、トークンが5個あれば、b,c,d,e…とトークンの数分だけ続きます。
ここまでの記述によって、iniファイルから読み込まれた1行目「path1=\\server001\test\」は”=”で分割され、1列目は「path1」、2列目は「\\server001\test\」と認識されます。そして自動的に%%a、%%bに格納されます。
do (if “path1″==”%%a” set path1=%%b)
もし”path1″に1列目の値(%%a)が一致したら(言い換えると1列目が”path1″であったら)、変数path1に2列目の値(%%b、ここでは”\\server001\test\”)をセットしなさい、ということです。
この方法を使うと、テキストファイルをちょっとしたデータベースとして使用でき、自由にデータを呼び出したりできます。便利ですので覚えておきましょう。