【问题标题】:Write batch file, with hyphenated parameters编写带有连字符参数的批处理文件
【发布时间】:2023-03-03 03:15:02
【问题描述】:

我需要编写一个批处理脚本,我们称之为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 行的上述命令)。

你们会怎么做呢?

谢谢!

【问题讨论】:

标签: windows batch-file command-line-arguments


【解决方案1】:

不是你所追求的 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

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

【讨论】:

  • 很好,谢谢西蒙。只是一个问题,你能告诉我这个命令是做什么的吗? : 如果 /i "%ARG:~0,9%" == "/OPTION1:" 设置 OPTION1=%ARG:~9%
  • 它将ARG的前九个字符与/OPTION1:进行比较,然后将OPTION1的值设置为第九个字符之后的所有字符。
【解决方案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

任何既不是指定开关名也不是选项名也不是选项值的参数将被收集到badoptions

所以 - 使用如图所示的一组选项和开关,命令

thisbatch -switch2 -option2 optionvalue -invalid

将清除变量option1anotheroptionswitch1anotherswitch;设置switch2=Y;设置 option2=optionvaluebadoptions=-invalid

【讨论】:

  • 非常感谢您的回答。你能解释一下这是什么意思吗:“.%_parm1%==.-%%i”我对点的使用感到困惑。
  • 嗯 - 似乎是一些早期代码的后遗症。从逻辑上讲,他们不需要在那里。这个想法是确保在任何情况下== 左侧或右侧的字符串都不能为空,因为这些位置的空字符串会产生语法错误。由于 %%i 不能为空,并且每个前面都直接有一个 IF NOT DEFINED 对变量 _parm1 进行操作,因此这些点是多余的。我会编辑它们并添加一些注释...
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 2010-09-06
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多