【问题标题】:Pass some positional parameters to subcommand in CMD将一些位置参数传递给 CMD 中的子命令
【发布时间】:2014-09-29 14:24:32
【问题描述】:

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

【问题讨论】:

  • 路径类型的实际示例会有所帮助。相对、UNC、显式路径 - 这一切都很重要。
  • 任何路径都有效。唯一可以确定的是,它们都是在所有选择之后出现的。
  • 然后在参数中搜索一个\。
  • @foxidrive 不起作用:我说它可以是任何东西,甚至是没有反斜杠的相对路径

标签: cmd parameter-passing optional-parameters


【解决方案1】:

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

@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% 混在一起更容易阅读)

【讨论】:

  • 我喜欢它,但在您有一个非参数选项(如上面的 -E 后跟一个路径)的情况下它没有帮助。无论如何,它给了我一些想法。
  • 好的。我不太喜欢 goto 的东西,但它的工作原理和上面的修改一样。嵌套条件有问题,但编辑后的答案应该可以满足您现在的需求。
  • 不适用于 myscript.bat -a fred -b wilma firstpath -c secondpath -d barney thirdpath
  • 你给 -c 一个 secondpath 的参数和 -d 一个 barney 的参数,所以剩下的唯一没有被 -option 吸收的参数是 firstpath 和 thirdpath。代码没有问题;由于您在 -c 之后使用它,因此您只是吸收了 secondpath 作为您在 OP 中作为 Value 参数所指的内容。
  • 我没有将 secondpath 作为 -c 的参数。问题很明确,有带参数的选项(问题中的 A、B、C、F)和不带参数的选项(问题中的 D、E)。
【解决方案2】:

在解决了这个问题一段时间后,感谢 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%

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 2017-04-13
    • 1970-01-01
    • 2014-07-22
    • 2017-08-30
    • 2021-11-25
    • 2022-01-05
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多