0

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

4

1 回答 1

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!
于 2013-02-04T21:55:33.633 回答