|
|
本帖最后由 redyear2026 于 2026-3-17 16:45 编辑
这是批处的一个经典话题了。以下代码供没有预装 powershell 但可在批处理脚本中运行 vbs/jscript/mshta 代码的场合(据说 winPE 的 pecmd 内置了计算字符串长度的函数 strl,另当别论吧)。
先设定要获取其长度(字符量和字节量,字符量把中文字符视为一个字符计算,字节量把中文字符视为两个字节计算)的字符串变量 set "s=!"【"文"】"" %%",其中字符%在字面量中须予加倍写成%%。以下示例代码尽量采用环境变量向 vbs/jscript/mshta 代码传值以避免处理复杂字面量(如 %s% 变量值)的麻烦。
一。直接调用 jscript 代码(不用临时文件)获取字符串的字符量,但该法因采用 mshta 引擎会产生闪屏
- @echo off & set "s=!"【"文"】"" %%"
- for /f %%v in ('mshta "javascript:v=new ActiveXObject('wscript.shell').environment('process')('s');new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).write(v.length);close()" ') do echo,%%v
- pause
复制代码 二。创建临时文件 *.vbs 获取字符串的字符量,没有方法一导致的闪屏
- @echo off & set "s=!"【"文"】"" %%"
- echo,x=createobject("wscript.shell").environment("process")("s"):wsh.echo(len(x))>#.vbs&for /f %%v in ('cscript /nologo #.vbs') do echo,%%v
- pause
复制代码 三。创建临时文件获取字符串的字节量,为避免 cmd 的预处理后果,须用延迟变量逃逸的方法,计算结果-4是要删除包裹 !s! 值的双引号和末尾换行符的数量
- @echo off & set "s=!"【"文"】"" %%"
- setlocal enabledelayedexpansion &echo,"!s!">#.$&endlocal
- for %%F in (#.$) do set/a "v=%%~zF-4"
- echo,%v%
- pause
复制代码 四。回顾批处理有史以来最经典的精品之一,即用纯批处理代码获取字符串长度(来自外网 dostips 2008年发布的老帖),其经典之义是其高效率。以下代码是其简化版 strLen 的示例
- @echo off &set "s=!"【"文"】"" %%"
- setlocal enabledelayedexpansion &call :strLen s v
- echo,!v!
- pause&exit/b
- :strLen
- set "_str=!%~1!" &set "_len=1"
- for %%p in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
- if "!_str:~%%p,1!" neq "" (set/a "_len+=%%p" &set "_str=!_str:~%%p!") )
- set "%~2=!_len!" &exit/b
复制代码
|
|