我有一個版本號內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