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

将一些位置参数传递给CMD中的子命令,cmd,parameter-passing,optional-parameters,Cmd,Parameter Passing,Optional Parameters,我有一个接收一些参数的CMD脚本。这就是所谓的: C:\myscript -A value -B value -C value -D -E -F value path1 path2 path3 @echo off rem this is C:\myscript C:\otherscript path1 path2 path3 它可能会接收多个选项类型参数(不一定是相同的数字,可能是无;一些有参数,一些没有参数)和多个路径类型参数(不一定是相同的数字,但总是至少有一个)。这不是一个改变的选项,

我有一个接收一些参数的CMD脚本。这就是所谓的:

C:\myscript -A value -B value -C value -D -E -F value path1 path2 path3
@echo off
rem this is C:\myscript
C:\otherscript path1 path2 path3
它可能会接收多个选项类型参数(不一定是相同的数字,可能是无;一些有参数,一些没有参数)和多个路径类型参数(不一定是相同的数字,但总是至少有一个)。这不是一个改变的选项,因为它是由一个我无法控制的程序调用的

myscript必须仅提取路径类型参数并将其传递给其子命令之一,如下所示:

C:\myscript -A value -B value -C value -D -E -F value path1 path2 path3
@echo off
rem this is C:\myscript
C:\otherscript path1 path2 path3

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

另外一个好处是路径可以显示在命令行中的任何位置,而不仅仅是在末尾。假设是根据您的示例,每个选项及其后面的参数都将被忽略,并且前面没有选项的任何显示都是您希望在调用中使用的路径

@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

(是的,有一个额外的空间,但它更容易阅读,而不是将
其他脚本
%parmlist%
混合在一起)

在对这个问题进行了一段时间的摸索之后,多亏了托卡恩的回答中的一些见解,我开发了一个可以工作的脚本:

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%

路径类型的实际示例将有所帮助。相对路径、UNC路径、显式路径——所有这些都很重要。任何路径都是有效的。唯一可以确定的是,它们都在所有选项之后。然后在参数中搜索\。@foxidrive不起作用:我说过它可以是任何东西,甚至是一个在itI上没有反斜杠的相对路径,但如果有一个非参数选项,如上面的-E,后面跟着一个路径,则没有帮助。不管怎样,它给了我一些想法。我真的不喜欢goto的东西,但它的工作原理与上面修改的一样。嵌套条件有问题,但编辑后的答案应该符合您现在的要求。不适用于myscript.bat-a fred-b wilma firstpath-c secondpath-d barney thirdpath您给-c一个secondpath参数和-d一个barney参数,所以剩下的唯一没有被-选项吸收的参数是firstpath和thirdpath。代码没有问题;由于在-c之后使用了secondpath,所以您只是吸收了secondpath作为OP中的值参数。我没有将secondpath作为-c的参数。问题是明确的,有带参数的选项(问题中的A、B、C、F)和不带参数的选项(问题中的D、E)。