中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-08 10:33
47,811 主题排行 / 349,895 发帖 / 今日 0 篇 / 48,253 会员排行
DOS批处理 & 脚本技术(批处理室) » 读取源文件内容并输出至其他文件时如何保留空行
可打印版本  1,709 / 15
第1楼 wingofsea 发表于 2008-04-25 17:54
初级用户 发帖 34 积分 124
读取源文件内容并输出至其他文件时如何保留空行
需求是:
读取a.txt文件的内容, 并输出至b.txt.
a.txt 的内容如下:
[1111]:
[2222]

:[333]
[44444]

[5555]

666

请注意,.a.txt中包含了 : ] 等 字符, 在本论坛search了一下,没有找到一个reasonable solution,请教各位大牛,多谢
第2楼 pusofalse 发表于 2008-04-25 18:38
银牌会员 发帖 646 积分 1,604
^_^
先用findstr读取出行数,包括空行,然后 echo.!str!>>b.txt

for /f "delims=" %%a in ('findstr /n .* a.txt') do (
set str=%%a
setlocal enabledelayedexpansion
set str=!str:*:=!
echo.!str!>>b.txt
)
pause

[ Last edited by pusofalse on 2008-4-25 at 06:44 PM ]
第3楼 naughtypack 发表于 2008-04-25 20:22
初级用户 发帖 25 积分 68
学习一下,呵呵,高手啊
第4楼 bat-zw 发表于 2008-04-25 20:22
金牌会员 发帖 1,276 积分 3,105
pusofalse进步很快啊,继续加油哈,
其实没其它要求的话还是这个最方便:
l

[ Last edited by zw19750516 on 2008-4-25 at 08:26 PM ]
第5楼 106942397 发表于 2008-04-25 20:29
初级用户 发帖 15 积分 29
学习一下,学习一下
第6楼 bjsh 发表于 2008-04-25 23:48
银牌会员 发帖 621 积分 2,000
Originally posted by pusofalse at 2008-4-25 06:38 PM:
先用findstr读取出行数,包括空行,然后 echo.!str!>>b.txt

for /f "delims=" %%a in ('findstr /n .* a.txt') do (
set str=%%a
setlocal enabledelayedexpansion
...


改成这个
for /f "delims=" %%a in ('findstr /n .* a.txt') do (
set str=%%a
setlocal enabledelayedexpansion
set str=!str:*:=!
echo.!str!>>b.txt
endlocal
)
pause

不然文件一大 就导致 setlocal 递归过大。。
第7楼 pusofalse 发表于 2008-04-25 23:53
银牌会员 发帖 646 积分 1,604
Originally posted by bjsh at 2008-4-25 11:48 PM:


改成这个
for /f "delims=" %%a in ('findstr /n .* a.txt') do (
set str=%%a
setlocal enabledelayedexpansion
set str=!str:*:=!
echo.!str!>>b.txt

是!多谢指正!原本要写上的,但我看着a.txt中只有那几行。。。 而没有考虑代码通用性,我一贯的不足啊~
另外请教一下,把setlocal放在for之前和for之内有什么区别吗? 除了在for之内要用endlocal终止延迟之外~

[ Last edited by pusofalse on 2008-4-25 at 11:55 PM ]
第8楼 wingofsea 发表于 2008-04-28 18:48
初级用户 发帖 34 积分 124
谢啦,同问setlocal 的问题,放到循环外边跟里边的区别在哪?
第9楼 nipo 发表于 2008-04-29 00:32
中级用户 发帖 106 积分 228
放到循环里边是结束FOR语句的setlocal enabledelayedexpansion,放到外边就结束以上的所有SETLOCAL。

如果在此FOR语句以上还有SETLOCAL,放到外边就都结束了,你下边的环境设置就全变了。
第10楼 pusofalse 发表于 2008-04-29 00:36
银牌会员 发帖 646 积分 1,604
Originally posted by nipo at 2008-4-29 12:32 AM:
放到循环里边是结束FOR语句的setlocal enabledelayedexpansion,放到外边就结束以上的所有SETLOCAL。

如果在此FOR语句以上还有SETLOCAL,放到外边就都结束了,你下边的环境设置就全变了。

貌似有点没看懂我问的意思 我是问setlocal放循环里和循环外有何区别,并不是endlocal放里和放外有何区别。。。但同样谢谢你~!
第11楼 nipo 发表于 2008-04-29 00:39
中级用户 发帖 106 积分 228
呵呵,答非所问是吗?

道理其实不都一样吗?放到循环外相当于设置全局变量,放到里面,只是局部变量。起作用的范围不同。
第12楼 bat-zw 发表于 2008-04-29 00:40
金牌会员 发帖 1,276 积分 3,105
运行下面两段代码,你就能理解有什么区别了:

第13楼 pusofalse 发表于 2008-04-29 00:42
银牌会员 发帖 646 积分 1,604
Originally posted by zw19750516 at 2008-4-29 12:40 AM:
运行下面两段代码,你就能理解有什么区别了:
第14楼 nipo 发表于 2008-04-29 00:49
中级用户 发帖 106 积分 228
咱们一起学习吧(不包括zw19750516,他是老师)

http://www.cn-dos.net/forum/viewthread.php?tid=21322

http://www.cn-dos.net/forum/viewthread.php?tid=25570&fpage=0&highlight=&page=2

[ Last edited by nipo on 2008-4-29 at 01:00 AM ]
第15楼 pusofalse 发表于 2008-04-29 01:00
银牌会员 发帖 646 积分 1,604
Originally posted by nipo at 2008-4-29 12:49 AM:
咱们一起学习吧(不包括zw19750516,他是老师)

http://www.cn-dos.net/forum/viewthread.php?tid=21322

[ Last edited by nipo on 2008-4-29 at 12:50 AM ]

我也这样觉得
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023