中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-15 00:24
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]逐行逐字阅读文本的批处理,请高手帮忙完善 精华I 查看 14,325 回复 31
16 发表于 2007-01-19 05:56 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by chainliq at 2006-11-19 19:07:
呵呵,我倒是觉得这个挺有意思的,请问如何修个它的显示速度呢?


  修改它的显示速度可以更改代码中的 ping 语句,可以增加参数-n的值,也可以增加超时参数-w的值,个人而定。
17 发表于 2007-01-19 06:14 ·  中国 北京 方正宽带
新手上路
积分 14
发帖 7
注册 2007-01-19 05:09
19年会员
UID 76975
性别 男
状态 离线
好东西 下来测试下
18 发表于 2007-02-03 00:03 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  lxmxn『第 6 楼』的代码挺不错的,但是有以下缺憾:
  1、因为启用了变量延迟功能,所以,会把文本中的感叹号置换为空;
  2、因为普通for语句忽略以分号打头的行,所以此代码将不能提取这些行的内容;
  3、if 语句中的 :end 并不能被其他语句作为标签来调用,也就是说,其他语句中的goto end部分执行的时候会出错,并不能跳转到这里;
  4、SET A="%1" 中的引号是多余的,因为在call的时候,%1已经被强行赋予了引号,因此会导致 if "%A%"=="" goto end 一句始终得不到执行;

  在这个代码的基础上,得到如下代码:

  版本一:

@echo off
:: 把半角双引号换成空格,把等号换成〓,兼容其他特殊字符
:: 能处理以分号打头的行,但是会忽略空行
:: 能兼容unicode格式的文本
:: 每行之间空一行显示
for /f "delims= eol=" %%i in ('type %1') do (
set "str=%%i"
call set "str=%%str:"= %%"
call :pickup
)
pause
goto :eof

:pickup
ping -n 1 127.1>nul
if "%str:~0,1%"=="=" set "str=〓%str:~1%"
set /p "=%str:~0,1%"<nul
set "str=%str:~1%"
if defined str goto pickup
echo.&echo.
goto :eof

  版本二:

@echo off
:: 与版本一的几点区别:
::   1、不能处理unicode文本
::   2、每行之间不再强行加上空行,并且能原样显示空行
for /f "delims= eol=" %%i in ('findstr /n .* %1') do (
set "str=%%i"
call set "str=%%str:"= %%"
call set "str=%%str:*:=%%"
call :pickup
)
echo.
pause
goto :eof

:pickup
if not defined str echo.&goto :eof
if "%str:~0,1%"=="=" set "str=〓%str:~1%"
set /p "=%str:~0,1%"<nul
ping -n 1 127.1>nul
set "str=%str:~1%"
if defined str goto pickup
echo.
goto :eof


[ Last edited by namejm on 2007-2-2 at 02:06 PM ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
19 发表于 2007-02-03 00:20 ·  中国 吉林 四平 联通
高级用户
★★★
积分 859
发帖 413
注册 2006-08-14 21:55
19年会员
UID 60532
状态 离线
太精彩了,lx和jm全是高人
20 发表于 2007-05-01 23:06 ·  中国 上海 徐汇区 电信
初级用户
积分 94
发帖 40
注册 2007-04-28 22:13
19年会员
UID 86806
性别 男
状态 离线
顶,支持
21 发表于 2007-05-30 11:30 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  根据 最大限度原样输出含特殊字符的指定行内容 这个帖子的讨论成果,得到如下代码,能完美解决特殊字符的原样显示问题,发出来大家测试一下:

@echo off

:: 逐行逐字阅读文本,并且原样显示文本内容
:: ① 为了显示文本的所有内容,使用了for+findstr的句式
:: ② 为了能原样显示文本,使用变量延迟并在合适的位置终止延迟
:: ③ 为了能正确显示引号和等号,在语句 set /p= !str:~0,1!<nul 中,等号后空一格,并使用退格键

for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set "str=%%i"
setlocal enabledelayedexpansion
set str=!str:*:=!
call :pickup
endlocal
)
pause
goto :eof

:pickup
ping -n 1 127.1>nul
if defined str (
set /p= !str:~0,1!<nul
set str=!str:~1!
goto pickup
)
echo.
goto :eof
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
22 发表于 2007-05-30 18:47 ·  中国 广东 广州 黄埔区 电信
中级用户
★★
积分 326
发帖 152
注册 2007-05-04 06:16
19年会员
UID 87412
性别 男
状态 离线
呵呵...个个都是牛人来D....偶也要努力学习ing
23 发表于 2008-01-07 15:54 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
退格键要怎么输入,谁能告诉我啊,谢谢!
24 发表于 2008-01-08 13:51 ·  中国 浙江 温州 电信
初级用户
★★
积分 154
发帖 67
注册 2006-10-31 00:50
19年会员
UID 68933
性别 男
状态 离线
收藏了。。果然经典
25 发表于 2008-01-08 14:31 ·  中国 山东 青岛 联通
初级用户
★★
积分 107
发帖 60
注册 2007-11-07 22:03
18年会员
UID 102010
性别 男
状态 离线
听了版主的提示,直接到21楼,测试,牛人一个!
26 发表于 2008-01-30 20:14 ·  中国 香港 新世界电讯
新手上路
积分 13
发帖 7
注册 2007-10-04 19:44
18年会员
UID 98894
性别 男
状态 离线
都是高手呀!帮顶一个!
27 发表于 2008-03-05 17:46 ·  中国 北京 阿里云BGP数据中心
初级用户
积分 64
发帖 37
注册 2007-03-14 03:38
19年会员
UID 81659
性别 男
状态 离线
都是高手呀!学习下。。。
28 发表于 2008-03-05 23:16 ·  中国 云南 玉溪 电信
新手上路
积分 4
发帖 2
注册 2008-03-05 15:28
18年会员
UID 112100
性别 男
状态 离线
还真是不错啊!
29 发表于 2008-03-20 22:29 ·  中国 湖北 武汉 电信
初级用户
积分 24
发帖 17
注册 2008-03-20 22:07
18年会员
UID 113537
性别 男
状态 离线
可以啊
30 发表于 2008-03-31 07:07 ·  中国 贵州 黔西南布依族苗族自治州 兴义市 电信
初级用户
积分 42
发帖 21
注册 2008-03-31 02:56
18年会员
UID 114505
性别 男
状态 离线
高人,我等佩服得五体投地。收藏了……
论坛跳转: