我有一个主批处理文件
Master.bat调用3个文件
first.bat
,second.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
答案 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 c
和x.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?