Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 通过类似开关的参数循环的批处理文件?_Batch File_For Loop_Dos - Fatal编程技术网

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

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 ) 只有当我有一个参数时,它才起作用,这告诉我它是作为

我正在尝试循环传递给批处理文件的参数。根据这个参数,我想设置一个变量标志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测试/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变体也不是您想要的。可从中获取的文档为/?应该有助于解决问题。

谢谢!我想我是想得太多了。