批处理中如何提取指定变量间的目标子字符串?
Windows批处理:从变量中提取指定子串(基于前后标记)
嘿,我来帮你搞定这个Windows批处理的字符串提取需求!不用任何文件操作,纯靠变量处理就能实现你要的效果。先看完整的实现代码:
@echo off setlocal enabledelayedexpansion :: 你的原始变量(先去掉引号避免干扰) set "CMS_SQL=cms91_to_913.json cms913_to_9132.json cms9132_to_9133.json cms9133_to_10100.json" set "CMS_FROM_VERSION=cms913_" set "CMS_TO_VERSION=to_9133.json" :: 第一步:剔除CMS_FROM_VERSION之前的所有内容 set "temp_str=!CMS_SQL:*%CMS_FROM_VERSION%=!" :: 第二步:剔除CMS_TO_VERSION之后的所有内容,保留中间部分 set "result=!temp_str:%CMS_TO_VERSION%=&rem !" call set "result=%%result%%" :: 输出结果 echo 提取到的目标子串:!result! endlocal
代码原理拆解:
- 开启延迟变量扩展:
setlocal enabledelayedexpansion是关键,它允许我们在同一代码块里多次修改和读取变量值,避免批处理的变量替换时机问题。 - 截断前缀:
!CMS_SQL:*%CMS_FROM_VERSION%=!是批处理的字符串替换语法,*表示匹配任意字符直到CMS_FROM_VERSION出现的位置,然后把这部分替换为空,这样就得到了从cms913_开始的剩余字符串。 - 截断后缀:
!temp_str:%CMS_TO_VERSION%=&rem !把to_9133.json替换成&rem,rem是批处理的注释命令,会忽略后面的所有内容。接着用call set "result=%%result%%"让批处理重新解析这个字符串,自动去掉注释部分,最终就得到了你要的cms913_to_9132.json cms9132_to_9133.json。
如果你的原始变量是带引号定义的(比如set CMS_SQL="..."),只需要在开头加一行去掉引号的处理:
set "CMS_SQL=!CMS_SQL:"=!" set "CMS_FROM_VERSION=!CMS_FROM_VERSION:"=!" set "CMS_TO_VERSION=!CMS_TO_VERSION:"=!"
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

