我希望检查一个批处理文件的参数是否有效,基于一组字符串列表。
例如:
IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
如果匹配成功,这将仅将ARG设置为有效参数之一。理想情况下,不区分大小写。
我希望检查一个批处理文件的参数是否有效,基于一组字符串列表。
例如:
IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
如果匹配成功,这将仅将ARG设置为有效参数之一。理想情况下,不区分大小写。
setlocal EnableDelayedExpansion
set arg[1]=validArgument1
set arg[2]=validArgument2
set arg[3]=validArgument3
for /L %%i in (1,1,3) do if /I "%1" equ "!arg[%%i]!" SET "ARG=!arg[%%i]!"
在我看来,这种方法更清晰简单,可以轻松管理多个选项。例如,您可以通过以下方式创建有效参数的数组:
set i=0
for %%a in (validArgument1 validArgument2 validArgument3) do (
set /A i+=1
set arg[!i!]=%%a
)
for %%a in (validArgument1 validArgument2 validArgument3) do set %%a=1
然后只需要这样检查参数:
if defined %1 (
echo %1 is valid option...
SET ARG=%1
)
setlocal enableDelayedExpansion
set "validArgs=;arg1;arg2;arg3;"
if "!validArgs:;%~1;=!" neq "!validArgs!" set ARG=%1
也可以使用CALL和普通扩展一起完成,但这样做可能会失败,具体取决于参数的值。
set "validArgs=;arg1;arg2;arg3;"
call set "test=%%validArgs:;%~1;=%%"
if "%test%" neq "%validArgs%" set ARG=%1
=
,且参数不能以*
开头。*
、?
、,
、;
、=
或<space>
,您也可以使用以下暴力方法。set "validArgs=arg1;arg2;arg3"
for %%A in (%validArgs%) if /i "%~1"=="%%A" set ARG=%1
您可能想查看这个参数解析器。您可以改编该代码,或者它可能会激发您自己独特策略的一些想法。
call
命令不会中止程序执行吗?请看下面Kevin的解决方案... - Aacini
for /L %%i in (1,1,3)
或者for %%i in (1,2,3)
原本就可以正常工作。但是你对for /L %%i in (1,2,3)
的编辑将不会给出正确的答案。我已经将答案编辑回了 Aacini 最初的版本。 - dbenham