我有一个版本号内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'命令,但似乎每次都会越走越远。
我有一个版本号内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'命令,但似乎每次都会越走越远。
用空格替换每个点(作为分隔符)。再算上令牌的数量:
@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%
一种不同的方法前,什么也没有更换点后比较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""
为您提供的样本串; Stephan的approach是完全足够了。
但是,如果字符串包含标记分隔符(空白频段,,
,;
,=
),引号("
),野生卡(*
,?
)或其他特殊字符(^
,&
,(
,)
,>
,<
,|
)它可能会失败。你当然可以取代大部分这样的字符被别人提前,并使用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 (|
)。
完美的是,我也玩弄了令牌部分,但是从来没有回答过这个问题。欢呼快速回答! – RonBurgundy
我喜欢这个想法。我很好奇,如果有人愿意发布一个没有任何可能的错误结果的一般方法。 – treintje
@treintje:我敢肯定,有人会找到一种方法来使它失败,但它应该是相当强大的(至少对于合理的字符串)。看我的编辑。 – Stephan