【バッチファイル】バッチファイルからiniファイルの設定値を取得するには

この記事では、バッチファイルからiniファイルの設定値を取得する方法についてご説明します。

【動画】バッチファイルからiniファイルの設定値を取得する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


iniファイルの全行をバッチファイルが設定値を検索し、見つかったらコマンドプロンプトの画面上に出力させています。

iniファイルの例

今回は以下のiniファイルを用意しました。

[connVal]
server=localhost
port=3306
database=testdb

[tableInfo]
tableName=syain
whereVal1=1
whereVal2=東京都
whereVal3=28

今回は「port」の値と「whereVal2」の値を取得してみます。

バッチファイルを実行した結果は下のとおりです。

「port」の値「3306」と、「whereVal2」の値「東京都」が取得されて出力されています。

コードの例

@echo off

rem 遅延環境変数展開を有効にする
setlocal enabledelayedexpansion

rem iniファイルのパスを設定する
set INI_FILE=C:\work\10_勉強\17_バッチファイル\0011\info.ini

rem 取得したいキーの名前を設定する
set KEYS_TO_GET=port whereVal2

rem KEYS_TO_GETの値にあるスペース文字で区切られた値(キー)の数だけ処理を繰り返すFor文
rem  ⇒KEYS_TO_GETには「port whereVal2」が格納されているので、2回繰り返す
for %%A in (%KEYS_TO_GET%) do (

    rem iniファイルから変数Aの値を検索して見つかった行数分処理を繰り返すFor文
    rem もし行が見つかった場合は、「=」を区切り文字として見つかった行を「=」で区切り、第1トークンを変数Bに格納する
    for /f "tokens=1* delims==" %%B in ('type "%INI_FILE%" ^| findstr /i "^%%A="') do (
    
        rem 変数Bに格納されているキー(第1トークンの値)に対して変数Cの値(第2トークンの値)を設定する
        set %%B=%%C
        
    )
)

rem KEYS_TO_GETの値にあるスペース文字で区切られた値の数だけ処理を繰り返すFor文
for %%A in (%KEYS_TO_GET%) do (

    rem KEYS_TO_GETの値にあるスペース文字で区切られた値(キー)に対する値(キーの設定値)を出力する
    echo !%%A!
    
)

rem setlocalコマンドによって変更されたローカル環境変数の設定を元に戻す
endlocal

rem 処理を中断する(変数確認用)
pause

注目すべきコード①

最初に見て頂きたいのは4行目です。

rem 遅延環境変数展開を有効にする
setlocal enabledelayedexpansion

コードの説明

以上のコードは、遅延環境変数展開を有効にする処理のコードです。

変数の値を変更する場合に、その変更がすぐに反映されない場合があります。

今回のコードではFor文の中で何度か変数への値の格納処理が行われるので、この遅延環境変数展開を有効にする必要があります。

注目すべきコード②

次に見て頂きたいのは7行目です。

rem iniファイルのパスを設定する
set INI_FILE=C:\work\10_勉強\17_バッチファイル\0011\info.ini

コードの説明

以上のコードは、iniファイルの置き場を変数INI_FILEに設定しているコードです。

注目すべきコード③

次に見て頂きたいのは10行目です。

rem 取得したいキーの名前を設定する
set KEYS_TO_GET=port whereVal2

コードの説明

以上のコードは、iniファイルから取得したい値のキーを変数「KEYS_TO_GET」に設定しているコードです。

今回は「port」と「whereVal2」のキー名を取得したいので、この2つの文字列をスペースで結合させています。

注目すべきコード④」で詳しく説明しますが、「port」と「whereVal2」の文字列をスペースで連結させることで、For文で「port」と「whereVal2」の文字列を取得することができます。(「port」と「whereVal2」の文字列がスペースで区切られて取得される)

注目すべきコード④

次に見て頂きたいのは14行目です。

