如何在Batch文件中解析动态键值对字符串并设置变量?
在Batch文件中动态解析键值对字符串的方法
刚好之前碰过类似的需求,Batch里固定长度的:~start,length写法确实搞不定这种动态的键值对串,不过咱们可以靠字符串替换+循环的思路来实现,直接上可运行的代码:
@echo off setlocal enabledelayedexpansion :: 原始输入字符串 set "input_str=User_Name=root;Password=1234;Server=192.168.1.49;DriverID=MySQL;Database=dbTest" :: 循环处理每个键值对 :loop :: 检查是否还有分号分隔的内容 if not "!input_str!"=="" ( :: 截取第一个分号前的键值对,同时更新剩余字符串 set "pair=!input_str:;=" & set "input_str=!" :: 按等号分割键和值,完成变量赋值 for /f "tokens=1,2 delims==" %%a in ("!pair!") do ( :: 把原始键名转换成你需要的格式(比如统一小写) set "key=%%a" set "key=!key:User_Name=username!" set "key=!key:Password=password!" set "key=!key:Server=server!" set "key=!key:DriverID=driverid!" set "key=!key:Database=database!" :: 给目标变量赋值 set "!key!=%%b" ) :: 继续处理剩余的键值对 goto loop ) :: 验证解析结果 echo username=!username! echo password=!password! echo server=!server! echo driverid=!driverid! echo database=!database! endlocal
核心逻辑说明:
- 延迟扩展:必须开启
setlocal enabledelayedexpansion,这是Batch里循环中动态读取/修改变量的必备操作,不然循环内的变量值会一直是初始状态。 - 分割字符串:
!input_str:;=" & set "input_str=!"这个技巧能快速把第一个分号前的键值对剥离出来,同时把剩下的内容重新赋值给input_str,实现循环拆解。 - 键名映射:代码里把原始的
User_Name这类命名转换成了小写的username,如果不需要统一格式,直接用set "%%a=%%b"就能按原始键名赋值。 - 值提取:通过
for /f以=为分隔符,把每个键值对拆成键和值两部分,完成最终的变量赋值。
这个方案完全适配动态长度的输入字符串,不管每个键值对的长度怎么变,都能准确提取对应的值。
内容的提问来源于stack exchange,提问作者Nevermore
相关产品推荐
相关产品推荐

