我有一串格式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
等进行比较,但长度不固定。
还有其他方法可以解决它。
答案 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信息。