0

我需要批量计算输入字符串的字符数。我不想使用临时文件。没有他们能做到吗?如果是的话,您的代码的解释将不胜感激。谢谢!

4

2 回答 2

3

一个简单的方法是使用一个函数

@echo off
set "myVar=abcdefg"
call :Stringlength result myVar
echo %result%
exit /b

:Stringlength <resultVar> <stringVar>
(   
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    exit /b
)

这可以测量字符串最大为 8192 个字符,因为字符串的最大大小为 8191 个字节,这应该足够了。
第一个括号块只是为了提高性能。
需要第二个块来返回%len%endlocal 屏障后面的值。
主要思想是二进制搜索,在第一个循环中s,测试字符串的临时复制是否超过 4096 字节。
然后下一个测试将使用 2048 或 6144 (=2048+4096),因此len每个循环中的变量会更精确一些。
13 次循环后,len 是准确的。

对于更快的 strlen 函数,您可以阅读strlen boosted,它使用了更多技巧。

还有一个批处理宏的解决方案,宏通常比批处理中的函数快得多。

@echo off
call :loadMacros
set "myVar=abcdefg"
%$strlen%  result myVar
echo %result%
exit /b


:loadMacros
set LF=^


::Above 2 blank lines are required - do not remove
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
:::: StrLen pResult pString
set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%\n%
        for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
            set "str=A!%%~2!"%\n%
              set "len=0"%\n%
              for /l %%A in (12,-1,0) do (%\n%
                set /a "len|=1<<%%A"%\n%
                for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%\n%
              )%\n%
              for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%\n%
        ) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=,

exit /b

在 dostips.com 上有一些关于宏技术的讨论
1 Batch “宏” 带有参数
2带有附加参数的宏

于 2012-05-20T15:51:28.417 回答
0

当你调用函数时,第二个参数应该是一个值而不是一个引用:

call :Stringlength result %myVar%
于 2012-05-20T19:48:37.693 回答