楼 主
发现一个得到字符串长度的方法
发表于 2007-12-31 17:59 · 中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564 发帖 1,127 注册 2006-12-25 22:57 UID 74552 性别 男
状态 离线
命令如下:
(echo string&echo.)|findstr /o ".*"
批处理中应用:
set/p x=input:
for /f "skip=1 delims=:" %%i in ('^(echo "%x%"^&echo.^)^|findstr /o ".*"') do set/a l=%%i-5
echo %l%
pause
[
Last edited by everest79 on 2008-1-1 at 12:06 AM ]
第 2 楼
发表于 2007-12-31 18:21 · 中国 北京 鹏博士BGP
银牌会员
★★★
积分 2,098 发帖 566 注册 2007-09-11 07:27 UID 97070 性别 男
状态 离线
会产生临时文件:
echo string>t&for %a in (t) do set/a z=%~za-2&del t
第 3 楼
发表于 2007-12-31 18:49 · 中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564 发帖 1,127 注册 2006-12-25 22:57 UID 74552 性别 男
状态 离线
嗯,方法有很多,主要是刚发现findstr的/o参数作用,记得原来有个专门总结这个的贴子,找不到了
第 4 楼
发表于 2007-12-31 21:17 · 中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023 发帖 5,017 注册 2007-05-31 19:39 UID 89899 性别 男
状态 离线
学习
发现字符串以重定向符号结束时代码会出错
只要把%x%加上双引号就行了
第 5 楼
发表于 2007-12-31 21:27 · 中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564 发帖 1,127 注册 2006-12-25 22:57 UID 74552 性别 男
状态 离线
第 6 楼
发表于 2007-12-31 22:31 · 中国 四川 泸州 联通
高级用户
★★★
积分 609 发帖 374 注册 2006-08-02 22:38 UID 59720
状态 离线
请问一下:
为什么?
楼 主 的测试方法比实际的要多 2 ???
第 2 楼 的测试方法比实际的要少 2 ???
参数 /a 有什么用????
第 7 楼
发表于 2007-12-31 22:38 · 中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023 发帖 5,017 注册 2007-05-31 19:39 UID 89899 性别 男
状态 离线
The /A switch specifies that the string to the right of the equal sign
is a numerical expression that is evaluated. The expression evaluator
is pretty simple and supports the following operations, in decreasing
order of precedence:
第 8 楼
发表于 2008-01-01 00:08 · 中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564 发帖 1,127 注册 2006-12-25 22:57 UID 74552 性别 男
状态 离线
这个字符偏移好像是包括换行与回车还有什么的,所以在ansi文本中每行多两个字节,在内存中多三具
set /a 是表示后边的为数字表达式,你可以理解为四则运算
第 9 楼
发表于 2008-01-01 12:16 · 中国 上海 联通
版主
★★★★★
积分 9,023 发帖 5,017 注册 2007-05-31 19:39 UID 89899 性别 男
状态 离线
我觉得多出来的那个3就是:行结束符、回车符、换行符。
不知道理解的对不对?
第 10 楼
发表于 2008-01-03 06:29 · 中国 湖北 武汉 电信
新手上路
★
积分 10 发帖 5 注册 2008-01-03 04:31 UID 107528 性别 男
状态 离线
第 11 楼
发表于 2008-01-07 02:43 · 中国 广东 深圳 电信
初级用户
★
蝙蝠侠是写批处理的人
积分 54 发帖 24 注册 2008-01-04 20:34 UID 107683 性别 男
状态 离线
这个方法可以,但是我试了一下,发现这方法比逐个字符判断要慢很多...
SETLOCAL ENABLEDELAYEDEXPANSION
SET "TMPITEM=Hello World!"
:: FINDSTR /O法,添加了空判断以适应TMPITEM=空的情况
ECHO !TIME!
IF DEFINED TMPITEM (
FOR /F "skip=1 delims=:" %%I IN ('^(echo "%TMPITEM%"^&echo.^)^|findstr /o ".*"') DO (
SET /A "TMPITEM_LEN = %%I - 4"
)
) ELSE (
SET "TMPITEM_LEN=0"
)
ECHO !TIME!
ECHO %TMPITEM_LEN%
:: 逐个字符计数法
SET "TMPITEM_LEN=0"
ECHO !TIME!
IF DEFINED TMPITEM (
:GetLenLoop
SET "TMPTMP=!TMPITEM:~%TMPITEM_LEN%,1!" && SET /A "TMPITEM_LEN += 1" && GOTO :GetLenLoop
)
ECHO !TIME!
ECHO !TMPITEM_LEN!
ENDLOCAL
FINDSTR /o 法在我的机器上一般要80~100ms,而逐个字符计数法一般是<10ms~20ms左右。可能是因为FINDSTR毕竟是外部命令调用的缘故吧。
[
Last edited by BatMan on 2008-1-7 at 03:04 AM ]
第 12 楼
发表于 2008-01-07 10:17 · 中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687 发帖 1,467 注册 2005-08-08 12:00 UID 44210
状态 离线
Originally posted by BatMan at 2008-1-7 02:43:
这个方法可以,但是我试了一下,发现这方法比逐个字符判断要慢很多...
SETLOCAL ENABLEDELAYEDEXPANSION
SET "TMPITEM=Hello World!"
:: FINDSTR /O法 ...
FINDSTR /O 好处是可以判断双字节字符,在单双字节字符窗口中排版很有用
第 13 楼
发表于 2008-01-07 13:47 · 中国 广东 深圳 电信
初级用户
★
蝙蝠侠是写批处理的人
积分 54 发帖 24 注册 2008-01-04 20:34 UID 107683 性别 男
状态 离线
Originally posted by zh159 at 2008-1-7 10:17:
FINDSTR /O 好处是可以判断双字节字符,在单双字节字符窗口中排版很有用
原来如此...
我用"世界你好Hello World!"来测试,FINDSTR /O报的是字节数,而逐字符计算则得到字符数,明白楼上的意思了。
但是发现个新问题...如果测试字符串稍改为"世界你好!Hello World!",则Hello World前后的!号在变量延迟扩展时会被视作特殊符号而导致最终结果错误。用%号也会有类似的情况。这问题有解决方案吗?
论坛跳转:
— 请选择 —
站务公告 & 版主讨论
意见反馈 & 网友交流
DOS学习入门 & 精彩文章 (教学室)
DOS疑难解答 & 问题讨论 (解答室)
DOS启动盘 & LOGO技术 (启动盘室)
DOS批处理 & 脚本技术(批处理室)
DOS媒体世界 & 网络技术 (多媒体室)
DOS汉化世界 & 中文系统 (中文化室)
DOS开发编程 & 发展交流 (开发室)
DOS软件下载 & 游戏分享 (下载室)
GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区
其它操作系统综合讨论区
WinPE、PowerShell及其它命令行系统专区
贴图灌水、文学娱乐专区
网络日志(Blog)
论坛回收站
├ 链接失效,待修正