我有这个单行 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
如何将带星号的参数视为普通标记?
谢谢。
我有这个单行 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 /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 个或多个字符”,比如 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
在事先不知道参数的情况下,我发现的唯一方法是在for
循环中回显参数
for /f %%f in ('"echo %1 && echo %2 && echo %3 && etc"') DO ECHO %%f