2017-03-21 118 views
1

我想指望有多少字符是一個字符串中使用下列內容:計數多少個字符是一個字符串輸出語法不正確

set "vnum=0.1.2" 
for %%i in (%vnum%) do set count=%%~szi 
if %count%==5(
    set "vtype=dev" 
) else if %count%==3 (
    set "vtype=stable" 
) else (
    set "vtype=unknown" 
) 
@echo "v%vnum%(%vtype%)" 
@echo. 

然而,當我運行它,它的輸出The syntax of the command is incorrect.

我做錯了什麼,我無法獲得字符串的長度?

+2

了' %〜z'修飾符只適用於文件名,不適用於字符串。沒有'%〜s'修飾符。 – Stephan

+2

如果您期望'%%〜szi'提供字符串中的字符數,那麼您就錯了。我建議你搜索這個和其他網站的字符串長度例程,並部署最適合你的那個。 – Compo

+0

'〜s'修飾符用於返回短(8.3)路徑/名稱... – aschipfl

回答

2
set "vnum=0.1.2" 
set "vtype=unknown" 
if defined vnum (
if "%vnum:~4%" neq "" if "%vnum:~5%" equ "" set "vtype=dev" 
if "%vnum:~2%" neq "" if "%vnum:~3%" equ "" set "vtype=stable" 
) 

@echo "v%vnum%(%vtype%)" 
@echo. 

語法%var:~m,n%意思是「開始的var子串在索引m用於n」的長度,其中m從0開始的第一個字符。 n不需要指定(當它意味着「對於字符串的其餘部分」)mn可能是負數,它們表示「從字符串的末尾」。所以 - 如果5+字符存在,但6+不存在,那麼長度是5,所以dev;類似的論點爲3。從fail開始,然後覆蓋是否通過。

你的代碼的失敗有兩個原因 - 第一,已經被提到~sz理念和第二,在if否則((被認爲是第二個字符串的一部分之前THRE 必須是空間進行比較。批總是比較字符串 - 數字存儲爲字符串和數學函數是通過從字符串轉換爲整數進行計算,然後回到字符串存儲/顯示執行。

+0

這是神奇的謝謝 – jakehimton

1
@echo off 
set "var=1234567890" 
setlocal enabledelayedexpansion 
for /l %%a in (0,1,8191) do if "!var:~%%a,1!" neq "" set length=%%a 
set /a length+=1 
REM add one, because counting starts with `0` 
echo %length% 

8191爲最大。在cmd字符串的可能長度)
檢查第一個非空的位置。

如果你希望你的字符串是通常很長,精益求精「從後到前」檢查:

@echo off 
setlocal enabledelayedexpansion 
set "var=1234567890" 
for /l %%a in (8191,-1,1) do if "!var:~%%a,1!" equ "" set length=%%a 
echo %length% 

(注:這是不是性能,而是原則)

相關問題