尝试在BATCH中实现getopt,首先使用标记参数,然后使用其他参数

时间:2018-01-24 17:20:28

标签: parsing batch-file command-line cmd getopt

我正在尝试更优雅地处理脚本的命令行参数。我真的很喜欢getopt在C中处理参数的方式,但是在我的脚本中,不值得用新语言重写它。我遇到了这个帖子:https://stackoverflow.com/a/3661082,其中包括我非常喜欢的这种方法:

:GETOPTS
if /I "%1" == "-h" goto Help
if /I "%1" == "-b" set BASE=%2 & shift
if /I "%1" == "-s" set SQL=%2 & shift
shift
if not "%1" == "" goto GETOPTS
  

归功于@tivnet和@Kris

我还在另一个也使用了强制性参数的线程中找到了this的答案,但在他们的场景中,他们首先使用了强制性参数,而我想在最后使用它们。

@ECHO OFF

SET man1=%1
SET man2=%2
SHIFT & SHIFT

:loop
IF NOT "%1"=="" (
    IF "%1"=="-username" (
    SET user=%2
    SHIFT
)
IF "%1"=="-otheroption" (
    SET other=%2
    SHIFT
)
SHIFT
GOTO :loop
)
  

归功于@ewall

在我的参数处理实现中,我有一个问题是在可选的命名参数之后两个必需参数是空的。应该如何输入参数的示例:

script.cmd [ -F 文件类型] [ -D delete-old ] SOURCE DEST

@ECHO OFF

:GETOPTS
if /I "%1"=="-h" GOTO HELP
if /I "%1"=="-F" set fileType=%2 & SHIFT
if /I "%1"=="-D" set deleteOld=%2 & SHIFT
SHIFT
if not "%1"=="" GOTO GETOPTS
SHIFT & SHIFT

set source=%1
set dest=%2

当我尝试回复%source%%dest%时,我得到空的回复。我设置的其他变量按预期工作。我哪里错了?

我刚刚在SuperUser上找到了this解决方案,所以我试图使用他们用来检测参数是选项还是参数的一些方法。如果有人能比我更好地结合它们,请做。

1 个答案:

答案 0 :(得分:0)

经过大量的试验和错误,我得到了一些工作。我学到的一些经验教训是,没有任何参数的标志不需要自己的SHIFT。

@ECHO OFF

:GETOPT
if /I "%1"=="-h" goto HELP
if /I "%1"=="--help" goto HELP
if /I "%1"=="-v" goto VERSION
if /I "%1"=="--version" goto VERSION
if /I "%1"=="-F" set fileType=%2 & SHIFT
if /I "%1"=="-D" set deleteOld=1
SHIFT
set source=%1
set dest=%2
if not "%3"=="" goto GETOPT
goto EOF