我有一个版本号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'命令,但每次似乎都越走越远。
答案 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)
对于您提供的示例字符串,Stephan的approach就足够了。
但是,如果字符串包含标记分隔符(空格,,
,;
,=
),引号("
),通配符({ {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""