【问题标题】:Batch FOR loop with asterisk带星号的批处理 FOR 循环
【发布时间】:2012-11-28 16:26:40
【问题描述】:

我有这个单行 CMD 文件 TEST.CMD:

for %%f in (%1 %2 %3 %4 %5 %6 %7 %8) DO ECHO %%f

如果我运行这个:

TEST this is a test

它在单独的行上正确地回显每个参数,即,

this
is
a
test

但是,如果参数包含星号,则会跳过它。例如,

TEST this is a* test

结果:

this
is
test

如何将带星号的参数视为普通标记?

谢谢。

【问题讨论】:

    标签: for-loop batch-file


    【解决方案1】:

    适用于大多数参数的最简单方法是将参数传递到变量“数组”,然后使用 FOR /L 循环遍历数组。这最好通过延迟扩展来实现。

    此技术可以处理任意数量的参数 - 不限于 9 个。

    @echo off
    setlocal
    
    :: Transfer parameters to an "array"
    set arg.cnt=1
    :getArgs
    (set arg.%arg.cnt%=%1)
    if defined arg.%arg.cnt% (
      set /a arg.cnt+=1
      shift /1
      goto :getArgs
    )
    set /a arg.cnt-=1
    
    :: Process the "array"
    setlocal enableDelayedExpansion
    for /l %%N in (1 1 %arg.cnt%) do echo arg %%N = !arg.%%N!
    

    【讨论】:

      【解决方案2】:

      我在事先不知道参数的情况下找到的唯一方法是在for循环中回显参数

      for /f %%f in ('"echo %1 && echo %2 && echo %3 && etc"') DO ECHO %%f
      

      【讨论】:

        【解决方案3】:

        不能打印,星号是动态运算符,匹配某些命令中的“1个或多个字符”,例如FOR命令,唯一的方法是使用/F参数获取命令的输出。

        看看如果你使用这个会发生什么:

        @Echo OFF
        
        Pushd "C:\"
        
        Call :sub a b c * d e
        
        :sub
        for %%f in (%1 %2 %3 %4 %5 %6 %7 %8) DO ECHO %%f
        Pause&Exit
        

        (FOR 打印当前目录下的所有文件)

        那么你需要做...:

        @Echo OFF
        
        Call :sub a b c* d e
        
        :sub
        FOR /F "tokens=*" %%a in ('Echo %*') DO (ECHO %%a)
        Pause&Exit
        

        【讨论】:

        • 这会将所有参数打印在一行中,而不是按照要求打印在单独的行中
        猜你喜欢
        • 2013-06-08
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 2011-05-19
        相关资源
        最近更新 更多