元気ですかーーーーーっ!!!!
バッチファイル使ってますかーーー!!!
イニファイルがあれば何でもデキる!
1 ・ 2 ・ 3 ・ ダーーーーーッ!
BATでINIを読む方法
さて、、、、、
今回は バッチファイル です。
しかも、iniファイル もあります!!
えっ!????
バッチ?
ばっち?
BAT?
bat?
2016年ですよ。
バッチファイルもINIファイルも今更要らんでしょ。
って言うか・・・
バッチファイルなんてなんじゃそれ?
iniファイルなんて見たことねーぞ
・・・・とおっしゃる平成世代の方もいらっしゃるでしょう。
まぁ、今回はさして説明するような内容はありませんので本文をご覧ください。
まずは出典元 これ大切
今回のbatファイルは私が作ったものではありません。
batファイルからINIファイルを読み込む処理を作りたかったのですが、作り方が分からず調べていたら下記のサイトに辿り着きました。
※出典元はここ↓
ありがとうございます!!
ただ、上記ブログでは細かい説明がありませんので、解説を入れてここで説明させて頂きます。
しかし、私はbatファイルの作り方はあまり詳しくありません。
解説と言いながら、調べながら書きましたので間違いがあるかもしれません。(いや、あるでしょう、あるはずだ! 頼むあってくれ!!)
間違いがありましたら、是非ご指摘ください。
あと、私好みにちょっと改造してます。
その改造も本当に正しいのかどうか分かりませんが、まぁ動いているので今のところは良しとしています。
今回のサンプル
使うファイルはこれだけ。
- kick.bat
- GetIni.bat
- fuga.ini
概要としてはこんな感じです。
kick.bat はその名の通りキックするためのものです。
何をキックするかと言いますと、GetIni.bat です。
kick.bat が GetIni.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人なんだよな。
参考書籍
参考動画

こんばんちわ、検索から飛んできました。
for文の部分は
for /F “usebackq eol=; delims== tokens=1,2” %%x in (`type “%~5″`) do (
のように変えると “%~5” 部分に半角スペースが入っていても正常に処理できますよ。
(というかコピペしてうまく処理できず、どうも半角スペースが問題だったので、for /F のusebackq(バッククォートを引用符に使う)オプションを指定したら直りました。