rem KEYS_TO_GETの値にあるスペース文字で区切られた値(キー)の数だけ処理を繰り返すFor文
rem  ⇒KEYS_TO_GETには「port whereVal2」が格納されているので、2回繰り返す
for %%A in (%KEYS_TO_GET%) do (

コードの説明

以上のコードは、KEYS_TO_GETの値にあるスペース文字で区切られた値(キー)の数だけ処理を繰り返すFor文です。

今回は変数KEYS_TO_GETには「port whereVal2」の文字が格納されていますが、「port」と「whereVal2」の文字列をスペース文字で結合させており、For文がスペース文字で「port whereVal2」の文字列を区切り変数Aに格納します。

下の画像のように、for文で処理を繰り返すと「port」と「whereVal2」の値が取得されます。(変数Aの値の確認)

以上のとおりKEYS_TO_GETには「port whereVal2」が格納されているので、for内の処理を2回繰り返します。

また上記の画像の「port」と「whereVal2」の値は変数Aに格納されます。

注目すべきコード⑤

次に見て頂きたいのは18行目です。

    rem iniファイルから変数Aの値を検索して見つかった行数分処理を繰り返すFor文
    rem もし行が見つかった場合は、「=」を区切り文字として見つかった行を「=」で区切り、第1トークンを変数Bに格納する
    for /f "tokens=1* delims==" %%B in ('type "%INI_FILE%" ^| findstr /i "^%%A="') do (

コードの説明

以上のコードは、iniファイルから変数Aの値を検索して見つかった行数分処理を繰り返すFor文です。

もし行が見つかった場合は、「=」を区切り文字として見つかった行を「=」で区切り、第1トークンを変数Bに格納します。

コードの詳細

①for、in、do

forはコマンドで、処理を繰り返すコマンドです。

For文はinとdoを組み合わせて使います。

inはFor文の構文の一部で、inの後にはループ処理の対象を指定します。

doもFor文の構文の一部で、doの後に指定されたコマンドを実行します。

②/f

「/f」はforコマンドのオプションです。

「/f」オプションはファイルまたはコマンドの実行結果を変数に読み込むときに使います。

今回はコマンド(type “%INI_FILE%” ^| findstr /i “^%%A=”)の実行結果を扱うので、「/f」オプションを使います。

③tokens=1*

「tokens=1」は「wmic os get localdatetime」コマンドが返す値に対し、区切り文字で分けられる1番目の文字列の指定を表します。

もし「tokens=2」なら2番目の文字列の指定を表します。

今回は年月日時分秒が欲しいので、「tokens=1」を指定しています。

④delims==

「delims==」は、区切り文字に「=.」を指定する設定です。

「delims=」に「=」を結合させることで、「=」を区切り文字に指定することができます。

「type “%INI_FILE%” ^| findstr /i “^%%A=”」のコマンドを実行すると、変数Aの値に該当する行を取得しますが、取得した値には、例えば今回なら変数Aに「port」が格納されている場合に「port=3306」の行が取得されます。

この「port=3306」の行の値を「=」で区切ると「port」と「3306」の値に分けられます。

「delims=」と指定することで「=」で区切ることができ、「=」で区切られた「port」が第1トークン、「3306」が第2トークンとなります。

⑤%%B

%%Bは、「type “%INI_FILE%” ^| findstr /i “^%%A=”」のコマンドを実行した結果取得された値の第1トークンの値を格納する変数です。

「“tokens=1* delims==”」の指定により、「=」を区切り文字として1つ目のトークンを変数Bに格納します。

⑥type “%INI_FILE%”

「type “%INI_FILE%”」は、typeコマンドを使ってiniファイルの一覧を出力する処理のコマンドです。

変数INI_FILEにはiniファイルの置き場のフルパスが格納されています。

⑦^|

「^|」は、「type “%INI_FILE%”」のコマンドと、「findstr /i “^%%A=”」のコマンドを連結させるものです。

「^|」を使って連結させることで、1行で「type “%INI_FILE%”」と「findstr /i “^%%A=”」のコマンドを実行することができます。

順番は「type “%INI_FILE%”」のコマンドを実行して次に「findstr /i “^%%A=”」のコマンドを実行します。

また、「|」の前に「^」(キャレット)を記述しているのは、「^」が無いと「|」が機能しないからです。

なので、「|」だけでなく「^」も記述しています。

⑧findstr /i “^%%A=”

「findstr /i “^%%A=”」は、「type “%INI_FILE%”」で出力されたiniファイルの内容から変数Aの値に該当する行を検索するコマンドです。

もし変数Aに「port」の文字列が格納されている場合は、「port」の文字列を含む行を検索し、存在している場合にその行を返します。

注目すべきコード⑥

次に見て頂きたいのは19行目です。

        変数Bに格納されているキー(第1トークンの値)に対して変数Cの値(第2トークンの値)を設定する
        set %%B=%%C

コードの説明

以上のコードは、変数Bに格納されているキー(第1トークンの値)に対して変数Cの値(第2トークンの値)を設定する処理のコードです。

setコマンドは環境変数に値を設定します。

今回の場合、もし変数Bに「port」が格納されている場合、この「port」の環境変数に対して「3306」の値が設定されます。

以下の画面は、「set %%B=%%C」実行後の各変数の値を確認するために出力させた結果です。

1行目の「port」の値は、変数Bに格納された値です。(%%B)

2行目の「3306」の値は、変数Cに格納された値です。(%%C)

3行目の「3306」の値は、変数Bに格納されている環境変数「port」の値です。(!%%B!)

以上により、「port」の環境変数には「3306」が、「whereVal2」の環境変数には「東京都」が設定されました。

注目すべきコード⑦

次に見て頂きたいのは27行目です。

rem KEYS_TO_GETの値にあるスペース文字で区切られた値の数だけ処理を繰り返すFor文
for %%A in (%KEYS_TO_GET%) do (

コードの説明

以上のコードは、KEYS_TO_GETの値にあるスペース文字で区切られた値(キー)の数だけ処理を繰り返すFor文です。

今回は変数KEYS_TO_GETには「port whereVal2」の文字が格納されていますが、「port」と「whereVal2」の文字列をスペース文字で結合させており、For文がスペース文字で「port whereVal2」の文字列を区切り変数Aに格納します。

下の画像のように、for文で処理を繰り返すと「port」と「whereVal2」の値が取得されます。(変数Aの値の確認)

以上のとおりKEYS_TO_GETには「port whereVal2」が格納されているので、for内の処理を2回繰り返します。

また上記の画像の「port」と「whereVal2」の値は変数Aに格納されます。

注目すべきコード⑧

次に見て頂きたいのは30行目です。

    rem KEYS_TO_GETの値にあるスペース文字で区切られた値(キー)に対する値(キーの設定値)を出力する
    echo !%%A!

コードの説明

以上のコードは、KEYS_TO_GETの値にあるスペース文字で区切られた値(キー)に対する値(キーの設定値)を出力する処理のコードです。

なぜ変数Aの前後に「!」と付けているのかというと、変数Aの値が持つ環境変数の値を取得するためです。

例えば変数Aの値を取得したい場合は「echo %%A」ですが、変数Aの値が持つ環境変数の値を取得する場合は「echo !%%A!」とします。

今回の場合「echo !%%A!」を実行した場合に、「port」なら「3306」が、「whereVal2」なら「東京都」が出力されます。

  1. 「echo %%A」:「port」「whereVal2」を出力する
  2. 「echo !%%A!」:「3306」「東京都」を出力する

注目すべきコード⑨

次に見て頂きたいのは35行目です。

rem setlocalコマンドによって変更されたローカル環境変数の設定を元に戻す
endlocal

以上のコードは、setlocalコマンドによって変更されたローカル環境変数の設定を元に戻す処理のコードです。

4行目で遅延環境変数展開を有効にしたのを、このコードで元に戻しています。

注目すべきコード⑩

次に見て頂きたいのは38行目です。

rem 処理を中断する(変数確認用)
pause

コードの説明

以上のコードは、バッチファイルの処理を中断するコードです。

pauseコマンドは本題の目的とは関係ないコマンドですが、変数を確認するためにわざと追加しています。

あくまで変数確認用にバッチファイルの処理を中断させたいために追加しているコードであることをご理解ください。

pauseコマンドがないと画面が閉じてしまい値を確認することができないので、pauseコマンドをコードに追記しておくと値が確認ができて便利です。

今回pauseコマンドを使って確認したい変数の値は、「echo !%%A!」で出力される値の確認です。

実際にバッチファイルを実行した結果は以下のとおりです。

バッチファイルの処理がpauseコマンドまで実行されて処理が中断されています。(Enterキーを押すと中断が解除されます)

画面上には「3306」と「東京都」の値を確認することができます。

この値が、今回欲しかったiniファイルで設定されている「port」と「whereVal2」の設定値になります。

動作確認

iniファイルの例」をご覧ください。

最後に

この記事では、バッチファイルからiniファイルの設定値を取得する方法についてご説明しました。

バッチファイルからiniファイルの設定値を取得したい場合は、本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら