批量FOR循环与星号

时间:2012-11-28 16:26:41

标签: for-loop batch-file

我有这个单行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

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

感谢。

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您无法打印,星号是一个动态运算符,在某些命令中匹配“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