将一些位置参数传递给CMD中的子命令

时间:2014-09-29 14:24:32

标签: cmd parameter-passing optional-parameters

我有一个接收一些参数的CMD脚本。它被称为:

C:\myscript -A value -B value -C value -D -E -F value path1 path2 path3

它可能会收到几个选项类型参数(并不总是相同的数字,可能是无;有些带参数,有些没有)和几个路径类型参数(并不总是相同的数字,但总是至少有一个)。不能改变它,因为它是由我无法控制的程序调用的。

myscript只能提取路径类型参数并将它们传递给它的一个子命令,如下所示:

@echo off
rem this is C:\myscript
C:\otherscript path1 path2 path3

我不能使用%1%2或%3等编号位置参数,因为我事先并不知道有多少选项类型参数,也不知道有多少路径类型选项。

2 个答案:

答案 0 :(得分:0)

额外的好处是路径可以显示在命令行的任何位置,而不仅仅是在最后。假设是根据您的示例,每个选项及其紧随其后的参数都被忽略,并且在没有选项前面显示的任何内容都是您要在呼叫中使用的路径。

@echo off
rem this is C:\myscript too :)
rem do this so it's repeatable, or use setlocal/endlocal

set parmlist=

:loop
set parm=%1
if '%parm:~0,1%'=='-' goto option
set parmlist=%parmlist% %parm%
shift
if '%1'=='' goto done
goto loop

:option
shift
if '%1'=='' goto done
set parm=%1
if not '%parm:~0,1%'=='-' shift
if not '%1'=='' goto loop

:done
c:\otherscript %parmlist%

使用此命令行进行测试:

myscript -a fred -b wilma firstpath -c -d barney secondpath thirdpath

结果:

c:\otherscript  firstpath secondpath thirdpath

(是的,那里有一个额外的空间,但更容易阅读而不是将otherscript%parmlist%混合在一起)

答案 1 :(得分:0)

在解决了这个问题后,感谢Torqane的回答,我已经开发了一个有效的脚本:

SET SAVEPATH=

:loop
SET var1=%1
SET VAR1NOQUOTE=%~1
SET VAR1FIRST=%VAR1NOQUOTE:~0,1%

if "%VAR1NOQUOTE%"=="" goto continue

rem test known no-argument options
if "%VAR1NOQUOTE%"="-A" goto shift1
if "%VAR1NOQUOTE%"="-B" goto shift1
rem etc... as many as needed

rem test options with arguments
if "%VAR1FIRST%"="-" goto shift2

rem if not an aption, it is a path
SET SAVEPATH=%SAVEPATH% %VAR1%
shift
goto loop

:shift1
shift
goto loop

:shift2
shift
shift
goto loop

:continue
C:\otherscript %SAVEPATH%