批量获取变量的长度

Getting length of a variable in batch

假设我写这个批处理代码来创建一个变量

set var1=test

现在如何获取此变量的长度并回显它?

如果将变量回显到一个文件,然后得到文件的长度,由于不可见字符,可以减去2个字符。

echo %var1%> length.txt
for %%? in (length.txt) do ( set /a length=%%~z? - 2 )

那么你的长度应该在一个名为“length”的变量中

您可以使用此代码:

@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

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?

Function call version

见 1. DosTips length of a string

@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

How it works

Macro version

我已经包含了宏版本,虽然可能很难看出它是如何工作的,但它确实加快了执行速度,因为它是内联扩展的,不需要函数查找。

见 1. Macros with parameters appended 2. How do you get the string length in a batch file?

@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

These versions need always 13 loop operations to handle up to 8192 chars string length. You may reduce loop operations to speed up, but every loop removed reduce by two the length that can be handled (i.e 12 loops=4096, 11 loops=2048, and so on)