我需要批量计算输入字符串的字符数。我不想使用临时文件。没有他们能做到吗?如果是的话,您的代码的解释将不胜感激。谢谢!
问问题
8810 次
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 回答