|  | 
 
| luxiaoming2001 新手上路
 
  
 
 
 
 积分 16
 发帖 5
 注册 2006-11-15
 状态 离线
 |  | 
|  2006-11-15 09:51 |  | 
|  | 
 
| namejm 荣誉版主
 
        batch fan
 
 
 积分 5226
 发帖 1737
 注册 2006-3-10
 来自 成都
 状态 离线
 | 
|  『第 2 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
  以前 willsort 曾经写过这样的代码,发出来你琢磨一下: @echo off & setlocal EnableDelayedExpansion
 :begin
 set mystr=
 set /p mystr=输入要计算长度的字符串(直接回车退出):
 if not defined mystr goto :eof
 for /l %%i in (0,1,1000) do if "!mystr:~%%i,1!"=="" set strlen=%%i && goto :_endfor
 :_endfor
 ::echo 字符串:  "%mystr%"
 echo 长  度:  %strlen%
 set strlen=
 goto begin
 
 
  在这个代码的基础上,可以修改为:
 @echo off
 :begin
 cls
 set mystr=
 set /p mystr=输入要计算长度的字符串(直接回车退出):
 if not defined mystr goto :eof
 set count=0
 setlocal enabledelayedexpansion
 :intercept
 set /a count+=1
 for /f %%i in ("%count%") do if not "!mystr:~%%i,1!"=="" goto intercept
 echo 长  度:  %count%
 pause
 goto begin
 
 
 
 
 
 
 
 |  
                  |  尺有所短,寸有所长,学好CMD没商量。
 考虑问题复杂化,解决问题简洁化。
 |  | 
|  2006-11-15 10:09 |  | 
|  | 
 
| pengfei 银牌会员
 
      
 
 
 积分 1218
 发帖 485
 注册 2006-7-21
 来自 湖南.娄底
 状态 离线
 | 
| 『第 3 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
其实问题并不像vkill兄说的那样简单, 这不单牵涉到引号配对的问题, 还有诸如控制字符等特殊符号的处理.  
经过反复修改下面的代码已经可以处理特殊字符了, 测试暂时没发现错误.
 @echo off
 
 set /p str=请输入字符串:
 
 set "str=%str:"= %"
 
 :next
 
 if not "%str%"=="" (
 
 set /a num+=1
 
 set "str=%str:~1%"
 
 goto next
 
 )
 
 echo 输入的字符数:%num%
 
 pause
 
 
二楼的代码可以不用FOR语句来实现.
 @echo off
 
 set /p str=请输入字符串:
 
 setlocal enabledelayedexpansion
 
 if not defined str goto :eof
 
 :next
 
 if not "!str:~%num%,1!"=="" (
 
 set /a num+=1
 
 goto next
 
 )
 
 echo 输入的字符数:%num%
 
 pause
 
 
 Last edited by pengfei on 2006-11-20 at 11:10 AM ]
 
 
 
 
 |  
                  |  业精于勤而荒于嬉,形成于思而毁于随。
 |  | 
|  2006-11-15 10:18 |  | 
|  | 
 
| lxmxn 版主
 
         
 
 
 积分 11386
 发帖 4938
 注册 2006-7-23
 状态 离线
 |  | 
|  2006-11-15 10:48 |  | 
|  | 
 
| luxiaoming2001 新手上路
 
  
 
 
 
 积分 16
 发帖 5
 注册 2006-11-15
 状态 离线
 |  | 
|  2006-11-15 22:49 |  | 
|  | 
 
| vkill 金牌会员
 
       
 
 
 
 积分 4103
 发帖 1744
 注册 2006-1-20
 来自 甘肃.临泽
 状态 离线
 |  | 
|  2006-11-16 03:50 |  | 
|  | 
 
| namejm 荣誉版主
 
        batch fan
 
 
 积分 5226
 发帖 1737
 注册 2006-3-10
 来自 成都
 状态 离线
 | 
| 『第 7 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
  3F的代码也不失为一种好方法,只是因为 if not "%ii%"=="" 语句的限制,处理英文状态下的引号的时候会出错,如果字符串中可能存在英文状态下的引号的话,建议采用2F的代码。 
 
 
 
 
 |  
                  |  尺有所短,寸有所长,学好CMD没商量。
 考虑问题复杂化,解决问题简洁化。
 |  | 
|  2006-11-16 06:45 |  | 
|  | 
 
| vkill 金牌会员
 
       
 
 
 
 积分 4103
 发帖 1744
 注册 2006-1-20
 来自 甘肃.临泽
 状态 离线
 | 
| 『第 8 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by namejm at 2006-11-16 06:45:3F的代码也不失为一种好方法,只是因为 if not "%ii%"=="" 语句的限制,处理英文状态下的引号的时候会出错,如果字符串中可能存在蠮..
 
可以换个别的了,像 if not %ii%*==* ,当然也可以换个很特殊的,三种方法其实都是一种思路,呵呵
 
 Last edited by vkill on 2006-11-16 at 07:05 AM ] 
 
 
 
 |  | 
|  2006-11-16 07:03 |  | 
|  | 
 
