iniファイルを読み込むbatファイルの作り方。今の時代でも充分役に立つゾ!(タブンね・・・)

 

元気ですかーーーーーっ!!!!

バッチファイル使ってますかーーー!!!

イニファイルがあれば何でもデキる!

 

1 ・ 2 ・ 3 ・ ダーーーーーッ!

 

 

BATでINIを読む方法

さて、、、、、

今回は バッチファイル です。

しかも、iniファイル もあります!!

 

 


えっ!????

バッチ?

ばっち?

BAT?

bat?

 

2016年ですよ。
バッチファイルもINIファイルも今更要らんでしょ。

って言うか・・・

バッチファイルなんてなんじゃそれ?
iniファイルなんて見たことねーぞ

・・・・とおっしゃる平成世代の方もいらっしゃるでしょう。

 

まぁ、今回はさして説明するような内容はありませんので本文をご覧ください。




まずは出典元 これ大切

今回のbatファイルは私が作ったものではありません。

batファイルからINIファイルを読み込む処理を作りたかったのですが、作り方が分からず調べていたら下記のサイトに辿り着きました。

※出典元はここ↓

メッチャ助かりました!!
ありがとうございます!!

 

ただ、上記ブログでは細かい説明がありませんので、解説を入れてここで説明させて頂きます。

しかし、私はbatファイルの作り方はあまり詳しくありません。
解説と言いながら、調べながら書きましたので間違いがあるかもしれません。(いや、あるでしょう、あるはずだ! 頼むあってくれ!!)
間違いがありましたら、是非ご指摘ください

あと、私好みにちょっと改造してます。
その改造も本当に正しいのかどうか分かりませんが、まぁ動いているので今のところは良しとしています。

・・・って言うか間違っているのか正しいのかも、batの事はよく分からないので

今回のサンプル

使うファイルはこれだけ。

  • kick.bat
  • GetIni.bat
  • fuga.ini

概要としてはこんな感じです。

batini

kick.bat はその名の通りキックするためのものです。
何をキックするかと言いますと、GetIni.bat です。
kick.batGetIni.bat をキック(起動)するとともに、指定の値を幾つか渡します。
※指定の値を幾つか渡しますが、この時渡す値を『引数(ひきすう)』と呼びます。

GetIni.bat がINIファイルからデータを取ってきます。
取ってきた値を kick.bat へ返します。

INIファイル

iniファイルはこんな形です。

イマドキiniファイルなんてお目にかからないですよね。
iniファイルって結構使い勝手が良くて私は好きなんですけどね。

[NAME]
F_NAME=YAMADA
S_NAME=TARO

[OTHER]
AGE=15
SPORTS=Football

呼び出し用バッチ

引数付きで GetIni.bat をコールします。

GetIni.bat:READ_INI_VAL の部分を呼び出しています。
:READ_INI_VAL は消してもいいです。
:READ_INI_VAL はラベルと言います。

ラベルを呼ぶことができるんだろうか?
とお試しで入れただけです(笑)
今回の場合は特に意味ないです。

でも、一つ勉強になりました。
call は直接ラベルを指定することができるんだ!

あとはINIファイルのSECTION名の “NAME”、KEY名の “F_NAME” とか。

INIファイルから取得したデータを入れるための GET_VAL1 変数とか。

事前にINIファイルのフルパスを入れた %INI_FILE_FULLPATH% とか。

@echo off

set INI_FILE_FULLPATH=fuga.ini


call GetIni.bat  :READ_INI_VAL  "NAME"   "F_NAME"  GET_VAL1  %INI_FILE_FULLPATH%
echo %GET_VAL1%

call GetIni.bat  :READ_INI_VAL  "NAME"   "S_NAME"  GET_VAL2  %INI_FILE_FULLPATH%
echo %GET_VAL2%

call GetIni.bat  :READ_INI_VAL  "OTHER"  "AGE"     GET_VAL3  %INI_FILE_FULLPATH%
echo %GET_VAL3%

