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

jus*_*nhj 8 string dos batch-file

我想根据字符串列表检查批处理文件的参数是否有效.

例如:

IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
Run Code Online (Sandbox Code Playgroud)

只有匹配时,这才会将ARG设置为其中一个有效参数.理想情况下不区分大小写.

dbe*_*ham 5

一种可靠的方法是使用延迟扩展

setlocal enableDelayedExpansion
set "validArgs=;arg1;arg2;arg3;"
if "!validArgs:;%~1;=!" neq "!validArgs!" set ARG=%1
Run Code Online (Sandbox Code Playgroud)

也可以将CALL与常规扩展一起使用,但是失败的可能性更大,具体取决于参数的值。

set "validArgs=;arg1;arg2;arg3;"
call set "test=%%validArgs:;%~1;=%%"
if "%test%" neq "%validArgs%" set ARG=%1
Run Code Online (Sandbox Code Playgroud)

以上两种技术都有一个限制,即有效的arg不能包含=且args不能以开头*

您还可以使用以下蛮力方法,只要有效的参数均不包含* ? , ; =<space>

set "validArgs=arg1;arg2;arg3"
for %%A in (%validArgs%) if /i "%~1"=="%%A" set ARG=%1
Run Code Online (Sandbox Code Playgroud)

您可能想看看这个参数解析器。您可以修改该代码,也可以为您自己的独特策略激发一些想法。


Aac*_*ini 5

您也可以使用数组方法:

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]!"
Run Code Online (Sandbox Code Playgroud)

在我看来,这种方法通过多个选项进行管理更清晰、更简单。例如,您可以通过以下方式创建有效参数数组:

set i=0
for %%a in (validArgument1 validArgument2 validArgument3) do (
   set /A i+=1
   set arg[!i!]=%%a
)
Run Code Online (Sandbox Code Playgroud)

另一种可能性是为每个有效参数定义一个变量:

for %%a in (validArgument1 validArgument2 validArgument3) do set %%a=1
Run Code Online (Sandbox Code Playgroud)

...然后以这种方式检查参数:

if defined %1 (
   echo %1 is valid option...
   SET ARG=%1
)
Run Code Online (Sandbox Code Playgroud)

  • 您的第二个选项需要处理未提供 %1 的情况。为每个参数名称添加一个虚拟前缀将解决它。 (2认同)