找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: wxcute

[ 新手练习 4 ] 批处理计算字符串长度

[复制链接]
发表于 2009-3-4 22:40:46 | 显示全部楼层
我还是看看别人的吧,我太菜了
发表于 2009-3-26 23:45:13 | 显示全部楼层

回复 4楼 的帖子

法四中
for /f "tokens=1 delims=:" %%i in ('findstr /o .* a.txt') do set /a length=%%i-2&if not %%i  equ 0 echo 共有%length%个字符&goto end
应该是一行,估计网页原因,显示为两行,所以我觉得是不是%length% 改为!length!
如不对,请指正!
发表于 2017-1-17 16:56:38 | 显示全部楼层
  1. @echo off
  2. set str=123ABC上中下
  3. set /a n=0
  4. :loop
  5. set str=%str:~0,-1%
  6. if  "%str%" neq "" (set /a n+=1 & goto loop)
  7. echo 这个字符串是%n%位数 & pause>nul
复制代码
发表于 2017-1-17 20:16:15 | 显示全部楼层
回复 12# batman
  1. @echo off
  2. set n=12345689
  3. set n=%n%;
  4. for /f "tokens=1 delims=:" %%1 in ('^(echo %n:;=^&echo.%^)^|findstr  /o ".*"')do set /a c=%%1-3
  5. echo %c%
  6. pause
复制代码
不用临时文件
发表于 2017-2-15 10:59:01 | 显示全部楼层
  1. @echo off
  2. set str=123ABC上中下
  3. :loop
  4. set /a a+=1
  5. set str=%str:~0,-1%
  6. if "%str%"=="" (echo %a%&pause>nul ) else goto loop
复制代码
发表于 2017-3-9 22:17:32 | 显示全部楼层
本帖最后由 taofan712 于 2017-3-10 16:26 编辑

  1. @echo off
  2. set "var=qwertyuioplkjhgfdsazxcvbnm"
  3. call :strLen var long
  4. echo;%long%
  5. pause&exit /b
  6. :strLen

  7. (   SETLOCAL ENABLEDELAYEDEXPANSION
  8.     set "str=A!%~1!"
  9.     set "len=0"
  10.     for /L %%A in (12,-1,0) do (
  11.         set /a "len|=1<<%%A"
  12.         for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"
  13.     )
  14. )
  15. ( ENDLOCAL
  16.     IF "%~2" NEQ "" SET /a %~2=%len%
  17. )
  18. goto :eof
复制代码
很偏门,但很好用,不忍独享,文件出处http://www.it1352.com/328587.html
发表于 2017-3-10 13:51:12 | 显示全部楼层
回复 21# taofan712

最好标明出处,方便看到的朋友系统学习。如果是你没记出处,就是你的问题了。
http://www.bathome.net/thread-11799-1-1.html
结合帖子中设置为一个变量调用的思路,也试着把这种方式写成一行试试

  1. @echo off & setlocal enabledelayedexpansion
  2. set "_strlen=set $=#^!$^!&set ##=&for /l %%a in (12,-1,0)do set/a"##^|^=1^<^<%%a"&for %%b in (^!##^!)do if ^!$:~%%b^!.==. set /a"##^&^=~1^<^<%%a""

  3. for %%i in (
  4.         12345678901234567890123456789012345678901234567890
  5.         1234567890123456789012345678901234567890
  6.         123456789012345678901234567890
  7.         12345678901234567890
  8.         1234567890
  9.         1
  10. ) do (
  11.         set "$=%%i" & (%_strlen%)
  12.         echo;!##! : %%i
  13. )

  14. pause & exit /b
复制代码
发表于 2017-3-15 21:40:48 | 显示全部楼层
参变量的最少个数为1,最少循环次数也为1,思路清晰了,也挺好写的
发表于 2017-5-14 14:44:17 | 显示全部楼层
本帖最后由 老刘1号 于 2017-5-14 14:57 编辑

