6

我正在尝试在批处理脚本中迭代一个字符串:

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

我究竟做错了什么?

4

3 回答 3

16

这是因为 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 看到由换行符分割的五行而不是只有一行。

于 2012-06-22T10:00:21.837 回答
4

尝试FOR代替FOR /F. 此外,在设置时引用该值var是不必要的:

set var=1 2 3

for %%i in (%var%) do  (
echo %%i
)
于 2012-06-22T09:33:12.650 回答
2

因为FOR /F循环文本文件的每一行,并且当与字符串(带""引号)一起使用时,它只在该行上执行操作。它确实由空格分隔,但要与 option 一起使用tokens

你应该使用FOR

set var=1 2 3

for %%i in (%var) do (
  echo %%i
)

如果要循环数字,请使用以下命令:

for /L %%i in (1,1,3) do (
  echo %%i
)
于 2012-06-22T10:00:51.523 回答