拆分字符串并循环遍历变量

时间:2015-11-21 13:21:03

标签: batch-file

我有一串格式101514,101234,101645,101798。我想在,上拆分字符串,然后遍历每个元素,将该元素与所需的值进行比较。

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等进行比较,但长度不固定。

还有其他方法可以解决它。

4 个答案:

答案 0 :(得分:4)

我建议使用不带循环的不同方法。

@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 /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

答案 1 :(得分:2)

  • 不使用for
  • 使用普通/f "delims"
  • 不引用字符串
  • 不分配给found变量,如果没有循环内的延迟扩展,它将无效,请使用%%a
for %%a in (101514,101234,101645,101798) do (
    if "%%a"=="%required_value%" (
        echo true
    ) else (
        echo false
    )
)

答案 2 :(得分:2)

显而易见的解决方案是使用wOxxOm建议的普通for命令(无/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
)

这个程序使用了两个有趣的技巧:this post中描述的批处理“功能”的定义,以及“按分隔符分割字符串”的特殊方法,如here所述。

答案 3 :(得分:1)

另一种方法是使用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 /?以获取有关此方法的核心命令的mote信息。