如何在批处理脚本中生成解析文本文件的唯一键值列表并排除外部变量
如何获取批处理脚本创建的唯一键值列表并遍历打印对应值
感谢@Magoo协助编写解析文本文件的脚本。
我有一个包含数组值和键值对的文本文件,内容如下:
; Define list of files files_arr=filename1.txt files_arr=filename2.dat files_arr=filename3.cfg ; Define list of folders folders_arr=c:\folder1 folders_arr=c:\folder2 folders_arr=c:\folder3 ; Define list of users users_arr=user name 1 users_arr=user name 2 users_arr=user name 3 users_arr=user name 4 ; Define list of sources sources_arr=source value 1 sources_arr=source value 2 sources_arr=source value 3 ; Define normal variables do_copy_file=yes delete_after_copy=no
以下批处理脚本可解析上述键值对,将数组值加载到数组变量、普通键值加载到普通变量中:
@ECHO Off SETLOCAL ENABLEDELAYEDEXPANSION rem 测试用的路径和文件名包含空格,确保脚本兼容带空格的名称,使用时请根据实际情况修改 SET "configfile=.\testconfigfile.txt" :: 清除所有以count_开头的变量 FOR /F "delims==" %%e In ('set count_ 2^>Nul') DO SET "%%e=" FOR /f "usebackq tokens=1* delims==" %%b IN ("%configfile%") DO ( IF "%%c" neq "" ( set keyname=%%b echo Key Name = !keyname! if "!keyname:~-4!"=="_arr" ( IF DEFINED count_%%b (SET /a count_%%b+=1) ELSE (SET /a count_%%b=0) SET "!keyname![!count_%%b!]=%%c" ) else ( SET "!keyname!=%%c" ) ) ) :: 显示计数变量 SET count :: 显示数组变量 SET |FIND "[" :: 显示普通变量 SET do_ SET delete_ GOTO :EOF
现在需要修改脚本,生成脚本创建的唯一键值列表,仅遍历并打印这些键对应的所有值,不显示脚本自身创建的临时变量(如count_开头的变量)。
解决方法
可以在解析配置文件的过程中,把所有创建的根键名(如files_arr、do_copy_file这类不含数组索引的键)记录到一个列表中,之后遍历这个列表输出对应的值:
修改后的脚本如下:
@ECHO Off SETLOCAL ENABLEDELAYEDEXPANSION SET "configfile=.\testconfigfile.txt" :: 清除旧的计数变量和键列表 FOR /F "delims==" %%e In ('set count_ 2^>Nul') DO SET "%%e=" SET "created_keys=" FOR /f "usebackq tokens=1* delims==" %%b IN ("%configfile%") DO ( IF "%%c" neq "" ( set "keyname=%%b" :: 将根键名加入创建列表(去重) IF "!created_keys:!keyname!=!"=="!created_keys!" ( SET "created_keys=!created_keys!!keyname!|" ) if "!keyname:~-4!"=="_arr" ( IF DEFINED count_%%b (SET /a count_%%b+=1) ELSE (SET /a count_%%b=0) SET "!keyname![!count_%%b!]=%%c" ) else ( SET "!keyname!=%%c" ) ) ) :: 遍历创建的所有根键,输出对应值 ECHO -------------------------- ECHO 脚本创建的键值对: ECHO -------------------------- FOR /f "delims=| tokens=*" %%k IN ("!created_keys!") DO ( FOR /f "delims=| tokens=1*" %%a IN ("%%k") DO ( SET "current_key=%%a" ECHO. ECHO === 键名:!current_key! === :: 判断是否是数组键 IF "!current_key:~-4!"=="_arr" ( :: 遍历数组所有索引 FOR /L %%i IN (0,1,!count_!current_key!!) DO ( IF DEFINED !current_key![%%i] ( ECHO 索引%%i:!current_key![%%i] = !!current_key![%%i]!! ) ) ) ELSE ( :: 普通变量直接输出 ECHO 值:!!current_key!! ) SET "current_key=" ) ) GOTO :EOF
脚本说明
- 记录根键名:解析每个键值对时,检查当前根键是否已在
created_keys列表中,未存在则添加(用|作为分隔符),实现去重。 - 遍历输出:
- 按分隔符
|拆分created_keys,逐个处理每个根键。 - 若为数组键(后缀为
_arr),则根据对应的count_变量遍历所有索引,输出每个索引的键值。 - 若为普通变量,直接输出键对应的值。
- 按分隔符
- 排除临时变量:仅遍历我们记录的
created_keys,不会输出脚本自身创建的count_开头的临时变量。
内容的提问来源于stack exchange,提问作者tarekahf
相关产品推荐
相关产品推荐

