中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-03 05:41
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何简写输出指定多行文本的批处理 查看 1,680 回复 15
楼 主 [已结]如何简写输出指定多行文本的批处理 发表于 2007-09-13 17:30 ·  中国 江西 抚州 电信
中级用户
★★
积分 220
发帖 99
注册 2005-08-16 01:08
20年会员
UID 41691
状态 离线
我想指定输出一个文本的第1、13、14、15、16、17、18、19、20、21、22行,如下批处理可以实现,但是代码复杂,请问如何简写!谢谢!

for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "1"=="%%i" echo %%j>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "13"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "14"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "15"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "16"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "17"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "18"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "19"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "20"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "21"=="%%i" echo %%j>>2.txt
)
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "22"=="%%i" echo %%j>>2.txt
)

[ Last edited by hbby on 2007-9-15 at 09:23 PM ]
2 发表于 2007-09-13 17:43 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
sed q AUTOEXEC.BAK>2.txt
sed -n "13,22p" AUTOEXEC.BAK>>2.txt
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
3 发表于 2007-09-13 17:46 ·  中国 江西 抚州 电信
中级用户
★★
积分 220
发帖 99
注册 2005-08-16 01:08
20年会员
UID 41691
状态 离线
老大,不想用SED有办法吗?谢谢
4 发表于 2007-09-13 17:55 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
这样呢?
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
if "%%i" equ "1" echo %%j>2.txt
if "%%i" geq "13" if "%%i" leq "22" echo %%j>>2.txt
)
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
5 发表于 2007-09-13 18:04 ·  中国 江西 抚州 电信
中级用户
★★
积分 220
发帖 99
注册 2005-08-16 01:08
20年会员
UID 41691
状态 离线
对了,老大,我的原文件是
@ECHO OFF
GOTO %CONFIG%
:RECOVER
PATH C:\DOSTOOLS;C:\DOSTOOLS\COMMAND
SET TEMP=C:\DOSTOOLS\TEMP
LH DOSTOOLS\COMMAND\DOSKEY
LH DOSTOOLS\COMMAND\MOUSE
LH DOSTOOLS\SMARTDRV.EXE
C:\DOSTOOLS\GHOST -CLONE,MODE=PLOAD,SRC=D:\GHOSTSYS\SYSTEM.GHO:1,DST=1:1 -SURE -RB
GOTO END

:BACKUP
PATH C:\DOSTOOLS;C:\DOSTOOLS\COMMAND
SET TEMP=C:\DOSTOOLS\TEMP
LH DOSTOOLS\COMMAND\DOSKEY
LH DOSTOOLS\COMMAND\MOUSE
LH DOSTOOLS\SMARTDRV.EXE
IF NOT EXIST D:\GHOSTSYS\NUL MD D:\GHOSTSYS
C:\DOSTOOLS\GHOST -Z9 -CLONE,MODE=PDUMP,SRC=1:1,DST=D:\GHOSTSYS\SYSTEM.GHO -SURE -FX
ATTRIB +A +S +H +R D:\GHOSTSYS
WIN /Z
REBOOT
GOTO END

:TOOLS
SET EXPAND=YES
SET DIRCMD=/O:N
SET LGLDRV=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
SET LGLDRV=%LGLDRV% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
CALL DOSTOOLS\SETRAMD.BAT %LGLDRV%
PATH %RAMD%:\DOSTOOLS;%RAMD%:\DOSTOOLS\COMMAND;%CDROM%:\
MKDIR %RAMD%:\DOSTOOLS
MKDIR %RAMD%:\DOSTOOLS\COMMAND
DOSTOOLS\COMMAND\ATTRIB -A -S -H -R \COMMAND.COM
COPY COMMAND.COM %RAMD%:\>NUL
DOSTOOLS\COMMAND\ATTRIB +A +S +H +R \COMMAND.COM
COPY DOSTOOLS\*.* %RAMD%:\DOSTOOLS>NUL
COPY DOSTOOLS\COMMAND\*.* %RAMD%:\DOSTOOLS\COMMAND>NUL
MKDIR %RAMD%:\DOSTOOLS\TEMP
SET TEMP=%RAMD%:\DOSTOOLS\TEMP
SET TMP=%RAMD%:\DOSTOOLS\TEMP
LH DOSTOOLS\COMMAND\DOSKEY
LH DOSTOOLS\COMMAND\MOUSE
LH DOSTOOLS\COMMAND\MSCDEX /D:ECSCD003 /E
LH DOSTOOLS\SMARTDRV.EXE
SET COMSPEC=%RAMD%:\COMMAND.COM
SET CDROM=
SET LGLDRV=

:END

