我正在尝试更优雅地处理脚本的命令行参数。我真的很喜欢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解决方案,所以我试图使用他们用来检测参数是选项还是参数的一些方法。如果有人能比我更好地结合它们,请做。
答案 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