![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-01 21:15 |
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,279 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 统计文本文件的字符个数 |
| 可打印版本 4,217 / 31 |
| 第16楼 bat-zw | 发表于 2008-04-25 22:11 |
| 金牌会员 发帖 1,276 积分 3,105 | |
计算setlocal最大递归层(为32层):可能有人会有这样的疑问: 不执行endlocal行不行。。 在显示了32后就会提示:setlocal已到最大递归层,而在echo !str!下面加上endlocal就不会有这个提示了。 [ Last edited by zw19750516 on 2008-4-25 at 10:14 PM ] |
|
| 第17楼 bjsh | 发表于 2008-04-25 22:24 |
| 银牌会员 发帖 621 积分 2,000 | |
|
受10楼兄弟的启发, 下面这个代码即可统计 不必产生临时文件,
而且也 发现了 把变量传递回来的好办法。 很聪明的一个办法。。。 主要在两点。。 1) 让 set /a total+=n 脱离 循环的区域 但又被执行到 原因是为了避免 在for中 没执行前的命令行扫描 即将 n 替换掉 2)endlocal&&set /a total+=n 很聪明的做法 也是传递回来的根本原因所在 因为在一行。。。 所以 命令行 会对整体进行扫描 因为扫描时还没有执行endlocal, n 的值仍然存在, 而对其的替换恰发生在此时 扫描完毕后 真正执行时,endlocal 后 还原回原来的环境变量表, 但是 set /a total+=n 在扫描后 n 被替换为一个确定的值, 因此n的值通过total 被传递回原来的环境表量表 刚好利用了 扫描替换变量和执行的时间差。。 注意一定要在同一行, endlocal set /a total+=n 分开写, 第二行则永远是零了。。 [ Last edited by bjsh on 2008-4-26 at 11:27 AM ] |
|
| 第18楼 plp626 | 发表于 2008-04-25 22:37 |
| 银牌会员 发帖 1,020 积分 2,278 | |
2)endlocal&&set /a total+=n 这个是函数常用的格式: 有参函数: 详细这个帖子: http://www.cn-dos.net/forum/viewthread.php?tid=38969&fpage=1 既然版主都来了,相比能给这个帖子提些建设性的意见..... 我在做这方面的工作,一个人太累, |
|
| 第19楼 pusofalse | 发表于 2008-04-25 22:58 |
| 银牌会员 发帖 646 积分 1,604 | |
Originally posted by bjsh at 2008-4-25 10:24 PM: |
|
| 第20楼 26933062 | 发表于 2008-04-25 23:03 |
| 银牌会员 发帖 879 积分 2,268 | |
|
回复 17 楼
最开始也是采用这种方法,但实际上是不行的, 不信把a.txt内容超过32行,同样会提示 以达到最大递归层, 并且在末位 echo !total! 同样有结果,说明 延迟变量还是开启的. 在返回call主程序之前endlocal 好像并不能结束延迟变量 endlocal&set /a w+=n 这种方法好像在for中无效,也就是在()中无效,所以在10楼,先跳出for即可. [ Last edited by 26933062 on 2008-4-25 at 11:09 PM ] |
|
| 第21楼 dreamseed | 发表于 2008-04-25 23:47 |
| 初级用户 发帖 10 积分 38 来自 GZ | |
| 第22楼 bjsh | 发表于 2008-04-26 00:09 |
| 银牌会员 发帖 621 积分 2,000 | |
Originally posted by 26933062 at 2008-4-25 11:03 PM: 确实。。。 setlocal 和 endlocal 必须得在一个 块 内。。 还真得就这么写了。。 回复 19楼。。 出错 也是 因为这个原因了。。 更改了源代码了。。 [ Last edited by bjsh on 2008-4-26 at 11:25 AM ] |
|
| 第23楼 bjsh | 发表于 2008-04-26 00:15 |
| 银牌会员 发帖 621 积分 2,000 | |
Originally posted by plp626 at 2008-4-25 10:37 PM: |
|
| 第24楼 bat-zw | 发表于 2008-04-26 10:26 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
我来说两句,不对请指正: &&我们知道要原样输出文本如a.txt内容最好的方法就是使用type:
@type a.txt&pause>nul 那么bjsh版主在8楼总结出的代码,是不是可以把findstr改为type,一来可以提高代码效率,二来还可以简化代码(不足之处是会忽略以";"号打头的行): 测试文本如下(用版主的测试提示找不到操作数): [ Last edited by zw19750516 on 2008-4-26 at 11:20 AM ] |
|
| 第25楼 26933062 | 发表于 2008-04-26 11:00 |
| 银牌会员 发帖 879 积分 2,268 | |
|
回 24 楼
for /f "delims=" %%i in ('type x.txt') do set 会忽略分号开头的行 对文档字符,字节进行详细统计,含特殊字符 a.txt 内容 |
|
| 第26楼 bat-zw | 发表于 2008-04-26 11:14 |
| 金牌会员 发帖 1,276 积分 3,105 | |
Originally posted by 26933062 at 2008-4-26 11:00: |
|
| 第27楼 bjsh | 发表于 2008-04-26 11:25 |
| 银牌会员 发帖 621 积分 2,000 | |
Originally posted by zw19750516 at 2008-4-26 10:26 AM: 呵呵 找不到操作数 是我忘了空行的情况 其实用 findstr 而不用type 当初也是因为这空行 空行时, 因为n没定义, 导致 endlocal 后的 set /a 报错 说 没有操作数: 在 setlocal enabledelayedexpansion 后加一句 set /a n=0 即可。 已修正。。 |
|
| 第28楼 bjsh | 发表于 2008-04-26 11:32 |
| 银牌会员 发帖 621 积分 2,000 | |
|
效率么。。 确实很差。。
用批处理来写 就是写这么个算法。 不适合真正拿来用。。 字符处理 是 cmd 的一个瓶颈。。 最好还是用其他的方式来解决。。 用最适合的方式解决最适合的问题。。 |
|
| 第29楼 bat-zw | 发表于 2008-04-26 13:39 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
严重同意版主的意见!!!
|
|
| 第30楼 09wind | 发表于 2010-01-10 12:34 |
| 新手上路 发帖 1 积分 1 | |
|
.
. . . 为什么要end local 啊 不关闭也可以执行啊。 @echo off& mode con cols=40 lines=10& setlocal enabledelayedexpansion& color 9f (if "%~1"=="" (echo 把文件托到这里,然后按个回车: set /p wind_F=)else set wind_F=%~1)& cls for /f "tokens=1* delims=:" %%1 in ('findstr /n ".*" "%wind_F%"')do (set "wind=%%2"& set /a LN=0,snow=%%1 if not defined wind (set /a wind_E+=1)else call :smile) echo 共%snow%行 %TAT%个字符 if defined wind_E echo 其中包含%wind_E%个空行 pause 1>nul&& exit :smile if defined wind (set wind=!wind:~1!&& set /a LN+=1&& goto :smile)else set /a TAT+=LN |
|
| 上一页 1 2 3 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |