Board logo

标题: [游戏娱乐] 批处理文本阅读器 [打印本页]

作者: zhouyongjun    时间: 2009-6-5 13:53     标题: 批处理文本阅读器

在论坛混了这么久,第一次在原创板块发帖,而且代码跟高手们的比起来还真是汗颜,可真是进步缓慢啊。来批处理之家前只是在百度上对一些简单命令有一点点了解,刚进来什么都不懂。在这里我要感谢batman,可以说是他引我入门的,他跟我一样不是学计算机的,但是我很佩服他的技术。那时候天天缠着他问问题,耽误了他不少时间。
之前也写过一些自认为实用性的东西,但是总感觉写的太差劲,不敢贴出来,有时工作忙也没心思去弄。贴这个代码出来主要希望大家指点几个问题:
1.for /f处,我是call调用:loop对每行进行处理,但是这样会发现文章很长时到后面速度会变慢很多。开始我把loop段嵌套到for里面通过goto跳转,但是for处理完一行就会跳出循环。不知道有什么好的解决办法不?
测试代码:
  1. @echo off
  2. for /f "%_skip% delims=" %%i in ('findstr /n ".*" 1.txt') do (
  3.     set "var=%%i"&set/a line+=1
  4.     setlocal enabledelayedexpansion
  5.     title 第!line!段(右击暂停,CTRL+C停止)
  6.     set "var=!var:*:=!"
  7. :loop
  8.     set/a n+=1&set "str1=!str!"
  9.     call,set "str=%%var:~0,!n!%%"
  10.     if "!str!" equ "!str1!" goto next
  11.     set/p=!str!<nul
  12.     if !n! equ 25 set/a n=0&set "var=!var:~25!"&echo\&echo\
  13.     if not defined var goto next
  14.     for /l %%a in (1,1,50) do set/p=<nul
  15.     for /l %%b in (1,1,100) do ver>nul
  16.     goto loop
  17. :next
  18.     echo\&echo\&endlocal
  19. )
  20. pause
复制代码
2.还存在部分特殊字符的组合不能正确显示
3.我想产生一个ini配置文件,规定一个格式来将文件添加到列表,记录历史记录(阅读到的行数、速度、位置等信息),方案想到了,但是会对配置文件反复进行写入操作(每行一次),不知会不会硬盘损耗厉害。
下面是我的代码:
  1. @echo off
  2. title 文本阅读器(右击暂停,CTRL+C停止)
  3. color 1f&mode con cols=50 lines=30
  4. echo.&echo.&echo.&echo.
  5. set/p file= 请把要阅读的文本拖入窗口:
  6. echo.&set/p m= 开始阅读位置*段(直接回车默认从头开始):
  7. if defined m (set/a m-=1&call,set "_skip=skip=%%m%%")
  8. echo.&set/p speed= 速度(直接回车默认速度为100;数值越小速度越快):
  9. if not defined speed set speed=100
  10. cls&set "line=%m%"
  11. for /f "%_skip% delims=" %%i in ('findstr /n ".*" %file%') do (
  12.     set "var=%%i"&set/a line+=1
  13.     setlocal enabledelayedexpansion
  14.     title 第!line!段(右击暂停,CTRL+C停止)
  15.     set "var=!var:*:=!"
  16.     if defined var call :loop
  17.     echo\&echo\&endlocal
  18. )
  19. echo\&echo               本文完!!!
  20. ping /n 3 127.1 >nul
  21. exit
  22. :loop
  23. set/a n+=1&set "str1=!str!"
  24. call,set "str=%%var:~0,!n!%%"
  25. if "!str!" equ "!str1!" goto :eof
  26. set/p=!str!<nul
  27. if !n! equ 25 set/a n=0&set "var=!var:~25!"&echo\&echo\
  28. if not defined var goto :eof
  29. for /l %%a in (1,1,50) do set/p=<nul
  30. for /l %%b in (1,1,%speed%) do ver>nul
  31. goto loop
复制代码

作者: 随风    时间: 2009-6-5 14:52

