我正在尝试使用以下内容计算字符串中的字符数:
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.
在我无法获得字符串长度的地方,我做错了什么?
答案 0 :(得分: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
(当它表示"对于字符串的其余部分")m
或n
可能是负面的,它们的意思是"来自字符串的结尾"。
所以 - 如果5+字符存在,但6+不存在,则长度为5,所以dev
; 3
的类似论点。从fail
开始,然后覆盖,如果通过。
您的代码失败有两个原因 - 首先,~sz
已经提及的想法,第二,thre 必须是(
之前if
的空格1}}否则假定(
是要比较的第二个字符串的一部分。批次始终比较字符串 - 数字存储为字符串,数学函数通过从字符串转换为整数进行计算然后返回字符串进行存储/显示来执行。
答案 1 :(得分: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%
(注意:这不是关于性能,而是关于原理)