| pengfei 银牌会员
 
      
 
 
 积分 1218
 发帖 485
 注册 2006-7-21
 来自 湖南.娄底
 状态 离线
 | 
| 『第 9 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by vkill at 2006-11-16 07:03:
 可以换个别的了,像 if not %ii%*==* ,当然也可以换个很特殊的,三种方法其实都是一种思路,呵呵
 
 Last edited by vkill on 2006-11-16 at 07:05 AM ]
 
vkill兄这样处理遇到的问题会更多, 如果输入特殊字符就无法处理了. 
 
其实这个错误是引号配对引起的, 我们可以先去掉引号再来判断, 代码更新在3楼. 
 
 
 
 
 |  
                  |  业精于勤而荒于嬉,形成于思而毁于随。
 |  | 
|  2006-11-20 09:00 |  | 
|  | 
 
| electronixtar 铂金会员
 
        
 
 
 
 积分 7493
 发帖 2672
 注册 2005-9-2
 状态 离线
 | 
|  『第 10 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
@echo off
 set /p a=
 echo :%a%>tmp.bat
 echo set /a r=%%~z0-21>>tmp.bat
 call tmp.bat
 echo %r%
 pause > nul
 del tmp.bat
 
 
本人不擅长写批处理,大家多多批评哈 
 
 
 
 
 
 
 |  
                  |  
 C:\>BLOG http://initiative.yo2.cn/
 C:\>hh.exe ntcmds.chm::/ntcmds.htm
 C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
 |  | 
|  2006-11-20 09:23 |  | 
|  | 
 
| pengfei 银牌会员
 
      
 
 
 积分 1218
 发帖 485
 注册 2006-7-21
 来自 湖南.娄底
 状态 离线
 | 
| 『第 11 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
electronixtar兄真不错啊, 想到利用文件大小来判断, 但这样依然存在特殊字符处理的问题. 如果输入管道命令就会出错. 
 
 
 
 
 |  
                  |  业精于勤而荒于嬉,形成于思而毁于随。
 |  | 
|  2006-11-20 09:54 |  | 
|  | 
 
| redtek 金牌会员
 
       
 
 
 
 积分 2902
 发帖 1147
 注册 2006-9-21
 状态 离线
 | 
| 『第 12 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
精彩~~electronixtar兄的这个~z玩得可是真好玩~:)
 欣赏!这方法虽 “另类” 但绝对让人眼前一亮~:)
 
 而且写放tmp.bat文件后 “set /a r=%~z0-21” 本身占16个字符,
 还有一个首行的 “:” 标签(这样用户输入的内容会被当做标签,哈哈),这个占1个字符,
 还有echo写入时的多余的一行回车换行符2个,
 和首行写入(所占的回车换行符)2 个,
 一共是 21 ,
 所以 %~z0(文件自身的长度)还要减去21就是刚被用户所输入的长度~:)
 真是精心计算啊~:)
 
 Last edited by redtek on 2006-11-19 at 09:27 PM ]
 
 
 
 
 
 |  
                  |  Redtek,一个永远在网上流浪的人……
 
 _.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
 |  | 
|  2006-11-20 10:21 |  | 
|  | 
 
| wchy2006 新手上路
 
  
 
 
 
 积分 2
 发帖 1
 注册 2006-10-25
 来自 陕西省西安市
 状态 离线
 | 
| 『第 13 楼』:
 请教electronixtar:set /a r=%%~z0-21 是什么意思?
 
使用 LLM 解释/回答一下 
 
 
我刚开始学习批处理,对您帖子中的  set /a r=%%~z0-21  这行代码不明白,请指教,多谢拉! 
 
 
 
 |  | 
|  2006-11-20 10:41 |  | 
|  | 
 
| electronixtar 铂金会员
 
        
 
 
 
 积分 7493
 发帖 2672
 注册 2005-9-2
 状态 离线
 | 
| 『第 14 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
其实偶没有考虑那么多。现随便减了个15,发现相差6,于是就减了个21,完毕。并没有精心计算。 
 
 
 
 
 |  
                  |  
 C:\>BLOG http://initiative.yo2.cn/
 C:\>hh.exe ntcmds.chm::/ntcmds.htm
 C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
 |  | 
|  2006-11-20 10:45 |  | 
|  | 
 
| pengfei 银牌会员
 
      
 
 
 积分 1218
 发帖 485
 注册 2006-7-21
 来自 湖南.娄底
 状态 离线
 | 
|  『第 15 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
利用文件大小判断字符数, 代码改进一下, 可处理特殊字符. 同时, 3楼的代码都已经通用, 目前测试暂时没有发现错误. @echo off
 
 set /p str=请输入字符串:
 
 set "str=%str:"= %"
 
 >str.txt set /p "auto=%str%"<nul
 
 call :go str.txt
 
 echo 输入的字符数:%size%
 
 del str.txt
 
 pause >nul
 
 exit
 
 :go
 
 set size=%~z1
 
 goto :eof
 
 
 
 
 Last edited by pengfei on 2006-11-20 at 11:07 AM ]
 
 
 
 
 
 
 |  
                  |  业精于勤而荒于嬉,形成于思而毁于随。
 |  | 
|  2006-11-20 10:50 |  |