假设我编写这个批处理代码来创建一个变量
set var1=test
现在我如何获取这个变量的长度并回显它?
函数调用版本
见 1. DosTips 字符串长度
@echo off
set /p "input=Enter text: "
call :strlen "%input%", len
echo Length is %len%
exit/B
:strlen string len
SetLocal EnableDelayedExpansion
set "token=#%~1" & set "len=0"
for /L %%A in (12,-1,0) do (
set/A "len|=1<<%%A"
for %%B in (!len!) do if "!token:~%%B,1!"=="" set/A "len&=~1<<%%A"
)
EndLocal & set %~2=%len%
exit/B
宏版
我已经包含了宏版本,虽然可能很难看出它是如何工作的,但实际上它会加速执行,因为它是内联扩展的,不需要函数查找。
见 1. 附加参数的宏 2. 如何获取批处理文件中的字符串长度?
@echo off
SetLocal DisableDelayedExpansion
call :setupMacros
set /p "input=Enter text: "
%STRLEN% len,input
echo Length is %len%
EndLocal
exit/B
:setupMacros
set ^"LF=^
^" don't remove previous line & rem line feed
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^" & rem newline with line continuation
:: macro definition
:: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:: http://www.dostips.com/forum/viewtopic.php?f=3&t=2518
:: get string length
set STRLEN=for %%{ in (1 2) do if %%{==2 (%\n%
for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
set "S=A!%%~2!"^&set "L=0"%\n%
for /L %%A in (12,-1,0) do (set/a "L|=1<<%%A"^&for %%B in (!L!) do if "!S:~%%B,1!"=="" set/a "L&=~1<<%%A")%\n%
for /F "delims=" %%} in ("!L!") do EndLocal^& set "%%1=%%~}"%\n%
)%\n%
) else SetLocal EnableDelayedExpansion ^& set argv=,
exit/B 0
这些版本始终需要 13 次循环操作才能处理最多 8192 个 字符字符串长度。您可以减少循环操作以加快速度,但是每个 移除循环将可处理的长度减少两倍(即 12 循环=4096,11 个循环=2048,依此类推)
可以使用此代码:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "var1=test"
set "Length=0"
if not defined var1 goto OutputLength
:GetLength
if not "!var1:~%Length%,1!" == "" (
set /A Length+=1
goto GetLength
)
:OutputLength
echo Length of variable var1 is: %Length%
endlocal
pause
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
goto /?
if /?
pause /?
set /?
setlocal /?
如果将变量回显到文件,然后获取文件的长度,则可以减去 2 个字符,因为存在不可见字符。
echo %var1%> length.txt
for %%? in (length.txt) do ( set /a length=%%~z? - 2 )
那么你的长度应该在一个名为“length”的变量中