Batch File

Windows 環境でバッチファイルからiniファイルを読込んで値を取得する

  • POST
対応方法 バッチファイルから 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

Windows 環境でバッチファイルからメッセージボックスを表示して押下されたボタンによって処理を切り替える

  • POST
対応方法 バッチファイルからメッセージボックスを表示する場合バッチファイル単体では実現不可のため VBS を使用して実現する ※具体的には、バッチファイルから VBS を呼び出してメッセージボックスを表示し、 VBS から戻り値を受け取り、処理を切り替える 実際のコード @echo off rem メッセージボックスの表示 set msg="メッセージボックスのテスト [\n] で改行します" set title="メッセージボックステスト" for /f "usebackq tokens=* delims=" %%A in (`call cscript //Nologo msgbox.vbs %msg% "%title%"`) do set ret=%%A echo %ret% pause exit Option Explicit rem /******************************************************* rem * msgbox.vbs msg [,title] rem * rem * 引数 rem * msg :表示するメッセージ rem * title :メッセージボックスのタイトル rem * 動作 rem * メッセージボックスを表示し、クリックされたボタンに rem * 対応する数値を返す rem * msg中の 「\n」という文字列は改行に変換する rem * 戻り値 rem * 0:[はい]/1:[いいえ] rem ********************************************************/ Dim args Dim arg(99) Dim value Dim cnt Dim retBtn Dim ret Dim eLevel rem 引数を変数にセット Set args = WScript.Arguments cnt = 0 For Each value In args arg(cnt) = value cnt = cnt + 1 Next rem 改行文字の置換 arg(0) = RepExAll (arg(0), "\\n", VbCrLf) eLevel = 0 retBtn = MsgBox (arg(0), 36, arg(1)) Select Case retBtn Case 6: ret = 0 Case 7: ret = 1 End Select WScript.Echo ret WScript.Quit (eLevel) rem /******************************************************* rem * 文字列を正規表現文字列で検索して、一致する文字列を rem * すべて置換文字列に置換して返す rem * rem * 引数 rem * str1 :置換対象文字列 rem * reg :正規表現文字列 rem * str2 :置換文字列 rem * 戻り値 rem * 置換後の文字列 rem ********************************************************/ Function RepExAll ( str1, reg, str2 ) Dim regExpression Dim Matchers Set regExpression = New RegExp regExpression.Pattern = reg regExpression.IgnoreCase = True regExpression.Global = True RepExAll = regExpression.Replace(str1, str2) End Function