8086ASM(DEBUG版)

  1. Echo off&CLS
  2. IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
  3.         echo DEBUG和8086_ASM不支持64位的系统。
  4.         Pause&Exit
  5. )
  6. >"%Tmp%\DEBUGASM.TMP" (
  7. Echo        A
  8. Echo                MOV        BX,20                ;一段安全的空间
  9. Echo                MOV        SS,BX
  10. Echo                MOV        SP,80                ;清理安全空间
  11. Echo                MOV        CX,40                ;循环次数(HEX)=清理字节数(128B)/入栈大小(2B)
  12. Echo                SUB        BX,BX                ;清空BX
  13. Echo                PUSH        BX                ;执行入栈(清理)
  14. Echo                LOOP        10D                ;循环压栈
  15. Echo                SUB        CX,CX                ;清空CX
  16. Echo                INT        21H
  17. Echo.&Echo        G)
  18. Set /P str=Input a string:
  19. Echo E20:0 "%STR%">>"%Tmp%\DEBUGASM.TMP"
  20. More +25 "%~0" >>"%Tmp%\DEBUGASM.TMP"
  21. For /f "Tokens=2" %%a in (
  22.         '^<%tmp%\DEBUGASM.TMP DEBUG^|Findstr /c:"0020:0000"'
  23. ) Do Set /a Strlen=0x%%a
  24. DEL %tmp%\DEBUGASM.TMP
  25. Echo %Strlen%&Pause&Exit /b
  26. A100
  27.         MOV        BX,20                ;一段安全的空间
  28.         MOV        DS,BX
  29.         SUB        BX,BX                ;清空BX
  30.         MOV        CL,[BX]                ;获取Ascii
  31.         JCXZ        10E                ;判断是否为NUL并跳出
  32.         INC        BX                ;计数
  33.         JMP        107                ;循环读取
  34.         MOV        [0],BX                ;将字符串长度写入内存
  35.         INT        21H

  36. G
  37. D20:0 0
  38. Q
  39. Q
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 厉害

查看全部评分

发表于 2017-5-14 17:39:09 | 显示全部楼层
回复 24# 老刘1号
超过65个字符就不行。
发表于 2017-5-20 18:50:22 | 显示全部楼层
回复 25# happy886rr


    峰值为71个
DEBUG一行就那么长...
发表于 2017-5-20 22:05:21 | 显示全部楼层
回复 26# 老刘1号
很棒,71个够用了,一般太长的都直接C语言解决。
发表于 2017-5-21 13:23:35 | 显示全部楼层
回复 27# happy886rr


    感谢鼓励,
新版本出炉,峰值达到255个
用法: Batname <String>
继续学习汇编~~

  1. @Echo off
  2. IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
  3.         echo DEBUG和8086_ASM不支持64位的系统。
  4.         Pause&Exit
  5. )
  6. Set "Str=%*"
  7. >%tmp%\DEBUGASM.TMP (
  8.         ECHO A20:0
  9.                 ECHO DB "%Str:~,70%"
  10.                 ECHO DB "%Str:~70,70%"
  11.                 ECHO DB "%Str:~140,70%"
  12.                 ECHO DB "%Str:~210,45%"
  13.                 ECHO DB 0
  14.         ECHO.
  15.         MORE +20 "%~0"
  16. )
  17. For /f "Tokens=2" %%a in (
  18.         '^<%tmp%\DEBUGASM.TMP DEBUG^|Findstr /c:"0020:0000"'
  19. ) Do Set /a Strlen=0x%%a 2>nul
  20. Echo %Strlen%&DEL /F %tmp%\DEBUGASM.TMP&Exit /b
  21. A100
  22.         MOV        BX,20                ;一段安全的空间
  23.         MOV        DS,BX
  24.         SUB        BX,BX                ;清空BX
  25.         MOV        CL,[BX]                ;获取Ascii
  26.         JCXZ        10E                ;判断是否为NUL并跳出
  27.         INC        BX                ;计数
  28.         JMP        107                ;循环读取
  29.         MOV        [0],BX                ;将字符串长度写入内存
  30.         INT        21H

  31. G
  32. D20:0 0
  33. Q
  34. 老刘制作~
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 666太牛了

查看全部评分

发表于 2017-5-21 14:56:39 | 显示全部楼层
回复 28# 老刘1号
255个已经够用了。再长的批处理自己也能计算。
发表于 2018-7-23 21:14:19 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. ::%1  字符串
  4. set str=%1

  5. set strLen=0
  6. :StartLoop
  7. if  "%str%"==""  goto EndLoop
  8. set str=!str:~1!
  9. set /a strLen+=1
  10. goto StartLoop
  11. :EndLoop

  12. echo %1 length is !strLen!
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 19:16 , Processed in 0.011822 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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