@ECHO OFF
SETLOCAL
SET options=option1 option2 anotheroption
SET switches=switch1 switch2 anotherswitch
CALL :readoptions %*
FOR %%i IN (%options% %switches% badoptions) DO IF DEFINED %%i (SET %%i) ELSE (ECHO %%i NOT set)
GOTO :eof
:readoptions
FOR %%i IN (%options% %switches% badoptions) DO (SET %%i=)
:optlp
SET _parm1=%1
IF NOT DEFINED _parm1 GOTO :EOF
FOR %%i IN (%switches%) DO IF %_parm1%==-%%i SET %%i=Y&(SET _parm1=)
IF NOT DEFINED _parm1 shift&GOTO :optlp
FOR %%i IN (%options%) DO IF %_parm1%==-%%i (
SET %%i=%2
IF DEFINED %%i shift&shift&(SET _parm1=)
)
IF DEFINED _parm1 SET badoptions=%badoptions% %1&SHIFT
GOTO :optlp
如果您想要 /options 或 /switches,更改应该很明显
对于任何一组开关,将开关名称放在 er 中,switches
类似的选项名称放在options
. 如果-switchname
在命令行中找到,则将变量switchname
设置为 Y,否则不设置。同样,如果-optionname
找到则将后面的参数设置为变量的值optionname
,否则optionname
不设置。
任何既不是指定的 switchname 也不是 optionname 或 optionvalue 的参数都将被收集到badoptions
所以 - 使用如图所示的一组选项和开关,命令
thisbatch -switch2 -option2 optionvalue -invalid
将清除变量option1
,anotheroption
和switch1
; anotherswitch
设置switch2
= Y ; 设置option2
= optionvalue和badoptions
= -invalid