用您的批处理结果为
@ECHO OFF
GOTO %CONFIG%
PATH C:\DOSTOOLS;C:\DOSTOOLS\COMMAND
SET TEMP=C:\DOSTOOLS\TEMP
LH DOSTOOLS\COMMAND\DOSKEY
LH DOSTOOLS\COMMAND\MOUSE
LH DOSTOOLS\SMARTDRV.EXE
IF NOT EXIST D:\GHOSTSYS\NUL MD D:\GHOSTSYS
C:\DOSTOOLS\GHOST -Z9 -CLONE,MODE=PDUMP,SRC=1:1,DST=D:\GHOSTSYS\SYSTEM.GHO -SURE -FX
ATTRIB +A +S +H +R D:\GHOSTSYS
WIN /Z
REBOOT

多出了一行GOTO %CONFIG%
能再看看吗?谢谢

[ Last edited by hbby on 2007-9-13 at 07:14 PM ]
6 发表于 2007-09-13 20:13 ·  中国 湖北 武汉 电信
中级用户
★★
积分 471
发帖 207
注册 2007-05-03 14:53
19年会员
UID 87369
性别 男
状态 离线
命令行执行:
for /f "delims=: tokens=1*" %a in ('findstr /n .* a.txt^|findstr "^1: ^13 ^14 ^15 ^16 ^17 ^18 ^19 ^20 ^21 ^22" ') do @echo\%b>>2.txt
7 发表于 2007-09-13 21:44 ·  中国 新疆 克孜勒苏柯尔克孜自治州 电信
新手上路
积分 4
发帖 2
注册 2007-01-27 12:39
19年会员
UID 77858
性别 男
状态 离线
我是来学习的
8 发表于 2007-09-13 22:24 ·  中国 浙江 嘉兴 电信
新手上路
积分 6
发帖 3
注册 2007-09-13 21:53
18年会员
UID 97323
性别 男
状态 离线
学习学习,真是牛人
9 发表于 2007-09-14 09:59 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
set/p kk=<AUTOEXEC.BAK&call echo %%kk%%>2.txt
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do if %%i geq 13 if %%i leq 22 echo %%j>>2.txt
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
10 发表于 2007-09-14 10:36 ·  中国 江西 抚州 电信
中级用户
★★
积分 220
发帖 99
注册 2005-08-16 01:08
20年会员
UID 41691
状态 离线
老大就是厉害!已经解决!谢谢!
但是还存在问题
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do if %%i geq 13 if %%i leq 32 echo %%j>>2.txt
如果到从13行到32行,在其中有个:tool,“:”这个特殊符号不能被导出!能再看看吗?谢谢

[ Last edited by hbby on 2007-9-14 at 10:50 AM ]
11 发表于 2007-09-14 10:44 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
to hbby
ThinKing的代码很简洁,正则表达式也是你应该掌握的技巧。我只是用另一种思路来完成罢了。
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
12 发表于 2007-09-14 11:09 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
Originally posted by hbby at 2007-9-14 10:36:
老大就是厉害!已经解决!谢谢!
但是还存在问题
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do if %%i geq 13 if %%i leq 32 echo %%j>>2.txt
...

以findstr /n 列出行数,就是以冒号为分隔符的,要想处理,一定要多写代码,所以建议还是用sed吧。很简单的,有空你可以学习一下。
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
13 发表于 2007-09-15 15:42 ·  中国 江西 抚州 电信
中级用户
★★
积分 220
发帖 99
注册 2005-08-16 01:08
20年会员
UID 41691
状态 离线
Originally posted by ccwan at 2007-9-14 11:09:

以findstr /n 列出行数,就是以冒号为分隔符的,要想处理,一定要多写代码,所以建议还是用sed吧。很简单的,有空你可以学习一下。

除了用SED就真的没有其他办法吗?各位高手再帮忙想想办法吧!谢谢大家!
14 发表于 2007-09-15 20:04 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set /a mn=%%i 2>nul
set "m=%%i"
setlocal enabledelayedexpansion
set m=!m:*:=!
if !mn! LSS 2 echo.!m!>test2.txt
if !mn! GEQ 13 if !mn! LEQ 22 echo.!m!>>test2.txt
endlocal

[ Last edited by terse on 2007-9-17 at 10:41 AM ]
15 发表于 2007-09-15 21:13 ·  中国 江西 抚州 电信
中级用户
★★
积分 220
发帖 99
注册 2005-08-16 01:08
20年会员
UID 41691
状态 离线
Originally posted by terse at 2007-9-15 20:04:
r /f "delims=" %%i in ('findstr /n .* test.txt') do (
set /a mn=%%i 2>nul
set "m=%%i"
setlocal enabledelayedexpansion
set m=!m:*:=!
...

楼上的兄弟,没看明白,能写完整吗?谢谢!
论坛跳转: