0

我需要编写一个批处理脚本,我们称之为script.bat。我希望它有选项,我们称它们为选项 1 和选项 2。就像我们随处可见的著名的 --help 一样。

根据用户的需要,我希望以下 4 行成为启动脚本的 4 个可能命令:

script.bat -option1 value1 -option2 value2
script.bat -option2 value2 -option1 value1
script.bat -option1 value1 
script.bat -option2 value2

现在开始脚本编码:我想要一种处理选项读取的巧妙方法。我知道参数读数(程序名称为 %0,参数 1 为 %1 等)。但这不是很灵活,因为选项,顾名思义,可以是可选的并且可以任意顺序(参见代码块第 2 行的上述命令)。

你们会怎么做呢?

谢谢 !

4

2 回答 2

3

不是 100% 你所追求的,但怎么样:

@echo off

setlocal

set OPTION1=
set OPTION2=
set OPTION3=

:ARGS_LOOP
if {%1} == {} goto END_OF_ARGS
set ARG=%1

if /i "%ARG:~0,9%" == "/OPTION1:" set OPTION1=%ARG:~9%
if /i "%ARG:~0,9%" == "/OPTION2:" set OPTION2=%ARG:~9%
if /i "%ARG:~0,9%" == "/OPTION3:" set OPTION3=%ARG:~9%

shift

goto ARGS_LOOP

:END_OF_ARGS

echo Option 1 was set to [%OPTION1%]
echo Option 2 was set to [%OPTION2%]
echo Option 3 was set to [%OPTION3%]

endlocal

例如,这可以保存为 TEST.CMD,然后运行如下:

TEST.CMD /option1:xxx /option2:yyy

等等。命令行中指定的选项顺序无关紧要。

于 2013-03-14T21:10:31.777 回答
2
@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,anotheroptionswitch1; anotherswitch设置switch2= Y ; 设置option2= optionvaluebadoptions= -invalid

于 2013-03-15T01:02:10.203 回答