Batch file 通过类似开关的参数循环的批处理文件?
我正在尝试循环传递给批处理文件的参数。根据这个参数,我想设置一个变量标志true或false,以便以后在脚本中使用 所以我的命令是“myscript.bat/u/p/s” 我的代码是:Batch file 通过类似开关的参数循环的批处理文件?,batch-file,for-loop,dos,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 ) 只有当我有一个参数时,它才起作用,这告诉我它是作为
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测试/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连成一行的移位实际上并没有移位。发行版最终是“/d”而不是“TEST”您可以使用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
...
更新(解决参数本身有参数的情况) IF语句中检查
/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
...
另一种方法是将一个特殊值(例如a?
)分配给发行版
,并在遇到/d
时移位。然后,在下一行,检查发行版是否有该特殊值,并将其设置为%~1
:
...
IF /I "%~1"=="/d" SHIFT & SET DISTRO=?
IF "%DISTRO%"=="?" SET "DISTRO=%~1"
...
你与你的原创作品距离不远,因为我不喜欢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变体也不是您想要的。可从中获取的文档为/?应该有助于解决问题。谢谢!我想我是想得太多了。