批量获取变量长度

问题描述 投票:0回答:3

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

set var1=test

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

batch-file variables string-length
3个回答
7
投票

函数调用版本

见 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,依此类推)


1
投票

可以使用此代码:

@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 /?

-1
投票

如果将变量回显到文件,然后获取文件的长度,则可以减去 2 个字符,因为存在不可见字符。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.