如何编写Batch脚本解析文本文件生成指定数组与键值对
批量脚本解析含数组项与普通键值对的文本文件
之前我们用这个脚本解析单键值对的keys.txt:
@echo off setlocal for /f "usebackq tokens=1* delims==" %%I in ("keys.txt") do ( set "%%~I=%%~J" ) set key
但现在需要处理包含重复键数组项(files、folders、sources)和普通键值对的文本文件,示例内容如下:
;files array files=filename1 files=filename2 ... files=filename_n ;folders array folders=foldername1 folders=foldername2 ... folders=foldername_n ;sources array sources=value1 sources=value2 ... sources=value_n ;other key value pairs do_copy=yes messagePromot=Are you sure?
要求把重复键转换成带索引的数组变量(比如files[0]=filename1),同时保留普通键值对,对应的批量脚本如下:
@echo off setlocal enabledelayedexpansion :: 初始化数组计数器,对应三个指定数组键 set "files_count=0" set "folders_count=0" set "sources_count=0" :: 遍历配置文件,跳过空行和以;开头的注释行 for /f "usebackq tokens=1* delims== eol=;" %%I in ("config.txt") do ( :: 判断当前键是否为数组键,生成带索引的数组变量 if "%%I"=="files" ( set "files[!files_count!]=%%~J" set /a files_count+=1 ) else if "%%I"=="folders" ( set "folders[!folders_count!]=%%~J" set /a folders_count+=1 ) else if "%%I"=="sources" ( set "sources[!sources_count!]=%%~J" set /a sources_count+=1 ) else ( :: 普通键值对直接设置变量 set "%%~I=%%~J" ) ) :: 输出所有变量验证结果 echo --- 数组变量 --- set files[ set folders[ set sources[ echo --- 普通变量 --- set do_copy set messagePromot endlocal
关键说明:
- 启用
enabledelayedexpansion:循环中动态更新计数器和数组变量时,延迟扩展能让变量在执行阶段实时取值,避免语法错误。 - 过滤无效行:
eol=;会自动跳过以;开头的注释行,确保只处理有效键值对。 - 数组索引管理:每个数组键对应独立计数器,每次匹配到相同键时,用当前计数器值作为索引赋值,随后计数器自增,实现有序数组。
- 普通键兼容:非指定数组的键值对直接沿用原有逻辑设置变量,不影响原有功能。
内容的提问来源于stack exchange,提问作者tarekahf
相关产品推荐
相关产品推荐

