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
)