2017-06-12 57 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 (|)

相關問題