【问题标题】:Batch File: How to read only sections in a INI file批处理文件:如何只读 INI 文件中的部分
【发布时间】:2015-01-13 04:35:49
【问题描述】:

我是批处理脚本的新手,我正在尝试编写一个简单的脚本,以根据调用批处理文件时传递的参数从 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

【问题讨论】:

    标签: batch-file config ini


    【解决方案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 的优点是它可以设置该部分中定义的任何值 - 如果添加新值,则无需更改代码。您的原始版本具有选择特定值并仅设置这些值的优点。你付钱,你做选择。

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

    还要注意set "value=string" 的使用,它确保行上的尾随空格不包含在分配的值中。


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

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

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

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

    【讨论】:

    • 完全符合我的需要! ..非常感谢!
    • 有什么特别的方法来调整这个,不评估注释掉的部分吗?我注意到,如果我向以分号开头的 INI 文件添加注释,它会使脚本不会评估引号下方的任何内容。
    猜你喜欢
    • 2015-09-13
    • 2013-01-08
    • 2014-08-06
    • 2011-09-28
    • 2011-02-21
    • 2021-11-28
    • 1970-01-01
    • 2013-09-23
    • 2012-12-12
    相关资源
    最近更新 更多