[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
也想过类似的思路,但是当时思维惯性,只想到了二分回溯补位,并没有用变量偏移,一墙之隔啊,可惜当时没想这么深入,呵呵。

TOP

本帖最后由 zm900612 于 2011-4-9 09:26 编辑

我的想法:
  1. @echo off
  2. set "$=%1"
  3. setlocal enabledelayedexpansion
  4. set len=8192
  5. (for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do (
  6. set /a len-="%%a!$:~%%a,1!"||set $=!$:~%%a!
  7. ))2>nul
  8. echo %len%
  9. ::未考虑字符串包含数字、特殊字符的情况
复制代码
稍加改进后仍然难以克服特殊字符的难关:
  1. @echo off
  2. set "$=%1"
  3. setlocal enabledelayedexpansion
  4. set len=8192
  5. (for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do (
  6. set /a len-="%%a*^!(1-1!$:~%%a,1!)"||set $=!$:~%%a!
  7. ))2>nul
  8. echo %len%
  9. pause
  10. ::不惧怕数字了,但是仍然没有办法在set /a中很好地转义特殊字符,看来要想通用,那个if是不能省的了
复制代码

TOP

本帖最后由 CrLf 于 2014-8-5 23:15 编辑

回复 13# wankoilz


    看来个人有个人的习惯写法,我比较倾向用其他手段代替补位,这样可以兼容最长的变量(除了 , 这个变态的变量名),不过代码就稍显冗长了:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 8189) do set s=!s!;
  3. call :strlen s len
  4. echo len=%len%
  5. pause&exit/b
  6. :strlen <stringVarName> [retvar]
  7. :: 思路: 二分回溯联合查表法
  8. :: 说明: 所求字符串大小范围 0K ~ 8K;
  9. ::    stringVarName ---- 存放字符串的变量名
  10. ::    retvar      ---- 接收字符长度的变量名
  11. setlocal enabledelayedexpansion&set $=!%1!&set N=0
  12. if defined $ (
  13. for %%a in (4095 2047 1023 511 255 127 63 31 15)do if !$:~%%a!. NEQ . set/aN-=~%%a&set $=!$:~%%a,-1!
  14. set $=!$!fedcba987654321&set/aN+=0x!$:~15,1!
  15. )
  16. endlocal&If %2. neq . (set %2=%N%)else echo %N%
复制代码

TOP

回复 16# xxpinqz


    他应该是回复14楼的...

TOP

本帖最后由 CrLf 于 2018-8-5 21:02 编辑

回复 28# nwm310


    挺好的思路
    把变量拆分成7份分别查询,就可以查8191字符长度内的所有变量了

TOP

返回列表