说说你的第一个代码
论坛早有讨论过,在for内部使用标签是一种不“健康”的代码,真正设计合理的代码是不需要在for内部使用标签的,而且测试你的代码只能循环1.txt的第一行,应该也是标签导致的吧?
call 在for中使用会很影响代码效率,具体的搜索下论坛有关“效率”方面的帖子,里面的讨论应该对你有所帮助。
另:你的代码应该可以不用call和goto来完成的。(只是猜想,未测试 ^_^)
参考下这个帖的12楼
http://www.bathome.net/viewthrea ... p;extra=&page=1
作者: batman    时间: 2009-6-5 19:08     标题: 以前在cn-dos写的:

  1. @echo off&color 9f&mode con lines=15
  2. title txt/bat文件阅读器
  3. cls
  4. echo.&echo.&echo.&echo.&echo.
  5. echo                            txt\bat文件阅读器
  6. ping /n 2 127.1 >nul
  7. cls
  8. color 90
  9. echo.&echo.&echo.&echo.&echo.
  10. echo                 THE CODE IS FOR NAMEJM AND MADE BY ZW19750516
  11. ping /n 4 127.1 >nul&color 9f
  12. :begin
  13. cls
  14. echo.&echo.&echo.&echo.&echo.
  15. set a=1
  16. set /p a=请将要阅读的txt或bat文件拖放到这里:
  17. cls
  18. echo.&echo.&echo.&echo.&echo.
  19. if "%a%"=="1" echo            没有发现要阅读的文件,请返回正确操作。&ping /n 3 127.1 >nul&goto begin
  20. cls
  21. for /f "delims=" %%i in ('findstr /n .* "%a%"') do (
  22.     set "str=%%i"
  23.     setlocal enabledelayedexpansion
  24.     set str=!str:*:=!
  25.     call :pickup
  26.     endlocal
  27. )
  28. cls
  29. echo.&echo.&echo.&echo.&echo.
  30. echo                      阅读完毕,请按任意键退出。                              
  31. pause >nul
  32. goto :eof
  33. :pickup
  34. ping -n 1 127.1>nul
  35. if defined str (
  36.     set /p= !str:~0,1!<nul
  37.     set str=!str:~1!
  38.     goto pickup
  39. )
  40. echo.
复制代码

作者: zhouyongjun    时间: 2009-6-5 19:54

batman后面输出部分我以前也常用,到这里我怎么使用这个笨办法了,看来是钻进死胡同不知变通了。
我那样效率确实低了很多,还要考虑每行字符数。
作者: zhouyongjun    时间: 2009-6-5 20:44

set /p= !str:~0,1!<nul
前面留个空格又给退回去,这不多此一举吗,难道有什么特殊用途?
set /p=!str:~0,1!<nul,直接这样没发现什么不可以啊。。。
作者: batman    时间: 2009-6-5 23:37

set /p= !str:~0,1!<nul是为了处理"="字符,汗,自己都忘记了,幸亏jm提醒。
作者: zhouyongjun    时间: 2009-6-5 23:43     标题: 回复 6楼 的帖子

谢谢,我拿那个特殊符号集测试了下,没有空格加退格键会出错。
作者: jianrendubu    时间: 2009-6-6 18:29

还不错哦,不过还是有很多的不足--加油啊——————
作者: PakTC    时间: 2009-6-8 13:36

回想到以前的一个 搞笑开机,是利用vbs的stdout(好像是)在cmd上输出的
优点:延时准确,占用系统资源不高,不怕特殊字符。

又因为cmd方便的窗口,所以非常期待一个vbs混合bat做的文本阅读器

    建议用bat 读取当前目录的文本,赋予编号,然后给出菜单
供读者挑选,这样就更方便了。
作者: zljzsmzzx    时间: 2009-6-10 13:21

学习了。。。。。。。。。。。
作者: ynkm0871    时间: 2009-7-4 09:13

下来学习一下,很好的呢!
作者: mayaju    时间: 2009-7-5 20:18

xuexile
hhhhhh
作者: styledream    时间: 2009-8-21 23:29

很有用的东西~~~
值得学习~~~




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2