我正在尝试编写一个批处理文件,该文件包含几个参数,后跟一个或多个可选文件名(可能包含通配符),并在某些时候处理每个可选文件名,但是for
命令一直试图扩展它们,所以即使只打印它们也行不通。
我检查了帮助(for /?
),但似乎没有任何开关来阻止这种情况。我尝试使用单引号,双引号和后引号以及/f
,但似乎没有任何效果。
以下命令可以正常运行:
> for %i in (foo bar baz) do @echo %i
foo
bar
baz
以下命令不会:
> for %i in (foo bar baz really?) do @echo %i
foo
bar
baz
以下,甚至更少:
> ren > reallyz
The syntax of the command is incorrect.
> dir /b really*
reallyz
> for %i in (foo bar baz really?) do @echo %i
foo
bar
baz
reallyz
有没有办法让Windows命令解释器将传递的列表视为字符串,而不是尝试将其解释为文件名通配符?
答案 0 :(得分:3)
否 - 简单的FOR命令将始终展开*
和?
通配符。
您需要使用GOTO循环来执行您想要的操作。 SHIFT命令可以访问所有参数。
@echo off
:argLoop
if "%~1" neq "" (
echo %1
shift /1
goto :argLoop
)
很可能你想用参数做更多的事情然后打印它们。通常,您会将它们存储在变量的“数组”中以供以后使用。
@echo off
setlocal
set argCnt=1
:argLoop
if "%~1" neq "" (
set "arg.%argCnt%=%~1"
set /a argCnt+=1
shift /1
goto :argLoop
)
set /a argCnt-=1
:: Show Args
setlocal enableDelayedExpansion
for /l %%N in (1 1 %argCnt%) do echo arg.%%N = !arg.%%N!