我是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
答案 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
参数。