中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 18:06
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论][NT]计算字符串长度批处理代码查错
楼 主 [讨论][NT]计算字符串长度批处理代码查错 发表于 2006-03-30 12:07 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线

@echo off
:began
set /p mystr=输入要计算长度的字符串:
echo %mystr:~0,1% | findstr /i "q" 1>nul 2>nul && exit rem 输入q退出

call :bflen "%mystr%" rem 这两句调用bflen,返回长度到变量ret中。
echo 字符串: "%mystr%"
echo 长 度: %ret%

goto began

:bflen rem 真麻烦,初始化要单独拿出来。
set num=
set str=
set ret=
set str=%1
:len rem 计算字符串长度
set str=%str:~0,-1%
set /a num = %num% + 1
if defined str goto len
set /a ret = %num% - 2
set num=
goto :eof


请帮忙测试一下bflen以后有什么漏洞,或者优化改进一下。
本来准备自己测试的,不过想想人多力量大,而且刚好willsort也在,所以就贴出来请大家帮忙看看。主要用途是获取字符串长度,从标号bflen开始,如果测试成功以后在批处理中就可以直接引用而不用再花时间去写了。

[ Last edited by willsort on 2006-5-22 at 12:37 ]
2 发表于 2006-03-30 15:24 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re 3742668:

程序的退出语句有些缺陷,会导致以q起始的所有字符串均无法测得长度。另外,感觉取串长的算法效率有些低,最初改用echo串至文件再取文件长度的算法。但是它也存在无法测出某些含有特殊字符串长的兼容性问题,所以改成现在的算法。

测试案例:
command
command>nul
"command>nul"
command"com


@echo off & setlocal EnableExtensions
:began
set mystr=
set /p mystr=输入要计算长度的字符串(直接回车退出):
if not defined mystr goto :eof
call :strlen
echo 字符串: "%mystr%"
echo 长 度: %strlen%
goto began

:strlen rem 计算字符串长度
set strlen=
echo "%mystr%">_strlen.tmp
for %%f in (_strlen.tmp) do set strlen=%%~zf
set /a strlen=strlen-4
goto :eof



@echo off & setlocal EnableDelayedExpansion
:began
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 began
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
3 发表于 2006-03-30 16:44 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
先谢了
不过可能是我没说清楚,我的本意是把取字符串长度的那部分做成一个类似函数的东东,然后在别的批处理中可以直接拷贝后调用。呵呵,积累多了以后也好偷懒。
如果我现在另外写个批处理的话我就可以直接把我的bflen标号以后的语句直接拷贝过去然后用call调用。
4 发表于 2006-12-17 05:53 ·  中国 浙江 杭州 电信
中级用户
★★
积分 305
发帖 85
注册 2005-05-23 00:00
UID 39004
性别 男
状态 离线
二楼的代码2每次都要算1000次,效率太慢了啊?
5 发表于 2006-12-17 07:29 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  不会的,只会执行字符串长度数的次数就跳出来了,请注意 && goto :_endfor 这一句。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
6 发表于 2007-02-18 20:30 ·  中国 广东 深圳 福田区 电信
初级用户
积分 27
发帖 11
注册 2006-03-16 07:21
UID 52148
状态 离线
收藏嘻嘻
7 发表于 2007-03-02 00:35 ·  IANA 局域网IP(Private-Use)
初级用户
积分 34
发帖 13
注册 2006-07-20 19:11
UID 58929
性别 男
状态 离线
代码2也有问题,如果包括中文也只视为1个字节
8 发表于 2007-03-02 00:40 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
Originally posted by skyearth at 2007-3-1 11:35:
代码2也有问题,如果包括中文也只视为1个字节


这个单纯只的是位数。

vbs直接len(str)……方便
9 发表于 2007-03-02 00:43 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
最大的bug是只能单行。
10 发表于 2007-03-03 03:20 ·  IANA 局域网IP(Private-Use)
初级用户
积分 34
发帖 13
注册 2006-07-20 19:11
UID 58929
性别 男
状态 离线
可能没描述清楚,我是想判断“中英文字符混排”时,用BAT如何得到实际的字节位数,比如:“这是一个test”,如果用代码一,其结果12就是正确的结果,而代码二,其结果就是8,与实际的字节数不一致,这只是字数。

我是在做一个可在原地显示进度信息的脚本,由于汉字的长度不能正确计算,因此,其退格的长度就不好控制,请理解。
论坛跳转: