我有一个接收一些参数的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等编号位置参数,因为我事先并不知道有多少选项类型参数,也不知道有多少路径类型选项。
答案 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%