如何使用批处理文件遍历 .ini 文件中的项目?
How to iterate through items in an .ini file with a batch file?
我目前正在尝试遍历 .ini
文件中的每个项目,并在稍后使用这些值。但我无法弄清楚如何。我的 config.ini
文件如下所示:
[items]
item_1=XXXXX
item_2=XXXXX
item_3=XXXXX
item_4=XXXXX
[SomeSection]
......
我找到了一种方法来迭代和回显 config.ini
文件中的每个项目,如下所示:
@echo off
for /F %%i in (config.ini) do (
echo %%i
)
我的问题是我想使用特定值。所以我必须检查 config.ini
文件中的类别和键。我尝试使用它,但我 运行 出错了:
@echo off
for /F %%i in (config.ini) do (
SET item = %%i
if %item%==[items] (
rem do something here with the key and values now
)
)
正如我已经提到的,我无法将值保存到另一个变量,这导致我无法使用它们的问题。
一个比较简单的方法就是预先确定目标section header的行号,然后在读取配置文件时跳过很多行,一出现括号内的字符串就停止:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_CONFIG=%~dp0config.ini" & rem // (path to configuration file)
set "_SECT=items" & rem // (section name without brackets)
rem // Clean up variables whose names begin with `$`:
for /F "delims==" %%V in ('2^> nul set "$"') do set "%%V="
rem // Gather number of line containing the given section (ignoring case):
for /F "delims=:" %%N in ('findstr /N /I /X /C:"[%_SECT%]" "%_CONFIG%"') do set "SKIP=%%N"
rem // Read configuration file, skipping everything up to the section header:
for /F "usebackq skip=%SKIP% delims=" %%I in ("%_CONFIG%") do (
rem // Leave loop as soon as another section header is reached:
for /F "tokens=1* delims=[]" %%K in ("%%I") do if "[%%K]%%L"=="%%I" goto :NEXT
rem // Do something with the key/value pair, like echoing it:
echo(%%I
rem // Assign a variable named of `$` + key and assign the value:
set "$%%I"
)
:NEXT
rem // Return assigned variables:
set "$"
endlocal
exit /B
此脚本将根据您的示例配置文件分配以下变量:
$item_1=XXXXX
$item_2=XXXXX
$item_3=XXXXX
$item_4=XXXXX
我目前正在尝试遍历 .ini
文件中的每个项目,并在稍后使用这些值。但我无法弄清楚如何。我的 config.ini
文件如下所示:
[items]
item_1=XXXXX
item_2=XXXXX
item_3=XXXXX
item_4=XXXXX
[SomeSection]
......
我找到了一种方法来迭代和回显 config.ini
文件中的每个项目,如下所示:
@echo off
for /F %%i in (config.ini) do (
echo %%i
)
我的问题是我想使用特定值。所以我必须检查 config.ini
文件中的类别和键。我尝试使用它,但我 运行 出错了:
@echo off
for /F %%i in (config.ini) do (
SET item = %%i
if %item%==[items] (
rem do something here with the key and values now
)
)
正如我已经提到的,我无法将值保存到另一个变量,这导致我无法使用它们的问题。
一个比较简单的方法就是预先确定目标section header的行号,然后在读取配置文件时跳过很多行,一出现括号内的字符串就停止:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_CONFIG=%~dp0config.ini" & rem // (path to configuration file)
set "_SECT=items" & rem // (section name without brackets)
rem // Clean up variables whose names begin with `$`:
for /F "delims==" %%V in ('2^> nul set "$"') do set "%%V="
rem // Gather number of line containing the given section (ignoring case):
for /F "delims=:" %%N in ('findstr /N /I /X /C:"[%_SECT%]" "%_CONFIG%"') do set "SKIP=%%N"
rem // Read configuration file, skipping everything up to the section header:
for /F "usebackq skip=%SKIP% delims=" %%I in ("%_CONFIG%") do (
rem // Leave loop as soon as another section header is reached:
for /F "tokens=1* delims=[]" %%K in ("%%I") do if "[%%K]%%L"=="%%I" goto :NEXT
rem // Do something with the key/value pair, like echoing it:
echo(%%I
rem // Assign a variable named of `$` + key and assign the value:
set "$%%I"
)
:NEXT
rem // Return assigned variables:
set "$"
endlocal
exit /B
此脚本将根据您的示例配置文件分配以下变量:
$item_1=XXXXX $item_2=XXXXX $item_3=XXXXX $item_4=XXXXX