call GetIni.bat  :READ_INI_VAL  "OTHER"  "SPORTS"  GET_VAL4  %INI_FILE_FULLPATH%
echo %GET_VAL4%

pause

 

INIファイルからデータを取得するBATプログラム

batプログラムとiniファイルを頻繁に使う人なら、この GetIni.bat を手元に置いておけば、いつでもどこでも誰とでもiniファイルをReadできますよ♪

常にiniファイルをReadしたいんだよ!!!
batプログラムとiniファイルが好きなんだ---!!!

という方は、是非お手元に置いてやってください。

 

コメント(REMの行)と説明を沢山入れてあるのでそれを読んでもらえば大体分かると思います。
遅延環境変数とか環境変数の展開タイミングはまだよく分かっていないので、疑問に思う方は各自で調べてください。
私も引き続き学習します。

@echo off

REM 遅延環境変数を使うためにこれを書いておく
REM 遅延環境変数(%HOGEHOGE%ではなく!HOGEHOGE!と書く)についてはググってね
setlocal enabledelayedexpansion


:READ_INI_VAL

REM ====================================================================
REM INIファイルから項目を読み取り返す
REM
REM   ※キーを取得できない場合は、取得変数に「ERR」を返す
REM
REM ====================================================================
REM 
REM 他のbatから以下のようなコーリングシーケンスでコールされる事を期待している
REM call GetIni.bat  :READ_INI_VAL  "SECTION名"  "KEY名"  GET_VAL  %INI_FILE_FULLPATH%
REM 
REM 引数の説明
REM   %0        : (in ) このファイルの名前         (例:「GetIni.bat」)
REM   %1        : (in ) このサブルーチン名         (例:「:READ_INI_VAL」)
REM   %2 or %~2 : (in ) セクション名               (例:「SECTION名」)
REM   %3 or %~3 : (in ) キー名                     (例:「KEY名」)
REM   %4        : (out) 取得データをセットする変数 (例:「GET_VAL」)
REM   %5        : (in ) iniファイルのフルパス      (例:「c:\hoge\foo\fuga.ini」)
REM 
REM ※指定したSECTION名やKEY名が取得できない場合は取得データをセットする変数に「ERR」をセットする
REM 
REM ====================================================================
REM 
REM for命令についての補足
REM /F の時に使用できるオプション
REM 
REM eol=c       : 行末コメント開始文字をcにする。この文字以降は注釈として無視される
REM skip=n      : ファイルの先頭からn行を無視する
REM delims=xxx  : デリミタをxxxとする。複数文字の指定が可能。デフォルトはタブとスペース
REM tokens=x,y  : どのパートを変数に代入してコマンド側に渡すかを指定する。
REM usebackq    : バッククォート(“`”、逆引用符)で囲まれた文字列をコマンドとして実行する
REM 
REM http://www.atmarkit.co.jp/ait/articles/0106/23/news004_2.html
REM 
REM ====================================================================

REM ------------------------------------------------
REM ファイルを1行ずつ読み出して、検索
REM ------------------------------------------------
set GETINIVALUE=
set SECTIONNAME=

REM 「%%x」変数にキー名が、「%%y(←自動で作られる)」変数にキーの値が入る事を期待している
REM 
REM 「delims==」は、「delims = (イコール記号)」と読めば良い。要は「=」を区切り文字としている
REM INIファイルのキーは「KEYNAME=5」みたいな形になっているので、KEYNAMEを%%xへ、5を%%yへセットすることを意味している
REM 
REM 「tokens=1,2」はdelimsで区切った1個目を%%xへ、2個目を%%yへという意味
REM 
REM %5はINIファイルのフルパスで、このfor文はINIファイルから一行ずつ取得している
for /F "eol=; delims== tokens=1,2" %%x in (%5) do (

   REM ------------------------------------------------------
   REM 文字の抽出について
   REM 
   REM %V%	変数Vの値全体
   REM %V:~m%	m文字目から、最後まで
   REM %V:~m,n%	m文字目から、n文字分
   REM %V:~m,-n%	m文字目から、最後のn文字分を除いたもの
   REM %V:~-m%	後ろからm文字目から、最後まで
   REM %V:~-m,n%	後ろからm文字目から、n文字分
   REM %V:~-m,-n%	後ろからm文字目から、最後のn文字分を除いたもの
   REM %V:c1=c2%	文字c1を文字c2に置換する。それぞれ複数の文字を指定することも可能
   REM 
   REM https://www.upken.jp/kb/kZwpzAqblKfZDjtMXuWuwioeExKNdE.html
   REM ------------------------------------------------------

   REM 取得した行がキーの行であれば、キー名が入るはず
   set KEYNAME=%%x

   REM !KEYNAME:~0,1!   : 先頭一文字を取得→取得した行がセクションの行であれば、[
   REM !KEYNAME:~-1,1!  : 最終一文字を取得→取得した行がセクションの行であれば、]
   set P=!KEYNAME:~0,1!!KEYNAME:~-1,1!

   REM []の中の文字を取得(セクション名を期待している)
   set S=!KEYNAME:~1,-1!

   REM "[]"はセクション名を意味する
   if "!P!"=="[]" set SECTIONNAME=!S!

   REM セクション名とキー名が引数で指定されたものと一致すればOK!
   REM で、処理終了
   if "!SECTIONNAME!"=="%~2" if "!KEYNAME!"=="%~3" (
      set GETINIVALUE=%%y
      goto GET_INI_EXIT
   )
)
REM ------------------------------------------------
REM 項目が見つからない場合は、「ERR」を変数へ入力
REM ERRではなく何もセットしたくなければ、
REM 「set GETINIVALUE=」と書けば良い
REM ------------------------------------------------
set GETINIVALUE=ERR



REM setlocal~endlocal間(以下、local内)は通常のプログラム言語で言うところの関数のようなもの
REM local内を出る時にはlocal内の環境変数は消えてしまう
REM 「GETINIVALUE=%GETINIVALUE%」は、local内の%GETINIVALUE%を、
REM 新しいGETINIVALUEへセットしていると考えれば良い
REM 
REM :GET_INI_EXITラベルの下にendlocalを書くのは気持ち悪いが、実行タイミング的にここしか無い

:GET_INI_EXIT
endlocal && set GETINIVALUE=%GETINIVALUE%

REM ------------------------------------------------
REM 取得変数名にセット
REM コール側でこの値が取れる
REM ------------------------------------------------

set %4=%GETINIVALUE%


:EOF
REM /b オプションを外すとこのbatをコールしているbatまで死ぬ
exit /b




まとめ

batプログラムでiniファイルなんて、マニアックと言うか、、、

 

ヤナギブソン
誰が興味あんねん!!!

 

ですよねぇ~・・・(笑)

 

そういやプラン9って今3人なんだよな。

参考書籍

参考動画

 

1 個のコメント

  • こんばんちわ、検索から飛んできました。

    for文の部分は

    for /F “usebackq eol=; delims== tokens=1,2” %%x in (`type “%~5″`) do (

    のように変えると “%~5” 部分に半角スペースが入っていても正常に処理できますよ。
    (というかコピペしてうまく処理できず、どうも半角スペースが問題だったので、for /F のusebackq(バッククォートを引用符に使う)オプションを指定したら直りました。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    ABOUTこの記事をかいた人

    Windows/Mac/Linuxを使う現役システムエンジニア&プログラマ。オープン系・組み込み系・制御系・Webシステム系と幅広い案件に携わる。C言語やC#やJava等数多くのコンパイラ言語を経験したが、少し飽きてきたので、最近はRubyやPython、WordPressなどのWeb系を修得中。初心者向けのプログラミング教室も運営中。オンライン・対面・出張等でプログラミングをレッスンします。