2017-03-21 21 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%は、最初の文字は0でm開始「nの長さの指標m始まるvarのサブストリング」を意味します。 nを指定する必要はありません(「残りの文字列」を意味する場合)mまたはnは、「文字列の最後から」を意味する場合は負の値になります。

したがって、5+の文字は存在しますが、6+はそうでない場合、長さは5ですので、dev; 3の同様の議論。 failで始まり、合格すれば上書きしてください。まず、~szアイデアがすでに言及されていて、それ以外if((がに2番目の文字列の一部であると仮定される前に、第2、THRE スペースでなければなりません -

あなたのコードは2つの理由で失敗しました比較される。バッチ常には文字列を比較します。数値は文字列として格納され、数学関数は文字列から整数に変換されて計算され、次に記憶/表示用の文字列に変換されて実行されます。

+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% 

を(注:これはパフォーマンスについてではなく、原則程度)

関連する問題