批处理文件计算字符串中所有出现的字符

时间:2017-06-12 15:13:42

标签: batch-file cmd count increment

我有一个版本号17.06.01.01,我想知道有多少条目被分割了一段时间。

我的最后一段代码是;

setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=1-10 delims=." %%a in ("17.09.01.04.03") do (
set /a "iCount+=1"

echo %%a, !iCount!
)
endlocal

我尝试过一系列'For'命令,但每次似乎都越走越远。

3 个答案:

答案 0 :(得分:3)

用空格替换每个点(作为分隔符)。然后计算令牌数量:

@echo off
set "string=17.09.01.04.03"
set count=0
for %%a in (%string:.= %) do set /a count+=1
echo %count%

(如果字符串中有其他空格,逗号或制表符,可能会给出错误的结果,但对于仅包含数字和点的版本字符串示例应该很好用)

@treintje:

echo off
set "string=1>7.0 9.0&1.04.0!3"
set count=0
:again
set "oldstring=%string%"
set "string=%string:*.=%"
set /a count+=1
if not "%string%" == "%oldstring%" goto :again
echo %count%

答案 1 :(得分:2)

对于您提供的示例字符串,Stephanapproach就足够了。

但是,如果字符串包含标记分隔符(空格,,;=),引号("),通配符({ {1}},*)或其他特殊字符(?^&(),{{1} },>)它可能会失败。您当然可以事先用其他人替换大多数此类字符,并使用delayed expansion而不是立即使用,但这仍然无法解决所有问题(例如,您无法替换所有<或{{由于sub-string replacement syntax)而导致的1}}个字符。

然而,以下方法可以处理所有这些字符的任意组合。基本上,它会将每个句点(|)替换为换行符(换行符),并让=计算总行数。

*

如果出现任何特殊字符,则使用延迟扩展预先将换行符替换为换行符,以免失败。 for /F loop执行命令行.并在变量中捕获其输出,减少1,因为find /C /V ""实际返回行数,这些行分隔少一个换行符(因此最初的时期)。需要双重转义的感叹号@echo off set "string=17.09.01.04.03" setlocal EnableDelayedExpansion if defined string (set ^"strtmp=!string:.=^ %= empty string =% !^") else set "strtmp=" for /F %%C in ('cmd /V /C echo(^^!strtmp^^!^| find /C /V ""') do set /A "count=%%C-1" echo "!string!" contains %count% periods. endlocal ,以确保变量cmd /V /C echo(^^!string^^!| find /C /V ""实际上在显式调用的最内层cmd实例中展开,否则,包含的多行字符串未正确传输到pipe (|)

答案 2 :(得分:1)

在用零替换点之前和之后比较strLen的另一种方法。

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
set "string=17.09.01.04.03"
set "str2=%string:.=%"
call :strlen string ret
call :strlen str2 ret2
Set /A "Dots=ret-ret2"
echo Number of dots in %string% is %Dots%
goto :Eof

:strLen string len
:$source http://www.dostips.com/?t=Function.strLen
(SETLOCAL ENABLEDELAYEDEXPANSION
 set "str=A!%~1!"
 set "len=0"
 for /L %%A in (12,-1,0) do (set /a "len|=1<<%%A"
    for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A")
)
ENDLOCAL&IF "%~2" NEQ "" SET /a %~2=%len%
EXIT /b

使用评论中的字符串进行测试:

Pass: set "string=Tim says:"There is a cat and a dog""
Fail: set "string=1>7.0% 9.0&1.04.%0!3"
Pass: set "string=Tim says:"There is a cat. And a dog""