计算字符串中有多少个字符输出语法不正确

Counting how many characters are in a string outputting syntax incorrect

我正在尝试使用以下方法计算字符串中有多少个字符:

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.

我哪里做错了,无法获取字符串的长度?

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% 表示 "the substring of var starting at index m for a length of n" 其中 m 第一个字符从 0 开始。 n 无需指定(当它表示 "for the rest of the string" 时) mn 在表示 "from the end of the string".

时可能为负数

所以——如果5+的字符存在,而6+的字符不存在,那么长度就是5,所以dev3 的类似论点。从 fail 开始,如果通过则覆盖。

您的代码失败有两个原因 - 首先,~sz 已经提到的想法,其次,必须 是 space (if 中,否则 ( 被假定为要比较的第二个字符串的一部分。批处理 总是 比较字符串 - 数字存储为字符串,数学函数通过从字符串转换为整数进行计算然后返回字符串 storage/display.

来执行
@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%

(8191cmd 中字符串的最大可能长度)
检查第一个非空位置。

如果您希望字符串通常很长,最好检查 "from back to front":

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

(注意:这里不是性能,而是原理)