如何在批处理文件的for循环中解析单行文本并将单个字符串存入数组?
问题根源
你对for /F命令的行为理解存在偏差:
for /F的迭代单位是行,不管单行内有多少个分隔后的元素,循环体默认仅执行1次,对应一整行内容tokens=*的作用是将整行去除前导分隔符后完整赋值给首个循环变量,所以你最终只拿到了完整的foo bar baz字符串- 指定
tokens=1,2,3时,三个分割后的结果会依次赋值给%%i、%%j、%%k三个连续的循环变量,不会循环三次给%%i重复赋值,这也是你之前只拿到第一个单词的原因
正确实现方案
方案1:普通for循环(最简便,适合无通配符的场景)
不带/F参数的普通for循环默认以空格、逗号、分号等标准分隔符拆分字符串,逐个遍历每个元素,正好匹配你的需求:
@echo off setlocal enabledelayedexpansion set string=foo bar baz set /a index=0 for %%i in (%string%) do ( set words[!index!]=%%i set /a index+=1 ) set words[
运行后直接输出你期望的结果:
words[0]=foo words[1]=bar words[2]=baz
方案2:for /F 实现(兼容含通配符的场景)
如果你的字符串中包含*、?这类通配符,普通for会把它识别为文件匹配符导致异常,可以用换行替换空格后用for /F逐行遍历:
@echo off setlocal enabledelayedexpansion set string=foo bar baz set /a index=0 :: 注意!string: =^ 后面必须跟两个连续的空行,是批处理换行转义的固定写法 for /F "delims=" %%i in ("!string: =^ !") do ( set words[!index!]=%%i set /a index+=1 ) set words[
内容的提问来源于stack exchange,提问作者isimmons
相关产品推荐
相关产品推荐

