批处理文件:如何只读取INI文件中的部分

时间:2014-11-16 01:30:15

标签: batch-file config ini

我是Batch Scripting的新手,我正在尝试根据调用批处理文件时传递的参数从INI文件编写一个简单的脚本来读取。

这是INI文件的示例:

[SETTING1]
Value1=Key1
Value2=Key2
Value3=Key3

[SETTING2]
Value1=Key1
Value2=Key2
Value3=Key3

[SETTING3]
Value1=Key1
Value2=Key2
Value3=Key3

当涉及到只读取被调用的部分时,我遇到了问题。它将从任何与“值”和“键”匹配的部分读取,我不知道如何限制它只读取带有设置的部分。

使用此参数调用文件:run.bat run.ini setting2。我的代码是我到目前为止的代码,我觉得好像我正式撞墙了。有人能帮忙吗?非常感谢任何帮助。

    @ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET INIFile="%~f1"

for /f "usebackq delims=" %%a in (!INIFile!) do (
        if %%a==[%2] (
        SET yesMatch=%%a
            for /f "tokens=1,2 delims==" %%a in (!yesMatch!) do (
                if %%a==Value1 set Key1=%%b
                if %%a==Value2 set Key2=%%b
                if %%a==Value3 set Key3=%%b
)
        ECHO !yesMatch!
        ECHO !Key1!
        ECHO !Key2!
        ECHO !Key3!
        pause
)
)

pause
exit /b

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET INIFile="%~f1"
SET "FLAG="

for /f "usebackq tokens=1,*eol=|delims==" %%a in (%INIFile%) do (
 IF "%%b"=="" (
  REM No "=" so section
  IF /i "%%a"=="[%2]" (SET flag=Y) ELSE (SET "flag=")
 ) ELSE IF defined flag (
  REM data line - only if FLAG is defined
  REM set values defined
  SET "%%a=%%b"
  REM pick particular values
  if /i "%%a"=="Value1" set "Key1=%%b"
  if /i "%%a"=="Value2" set "Key2=%%b"
  if /i "%%a"=="Value3" set "Key3=%%b"
 )

)
SET key
SET val

GOTO :EOF

这是获取价值的方法。

文件中的数据为[section]name=value,因此将delims设置为=会将部分分配给%%a命名为%%a,将命名为%%b

仅在遇到相应的部分后才设置(定义)标志,并在下一部分清除。只有它被定义才会进行分配。

简单set %%a=%%b的优点是它可以设置在该部分中定义的任何值 - 如果添加新值,则不需要对代码进行任何更改。您的原始版本具有选择特定值并仅设置这些值的优势。你付钱,你可以选择。

请注意,/i语句上的if开关会使比较不区分大小写。

Nota还使用set "value=string"来确保一行上的尾随空格不包含在分配的值中。


编辑:默认情况下,end of line字符为;,因此;会忽略任何以for/f开头的行。结果是;-commented-out部分的值将覆盖为上一部分设置的值。

eol设置为|可以解决问题。 eol设置为什么并不重要;它只是一个字符,可能不会出现在INI文件中的任何位置(否则该行会出现截断。)

如果有必要, 可以将eol设置为control-Z,但选择一个未使用的字符会更容易......

因此,单行更改 - eol选项中包含for /f参数。