如何迭代cmd中的string循环?

我想在批处理脚本中迭代一个string

set var="1 2 3" for /F %%i in (%var%) do ( echo %%i ) 

并得到这个输出:

 C:\>batch.bat C:\>set var="1 2 3" C:\>for /F %i in ("1 2 3") do (echo %i ) C:\>(echo 1 ) 1 

我期望所有3个号码将被打印:

 1 2 3 

我究竟做错了什么?

这是因为FOR / F将每行分成多个标记,但是您需要定义要处理的标记的数量。

 set var="1 2 3" for /F "tokens=1-3" %%i in (%var%) do ( echo %%i echo %%j echo %%k ) 

编辑:其他解决方案

就像Ed harper的回答一样:
你也可以使用一个正常的FOR循环,限制它也会尝试扫描磁盘上的文件,并且它有*?

 set var=1 2 3 for %%i in (%var%) do ( echo %%i ) 

或者使用FOR / F循环的换行技术 ,用换行符替换您的定界字符。

 setlocal EnableDelayedExpansion set LF=^ set "var=1 2 3 4 5" set "var=%var: =!LF!%" for /F %%i in ("!var!") do ( echo %%i ) 

这是因为FOR / F看到五行被一个换行而不是只有一行。

FOR代替FOR /F 而且,在设置var时引用值是不必要的:

 set var=1 2 3 for %%i in (%var%) do ( echo %%i ) 

因为FOR /F循环了文本文件的每一行,并且与字符串( "" quoted)一起使用时,它只能在该行上执行操作。 它确实用空格分隔,但这是与选项tokens一起使用的。

你应该使用FOR

 set var=1 2 3 for %%i in (%var) do ( echo %%i ) 

如果你想循环数字,使用以下内容:

 for /L %%i in (1,1,3) do ( echo %%i )