CMD批处理提取变量引号内内容失败问题排查
CMD批处理提取引号内内容的问题解决
问题原因
你写的set _n=!_n:"*=!不生效,是因为CMD的变量替换语法不支持用*作为通配符匹配引号后的所有内容——这里的"*会被当作字面字符串(引号加星号)去查找匹配,但你的变量里引号后面是空格和文本,根本不存在"*这个子串,所以替换操作等于没执行。
正确解决方法
方法1:利用FOR命令提取(推荐)
FOR命令默认会把双引号包裹的内容作为一个整体处理,刚好能直接提取引号内的文本,代码如下:
setlocal enabledelayedexpansion set "_n=Inspecting "Leisure Suit Larry" - setup data version 5.6.2" :: 用tokens=2指定提取第二个引号分隔的部分,delims="设置分隔符为引号 for /f tokens^=2^ delims^=^" %%a in ("!_n!") do set "_n=%%a" echo !_n!
这段代码在for循环里也能正常工作,只要确保变量用!_n!(延迟扩展)引用即可。
方法2:字符串位置截取
如果不想用FOR,也可以通过查找第二个引号的位置来截取内容:
setlocal enabledelayedexpansion set "_n=Inspecting "Leisure Suit Larry" - setup data version 5.6.2" :: 先移除第一个引号及之前的所有内容 set "_n=!_n:*"=! :: 循环查找第二个引号的位置 set "temp_str=!_n!" set "quote_pos=0" :find_quote if not "!temp_str!"=="" ( set "char=!temp_str:~0,1!" if "!char!"=="\""" set /a quote_pos+=1 if !quote_pos! equ 1 goto get_result set "temp_str=!temp_str:~1!" ) :get_result :: 截取到第二个引号前的内容 set "_n=!_n:~0,%temp_str:~-1%!" echo !_n!
关于含右括号文件名的影响
如果变量来自带右括号)的文件名,只要全程使用延迟扩展(用!变量名!而非%变量名%),或者在FOR命令里把变量用双引号包裹,就不会有语法问题——延迟扩展会把变量内容当作整体解析,不会把右括号识别为命令块的结束符。
比如变量是"Inspecting "Game(name).exe" - version 1.0",用方法1的代码依然能正确提取Game(name).exe。
内容的提问来源于stack exchange,提问作者Allen Gray
相关产品推荐
相关产品推荐

