Batch file 拆分字符串并循环变量

Batch file 拆分字符串并循环变量,batch-file,Batch File,我有一个字符串格式101514101234101645101798。我想拆分,上的字符串,然后循环遍历每个单独的元素,将该元素与所需的值进行比较 set required_value=1024 for /f "delims=," %%a in ("101514,101234,101645,101798") do ( set found=%%a if "%found%"=="%required_value%" ( echo true ) else (

我有一个字符串格式
101514101234101645101798
。我想拆分
上的字符串,然后循环遍历每个单独的元素,将该元素与所需的值进行比较

set required_value=1024
for /f  "delims=," %%a in ("101514,101234,101645,101798") do (
    set found=%%a
    if "%found%"=="%required_value%" (
        echo true
    ) else (
        echo false
    )
)
这里显然只考虑第一部分。我可以使用
“tokens=1,2,3”
,然后使用
%%a
%%b
%%c
等进行比较,但长度不是固定的

有没有其他办法解决这个问题。

  • 使用普通
    表示不带
    /f“delims”
  • 不要引用字符串
  • 不要分配给
    found
    变量,如果循环内部没有延迟扩展,它将无法工作,请使用
    %%a


我建议不使用循环的另一种方法

@echo off
setlocal EnableDelayedExpansion
set "RequiredValue=1024"
set "ValuesList=101514,101234,101645,101798"
rem Prepend and append a comma on value list.
set "AllValues=,%ValuesList%,"
rem Use substring replacement to find out if the required
rem value is included in list of values or is missing in list.
if "!AllValues:,%RequiredValue%,=!" == "%AllValues%" (
    echo %RequiredValue% not found in %ValuesList%
) else (
    echo %RequiredValue% is included in %ValuesList%
)
endlocal
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • endlocal/?
  • 如果/?
  • rem/?
  • 设置/?
  • setlocal/?

另一种方法是使用
call
运行子例程,该子例程使用
shift

set required_value=1024
set list_of_values=101514,101234,101645,101798

call :SUBSPLIT %list_of_values%
echo %found%
exit /B

:SUBSPLIT
set found=false
:LOOP
if "%1"=="" (
    exit /B
) else if "%1"=="%required_value%" (
    set found=true
    exit /B
)
shift
goto :LOOP

在命令提示符中键入
call/?
shift/?
,以获取有关此方法的核心命令的远程信息。

显而易见的解决方案是按照wOxxOm的建议,对
命令使用普通的
(无
/F
开关)

一种更有效的方法是替换列表中的所需值,如Mofi在其回答中所述

还有一种方法仅在值为数字时有效。诀窍在于组合一个算术表达式,从列表中的每个值中减去所需的值,然后将所有部分结果相乘;如果所需的值是列表中的一个,则结果为零

@echo off
setlocal

set "ValuesList=101514,101234,101645,101798"

rem Create the test function
set "IsValueInList(x)=(%ValuesList:,=-x)*(%-x)"

rem Test if a value is in list
set "RequiredValue=1024"
set /A "test=%IsValueInList(x):x=RequiredValue%"

if %test% equ 0 (
   echo true
) else (
   echo false
)

这个程序使用了两个有趣的技巧:如中所述的批处理“函数”的定义,以及如中所述的“分隔符上拆分字符串”的特殊方法。

由于答案的缘故,这个简单任务的问题对于我估计的许多用例都非常有用。他们的答案中展示的技巧非常棒,对于这项任务来说不是非常有效,但确实值得花时间在
echo on
上研究它们。我只能建议每一位来访者查看所有答案。他们都很棒!
@echo off
setlocal

set "ValuesList=101514,101234,101645,101798"

rem Create the test function
set "IsValueInList(x)=(%ValuesList:,=-x)*(%-x)"

rem Test if a value is in list
set "RequiredValue=1024"
set /A "test=%IsValueInList(x):x=RequiredValue%"

if %test% equ 0 (
   echo true
) else (
   echo false
)