【问题标题】:How to iterate string in cmd for loop?如何在cmd for循环中迭代字符串?
【发布时间】:2012-06-22 09:25:34
【问题描述】:

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

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

我做错了什么?

【问题讨论】:

    标签: windows string for-loop batch-file cmd


    【解决方案1】:

    这是因为 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 循环中使用 换行技术,用换行替换你的 delim 字符。

    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 看到由换行符分割的五行而不是仅一行。

    【讨论】:

    • 这是最接近我想要的。唯一的缺点是我事先不知道令牌的数量 - 它是用户输入。我想可以通过选择一些等于最大令牌列表大小的值来修复它,例如"tokens=1-10"
    • @ks1322 你也可以使用换行技术
    【解决方案2】:

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

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

    【讨论】:

    • @Ed,我想迭代字符串,用空格分隔,所以我想引用是必要的
    • @Alvin,Joey - 你试过我的例子吗? (虽然你是对的,但 /D 是不必要的)
    • @ks1322 - 在批处理脚本中不需要引号 - 空格是默认分隔符(因此您必须引用包含空格的文件系统路径)
    【解决方案3】:

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

    你应该使用FOR

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多