分割字符串并循环变量

问题描述 投票:0回答:4

我有一个格式的字符串

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

还有其他办法解决吗?

batch-file
4个回答
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 /?

2
投票
  • 使用普通
    for
    而不使用
    /f "delims"
  • 不要引用字符串
  • 不要分配给
    found
    变量,如果循环内没有延迟扩展,它将无法工作,请使用
    %%a

for %%a in (101514,101234,101645,101798) do (
    if "%%a"=="%required_value%" (
        echo true
    ) else (
        echo false
    )
)

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
)

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


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 /?
以获取有关此方法核心命令的节点信息。

© www.soinside.com 2019 - 2024. All rights reserved.