Reputation: 11316
I'd like to check if an argument to a batch file is valid based on a list of strings.
For example:
IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
This would set ARG to one of the valid arguments only if it matched. Ideally case insensitively.
Upvotes: 9
Views: 17258
Reputation: 67236
You may also use the array approach:
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]!"
In my opinion, this method is clearer and simpler to manage with multiple options. For example, you may create the array of valid arguments this way:
set i=0
for %%a in (validArgument1 validArgument2 validArgument3) do (
set /A i+=1
set arg[!i!]=%%a
)
Another possibility is to define a variable for each valid argument:
for %%a in (validArgument1 validArgument2 validArgument3) do set %%a=1
... and then just check the parameter this way:
if defined %1 (
echo %1 is valid option...
SET ARG=%1
)
Upvotes: 6
Reputation: 130889
A robust method is to use delayed expansion
setlocal enableDelayedExpansion
set "validArgs=;arg1;arg2;arg3;"
if "!validArgs:;%~1;=!" neq "!validArgs!" set ARG=%1
It can also be done using CALL along with normal expansion, but it is more likely to fail, depending on the value of the parameter.
set "validArgs=;arg1;arg2;arg3;"
call set "test=%%validArgs:;%~1;=%%"
if "%test%" neq "%validArgs%" set ARG=%1
Both techniques above have a limitation that no valid arg can contain =
and args must not start with *
.
You could also use the following brute force method as long as none of the valid args contain *
?
,
;
=
or <space>
set "validArgs=arg1;arg2;arg3"
for %%A in (%validArgs%) if /i "%~1"=="%%A" set ARG=%1
You might want to have a look at this argument parser. You could adapt that code, or it might spark some ideas for your own unique strategy.
Upvotes: 5