计算字符串中有多少个字符输出语法不正确
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" 时) m
或 n
在表示 "from the end of the string".
时可能为负数
所以——如果5+的字符存在,而6+的字符不存在,那么长度就是5,所以dev
; 3
的类似论点。从 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%
(8191
是 cmd
中字符串的最大可能长度)
检查第一个非空位置。
如果您希望字符串通常很长,最好检查 "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%
(注意:这里不是性能,而是原理)
我正在尝试使用以下方法计算字符串中有多少个字符:
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" 时) m
或 n
在表示 "from the end of the string".
所以——如果5+的字符存在,而6+的字符不存在,那么长度就是5,所以dev
; 3
的类似论点。从 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%
(8191
是 cmd
中字符串的最大可能长度)
检查第一个非空位置。
如果您希望字符串通常很长,最好检查 "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%
(注意:这里不是性能,而是原理)