Windows 環境でバッチファイルからiniファイルを読込んで値を取得する
対応方法 バッチファイルから ini ファイルを読込む場合 VBS を使用することで実現する
具体的には、バッチファイルから VBS を呼び出して ini ファイルより値を取得して VBS から戻り値を受け取り、実現する
取得する ini ファイルの中身 <設定値>*****************************************************'<コメント>####################################### [Path] WorkPath=C:/src/wk 'Work Folder Path 実際のコード @echo off set iniFileName=sample.ini for /f "usebackq tokens=* delims=" %%A in (`call cscript //Nologo getProfileString.vbs "%iniFileName%" Path WorkPath`) do set ret=%%A echo "%ret%" pause exit Option Explicit rem /***************************************************************** rem * getProfileString.vbs iniFileName, sectionName, entryName rem * rem * 引数 rem * iniFileName : 設定ファイル名(フルパス) rem * sectionName : セクション名 rem * entryName : エントリー名 rem * 動作 rem * 引数に指定された設定ファイルより指定した rem * 「セクション」,「エントリー」に対応する設定値を返す rem * 先頭がカンマの場合はコメント行として扱う rem * 行の途中でカンマがある場合は直前までの文字列(右空白除去)を rem * 設定値として扱う rem * 戻り値 rem * 設定値(見つからなかった場合およびエラーの場合は空を返す) rem *****************************************************************/ Dim ret Dim fs Dim readLineObj Dim searchFlg Dim buffer rem ファイルシステムアクセス用 Set fs = CreateObject( "Scripting.FileSystemObject" ) ret = "" rem ファイルを開く on error resume next Set readLineObj = fs.OpenTextFile( Wscript.Arguments(0), 1 ) if Err.Number <> 0 then rem ファイルアクセスエラーの場合は終了 Wscript.Echo ret Wscript.Quit end if on error goto 0 rem 検索処理用のフラグ searchFlg = false rem 読込みループ Do While not readLineObj.AtEndOfStream rem 行単位の読込み buffer = readLineObj.ReadLine rem 空の行以外の場合 if Trim(buffer) <> "" then rem 対象セクションの場合 if Ucase(Trim(buffer)) = "[" & Ucase( Wscript.Arguments(1) ) & "]" then searchFlg = true else rem 設定値を取得 ret = GetProfileString(buffer, Wscript.Arguments(2), searchFlg) rem エントリー名が見つからなかった場合 if searchFlg And IsEmpty(ret) then ret = "" end if rem 設定値を取得できた場合はループを抜ける if searchFlg And (Len(ret) <> 0) then Exit Do end if end if Loop readLineObj.Close Wscript.Echo ret Wscript.Quit rem /***************************************************************** rem * 引数に指定された設定ファイルより指定した rem * 「セクション」,「エントリー」に対応する設定値を返す rem * 先頭がカンマの場合はコメント行として扱う rem * 行の途中でカンマがある場合は直前までの文字列(右空白除去)を rem * 設定値として扱う rem * rem * 引数 rem * buffer : 設定ファイルより読込んだ行 rem * sectionName : セクション名 rem * searchFlg : 検索用フラグ rem * 戻り値 rem * 設定値(見つからなかった場合およびエラーの場合は空を返す) rem *****************************************************************/ Function GetProfileString ( buffer, sectionName, searchFlg ) Dim ret Dim entries Dim entry ret = "" if searchFlg then rem 次のセクションの場合 if Left(Trim(buffer) ,1) = "[" then rem ループを抜ける GetProfileString = Empty Exit Function end if entries = Split(buffer, "'") entry = Split(entries(0), "=") rem エントリーの場合 if (Ubound(entry) = 1) then rem 検索対象のエントリーの場合 if Ucase(Trim(entry(0))) = Ucase(sectionName) then ret = RTrim(entry(1)) End if end if end if GetProfileString = ret End Function