2017-06-12 55 views
2

我有一个版本号内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'命令,但似乎每次都会越走越远。

回答

1

用空格替换每个点(作为分隔符)。再算上令牌的数量:

@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% 
+0

完美的是,我也玩弄了令牌部分,但是从来没有回答过这个问题。欢呼快速回答! – RonBurgundy

+0

我喜欢这个想法。我很好奇,如果有人愿意发布一个没有任何可能的错误结果的一般方法。 – treintje

+0

@treintje:我敢肯定,有人会找到一种方法来使它失败,但它应该是相当强大的(至少对于合理的字符串)。看我的编辑。 – Stephan

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"" 
2

为您提供的样本串; Stephanapproach是完全足够了。

但是,如果字符串包含标记分隔符(空白频段,,;=),引号("),野生卡(*?)或其他特殊字符(^&()>,<,|)它可能会失败。你当然可以取代大部分这样的字符被别人提前,并使用delayed expansion,而不是直接的一个,但这仍不能解决所有问题(例如,你不能代替所有=*字符由于sub-string replacement syntax)。然而

下面的办法可以处理所有这些字符的每个任意组合。基本上它会用换行(换行)字符替换每个句点(.),并让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 

这些时间段被提前换行代替,使用延迟扩展以便在发生任何特殊字符时不会失败。所述for /F loop执行命令行cmd /V /C echo(^^!string^^!| find /C /V ""并捕获其在一个可变输出,由一个作为find /C /V ""实际上返回线,其通过一个较小的线的饲料(因此周期),最初分离的数目减少。双转义惊叹号^^!需要,以确保变量string实际上是在显式调用内最cmd实例中扩大,因为否则的话,所包含的多行字符串不正确运送到pipe (|)

相关问题