循环通过类似开关的参数的批处理文件?

时间:2011-03-09 14:59:34

标签: batch-file for-loop dos

我正在尝试遍历我传递给批处理文件的参数。根据参数,我想设置一个变量标志true或false,以便稍后在脚本中使用

所以我的命令是“myscript.bat / u / p / s”

我的代码是:

FOR /f %%a IN ("%*") DO (
  IF /I "%%a"=="/u" SET UPDATE=Y
  IF /I "%%a"=="/p" SET PRIMARY=Y
  IF /I "%%a"=="/s" SET SECONDARY=Y
)

它只有在我有一个参数时才有效,它告诉我它将整个参数列表作为单个参数。我试过“delims =”但无济于事。有关获得每个间隔参数的任何想法吗?


如何为其中一个参数添加值?

myscript.bat / u / p / d TEST / s

:loop
IF "%~1"=="" GOTO cont
IF /I "%~1"=="/u" SET UPDATE=Y
IF /I "%~1"=="/p" SET PRIMARY=Y
IF /I "%~1"=="/s" SET SECONDARY=Y
IF /I "%~1"=="/d" SHIFT & SET DISTRO="%~1"
SHIFT & GOTO loop

:cont

但是与最后一个IF一致的SHIFT实际上并没有改变任何东西。 DISTRO最终成为“/ d”而不是“TEST”

2 个答案:

答案 0 :(得分:23)

你原来的作品并不太远,因为我不喜欢GOTO循环,我想我会发布这个:

FOR %%a IN (%*) DO (
  IF /I "%%a"=="/u" SET UPDATE=Y
  IF /I "%%a"=="/p" SET PRIMARY=Y
  IF /I "%%a"=="/s" SET SECONDARY=Y
)

它只使用一个参数的原因是过度使用引号。通过将%*放在引号中,您可以将整个命令行作为一个令牌。另外,FOR的/ F变体也不是你想要的。 FOR /中提供的文档?应该帮助清理。

答案 1 :(得分:5)

你可以使用SHIFT,GOTO和一个额外的IF来遍历参数,以检查是否没有更多参数需要解析:

:loop
IF "%~1"=="" GOTO cont
IF /I "%~1"=="/u" SET UPDATE=Y
IF /I "%~1"=="/p" SET PRIMARY=Y
IF /I "%~1"=="/s" SET SECONDARY=Y
SHIFT & GOTO loop

:cont
...

UPDATE (解决参数有自己参数的情况)

检查/d的IF语句中的SHIFT确实有效。问题是整个行被一次评估,%~1的两个实例都被替换为相同的值,此时为/d

因此,在这种情况下,基本上解决方案是使解释器与SET DISTRO="%~1"分开评估IF /I "%~1"=="/d"部分。可以有各种方法。例如,您只需将SHIFT & SET DISTRO="%~1"移至下一行,如果%~1 /d,则跳过该行:

...
IF /I NOT "%~1"=="/d" GOTO skip_d
SHIFT & SET "DISTRO=%~1"
:skip_d
...

另一种方法可能是将特殊值(例如?)分配给DISTRO并在遇到/d时进行转换。然后,在下一行,检查DISTRO是否具有该特殊值并将其设置为%~1

...
IF /I "%~1"=="/d" SHIFT & SET DISTRO=?
IF "%DISTRO%"=="?" SET "DISTRO=%~1"
...