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

Dss*_*ner 9 for-loop dos batch-file

我正在尝试遍历我传递给批处理文件的参数.根据参数,我想设置一个变量标志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
)
Run Code Online (Sandbox Code Playgroud)

它只有在我有一个参数时才有效,它告诉我它将整个参数列表作为单个参数.我试过"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
Run Code Online (Sandbox Code Playgroud)

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

小智 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
)
Run Code Online (Sandbox Code Playgroud)

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


And*_*y M 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
...
Run Code Online (Sandbox Code Playgroud)

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

检查的IF语句中的SHIFT /d确实有效.问题是整个行被立即评估,并且两个实例都%~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
...
Run Code Online (Sandbox Code Playgroud)

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

...
IF /I "%~1"=="/d" SHIFT & SET DISTRO=?
IF "%DISTRO%"=="?" SET "DISTRO=%~1"
...
Run Code Online (Sandbox Code Playgroud)