阻止Windows命令解释器(FOR)将列表视为通配符?

时间:2013-02-04 18:30:04

标签: for-loop batch-file wildcard command-prompt wildcard-expansion

我正在尝试编写一个批处理文件,该文件包含几个参数,后跟一个或多个可选文件名(可能包含通配符),并在某些时候处理每个可选文件名,但是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命令解释器将传递的列表视为字符串,而不是尝试将其解释为文件名通配符?

1 个答案:

答案 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!