如何循环遍历批处理文件中的所有passsed参数?

时间:2015-12-01 11:24:43

标签: windows batch-file cmd

我有一个主批处理文件

  

Master.bat调用3个文件first.batsecond.bat,   third.bat

现在我想将参数传递给Master.bat,并根据参数想要执行内部语句 例如 如果我通过了Master.bat first,那么Master.bat应该只执行call first.bat而不是其他人。

Master.bat

call "first.bat" 

call "second.bat" 

call "third.bat"

我怎样才能做到这一点?如果还传递了多个参数?我怎么能循环? 回答我接受的工作对我来说很好但是 当我传递额外的其他参数时,它失败了:(如下所示 Master.bat first,second parameter1 parameter2 现在,当我尝试在上面执行它时,只有first.bat Master.bat的代码是

@echo off
:LOOP
if "%1"=="" goto ENDLOOP
call "%1" %3 %2 
shift
goto LOOP
:ENDLOOP
  

%1应该花费first,second%2应该parameter1%2   拿parameter2

2 个答案:

答案 0 :(得分:2)

您要查找的命令是shift

@echo off
:LOOP
if "%1"=="" goto ENDLOOP
call "%1"
shift
goto LOOP
:ENDLOOP

第一个传递的参数始终存储在%1中,第二个传递参数存储在%2中的%3中的第三个,依此类推。 shift命令将索引向右移动。旧的%1丢失,%2变为%1,%3变为%2,依此类推。通过这种方式,您可以简单地迭代所有传递的参数,直到您像参数一样经常移动。然后%1变为空,你用goto ENDLOOP打破循环。

[编辑] 根据您的评论,这里是您尝试做的事情:

@echo off
:LOOP
if "%1"=="" goto ENDLOOP
call "%1" %2 %3
shift
shift
shift
goto LOOP
:ENDLOOP

如果您致电master.bat a.bat b c x.bat y z,则会调用a.bat b cx.bat y z

答案 1 :(得分:2)

您的批处理文件可以通过多种方式执行此操作:

  • 最常见的是连续调用第一个参数%1并使用shift丢弃该参数,然后if检查是否有更多参数goto返回到循环的顶部。

    :loop call "%1" shift if not "x%1"=="x' goto loop

  • 或者,您的脚本可以使用for处理命令行:

    for %%n in ( %* ) do call "%%n"

根据评论,OP也可能会考虑参数是逗号分隔列表的情况。 for命令可以使用delims=选项执行此操作(使用更复杂的示例),通过构造用作构建命令的变量,向其添加拆分令牌并最终执行由此产生的构建命令。这可能应该是一个单独的问题。出于讨论目的,请参阅 How do I get a for loop to work with a comma delimited string?