【发布时间】:2016-12-16 07:34:41
【问题描述】:
假设我编写这个批处理代码来创建一个变量
set var1=test
现在我如何获取这个变量的长度并回显它?
【问题讨论】:
标签: batch-file variables string-length
假设我编写这个批处理代码来创建一个变量
set var1=test
现在我如何获取这个变量的长度并回显它?
【问题讨论】:
标签: batch-file variables string-length
函数调用版本
见 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
宏版
我已经包含了宏版本,虽然它可能很难看出它是如何工作的,但它确实可以加速执行,因为它是内联扩展的,不需要函数查找。
见 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
这些版本总是需要 13 个循环操作来处理多达 8192 个 chars 字符串长度。您可以减少循环操作以加快速度,但每个 删除的循环将可以处理的长度减少了两倍(即 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”的变量中
【讨论】:
%var1% 不好。为什么?使用set var1=2 或set "var1=Redirection operators are < and > and >> and |" 尝试代码。接下来创建文件比在内存中完成所有操作要慢。如果当前工作目录使用此批处理代码为用户帐户写保护,则结果也是错误的,因为无法在当前目录中创建文件。如果length.txt存在于当前目录,但设置了只读属性,结果也是错误的。
> 之前使用%var% > 和一个空格,然后减去3 而不是2,以避免@Mofi 引发的问题