我有一个格式的字符串
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
等等来比较,但长度不固定。
还有其他办法解决吗?
我建议使用一种不带循环的不同方法。
@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 /?
for
而不使用 /f "delims"
found
变量,如果循环内没有延迟扩展,它将无法工作,请使用 %%a
for %%a in (101514,101234,101645,101798) do (
if "%%a"=="%required_value%" (
echo true
) else (
echo false
)
)
显而易见的解决方案是按照 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
)
这个程序使用了两个有趣的技巧:如这篇文章中所述的批处理“函数”的定义,以及如此处所述的“在分隔符上分割字符串”的特殊方法。
另一种方法是使用
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 /?
以获取有关此方法核心命令的节点信息。