如何在DOS批处理文件中查找一个字符串是否在字符串列表中

9

我希望检查一个批处理文件的参数是否有效,基于一组字符串列表。

例如:

IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1

如果匹配成功,这将仅将ARG设置为有效参数之一。理想情况下,不区分大小写。

2个回答

6
您还可以使用数组方法:
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
)

太好了,谢谢。我希望有一种更简洁的方法来创建数组,但这个方法完全可以胜任。 - justinhj
@justinhj - 当你编辑别人的帖子时,你需要更加小心。实际上,你引入了一个错误。使用 for /L %%i in (1,1,3) 或者 for %%i in (1,2,3) 原本就可以正常工作。但是你对 for /L %%i in (1,2,3) 的编辑将不会给出正确的答案。我已经将答案编辑回了 Aacini 最初的版本。 - dbenham
2
你的第二个选项需要处理没有提供 %1 的情况。给每个参数名称添加一个虚拟前缀可以解决这个问题。 - Kevin
@dbenham 很好的发现。我本来想在更正之前进行测试,但当时我正在使用我的Macbook,没有注意到后面的/L,它的格式如下:FOR /L %variable IN (start,step,end) DO command [command-parameters]。 - justinhj

5
一种强大的方法是使用延迟扩展。
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

您可能想查看这个参数解析器。您可以改编该代码,或者它可能会激发您自己独特策略的一些想法。


Dave:你知道吗,使用不存在的标签调用call命令不会中止程序执行吗?请看下面Kevin的解决方案... - Aacini
我认为你在最后一个for循环中漏掉了一个do。 - Knitschi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接