找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 319|回复: 18

[求助] 批处理bat如何判断字符串长度

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

请教热心网友,如何使用批处理bat判断字符串长度,
特别是字符串带有【空格】、【“】、【】(即两个“字符连在一起)等特殊情况时。

发表于 3 天前 | 显示全部楼层
批处理本身处理复杂字符串比较麻烦,推荐调用 PowerShell 来获取字符串长度,可以轻松处理特殊字符。使用 powershell 判断字符串长度(推荐)

  1. echo off
  2. setlocal

  3. :: 示例字符串,可以包含空格、引号、连续引号等
  4. set "input=Hello "World""

  5. :: 调用 PowerShell 获取字符串长度
  6. for /f "usebackq" %%a in (`powershell -command "$env:input.Length"`) do set "len=%%a"

  7. echo 字符串长度为: %len%

  8. endlocal
复制代码

说明:
  • set "input=Hello "World"":即使包含特殊字符,用 set "变量=..." 格式是安全的。
  • powershell -command "$env:input.Length":读取环境变量 input 的内容,并返回其长度。
  • for /f 用来捕获 PowerShell 的输出。


如果坚持使用纯批处理虽然可以实现,但处理引号、空格会变得非常复杂,容易出错,不推荐用于实际项目。

回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
2楼说得很全面了

如果一定要用纯批处理,可以试下这个函数,对于包含空格和双引号的字符串,结果是正确的
来源于互联网,相当精巧

@echo off
set "input=Hello "World""
call :getstrlen input len
if defined len echo -%len%-
pause
exit

REM 获取变量中字符串长度,存入变量
REM call :getstrlen str len
:getstrlen
if "%~1" equ "" goto :eof
if "%~2" equ "" goto :eof
setlocal enabledelayedexpansion
set "$=!%1!#"
set "len="&for %%a in (4096 2048 1024 256 128 64 32 16 8 4 2 1) do (if "!$:~%%a,1!" NEQ "" set/a len+=%%a&set "$=!$:~%%a!" &if "!$:~1!"=="" goto getstrlenok)
set "s=!s!fedcba9876543210" &set/a "len+=0x!s:~16,1!"
:getstrlenok
endlocal&set/a "%2=%len%"&goto:eof
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
这东西用AI编写一个可以试试
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层

感谢分享,快乐分享,分享快乐。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
感谢论坛速度提升
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习学习
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
2楼威武!
回复

使用道具 举报

发表于 3 天前 来自手机 | 显示全部楼层
对于用于长度对其的长度计算,批处理有先天劣势,特别是中英文半角全角混排情况,dpinfo中采用的办法是写入临时文件,根据文件大小计算。或者省事点用tab键对齐。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
支持2#4#热心坛友
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习下了
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
如果只是单纯的要长度,那就直接计算就好了。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 示例字符串,可以包含空格、引号、连续引号等
  4. set "str=Hello "World""""

  5. :count
  6. if not "!str:~%n%,1!"=="" set /a n+=1&goto :count
  7. echo;%n%
  8. pause&exit
复制代码


回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习学习
回复

使用道具 举报

发表于 前天 15:11 | 显示全部楼层
本帖最后由 redyear2026 于 2026-3-17 16:45 编辑

这是批处的一个经典话题了。以下代码供没有预装 powershell 但可在批处理脚本中运行 vbs/jscript/mshta 代码的场合(据说 winPE 的 pecmd 内置了计算字符串长度的函数 strl,另当别论吧)。
先设定要获取其长度(字符量和字节量,字符量把中文字符视为一个字符计算,字节量把中文字符视为两个字节计算)的字符串变量 set "s=!"【"文"】"" %%",其中字符%在字面量中须予加倍写成%%。以下示例代码尽量采用环境变量向 vbs/jscript/mshta 代码传值以避免处理复杂字面量(如 %s% 变量值)的麻烦。

一。直接调用 jscript 代码(不用临时文件)获取字符串的字符量,但该法因采用 mshta 引擎会产生闪屏

  1. @echo off & set "s=!"【"文"】"" %%"
  2. 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
  3. pause
复制代码
二。创建临时文件 *.vbs 获取字符串的字符量,没有方法一导致的闪屏
  1. @echo off & set "s=!"【"文"】"" %%"
  2. echo,x=createobject("wscript.shell").environment("process")("s"):wsh.echo(len(x))>#.vbs&for /f %%v in ('cscript /nologo #.vbs') do echo,%%v
  3. pause
复制代码
三。创建临时文件获取字符串的字节量,为避免 cmd 的预处理后果,须用延迟变量逃逸的方法,计算结果-4是要删除包裹 !s! 值的双引号和末尾换行符的数量

  1. @echo off & set "s=!"【"文"】"" %%"
  2. setlocal enabledelayedexpansion &echo,"!s!">#.$&endlocal
  3. for %%F in (#.$) do set/a "v=%%~zF-4"
  4. echo,%v%
  5. pause
复制代码
四。回顾批处理有史以来最经典的精品之一,即用纯批处理代码获取字符串长度(来自外网 dostips 2008年发布的老帖),其经典之义是其高效率。以下代码是其简化版 strLen 的示例
  1. @echo off &set "s=!"【"文"】"" %%"
  2. setlocal enabledelayedexpansion &call :strLen s v
  3. echo,!v!
  4. pause&exit/b
  5. :strLen
  6.    set "_str=!%~1!" &set "_len=1"
  7.    for %%p in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  8.    if "!_str:~%%p,1!" neq "" (set/a "_len+=%%p" &set "_str=!_str:~%%p!") )
  9.    set "%~2=!_len!" &exit/b
复制代码



回复

使用道具 举报

发表于 前天 16:42 | 显示全部楼层
@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
回复

使用道具 举报

发表于 昨天 18:20 | 显示全部楼层
感谢分享!
回复

使用道具 举报

发表于 8 小时前 | 显示全部楼层
纯支持~帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-3-19 21:49

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表