![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-01 21:16 |
共 48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,249 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [分享][讨论]段落重定向方式改进 |
| 可打印版本 1,743 / 14 |
| 第1楼 523066680 | 发表于 2008-12-27 17:25 |
| 银牌会员 发帖 1,133 积分 2,362 | |
|
[分享][讨论]段落重定向方式改进 题目:段落重定向方式改进
文/523066680 blog: http://hi.baidu.com/523066680 首发于:http://www.cn-dos.net/forum/viewthread.php?tid=45409&fpage=1 以下就段落重定向方式改进而论。 我认为其中内容多不为人所知,因尝发一帖"xxx",而少人问津,观者xx人,今日又见 一"新鲜"技巧,故稍作整理,愿与各位分享。 这一"新鲜"技巧说来其实不新鲜,是在 "批处理集合.rar" 里面看到的(看来这方法很早就有了), 只是看了这么多2008年的大家的作品,好像都没出现,估计也是"失传"了... 贴出代码如下(不知其原帖在何处...): 提取一下,就是类似 (echo,a echo,b echo,c)>x.x 这个代码相对于"经典"的 echo,a>x.x echo,b>>x.x echo,c>>x.x 或者说 >x.x echo,a >>x.x echo,b >>x.x echo,c 好处在于,比前者直观,比 前者 后者 都节省代码,但是"当段落很长"的时候,一长串的echo,仍 让人疲倦...要不然就写个批处理专门处理这个东西.... 这些方法都有的缺点是,遇到特殊字符时总要用^转义,多了非常麻烦。(看了一些batch炸药,作者好像很辛苦....) 所以以上方式一般适用于比较简短的段落。 当然,对于长一点的段落,大家都是放到批文件结尾处,算出在第几行,前面一句 type %0 |more +n >x.x 直接搞定。 好处在于: 代码简单,省去了一长串的echo, 和>>x.x 。对于特殊字符,不用挨个地加 ^ 了... 小小的缺点: 要计算那个内容在第几行开始,主要还是之后编辑代码时要注意行数。 估计大家都想到的改进方式: 给这个段落前面做一个记号(例如 ::act),然后用for 结合findstr 读得这个记号所在行数,然后用一句 type %0 |more +%行数% >x.x 代码简单,编写其他部分代码时也不用顾忌行数的问题。 但是有一件事做不到 - 重定向多个文件时,把不同的段落重定向给不同的文件 我认为前面提到的 "标记" 可以解决这个问题,例如: ::1 内容1 ::1 end ::2 内容2 ::2 end 用for 逐行读取自身 当出现 标记 时,后面内容开始重定向,标记 end 时 开始下一个文件或退出。 如何让内容与文件名对应? 干脆直接用文件名做标签。 实际例子可参考 这个"少人问津" 的帖子:批处理分段重定向例子 和:批处理脚本打包工具 http://www.cn-dos.net/forum/viewthread.php?tid=44620&fpage=1&highlight=%2B523066680 缺点: 虽然开始用type 读取,但后面生成时是用 For结合echo的,空行会被干掉。 例如一些特效代码的后面有一些符号组成的图是有空行的,就会被.... 还好我的批处理作品没有要命的空行,所以经常用这个工具来给自己某时期的作品做备份. [ Last edited by 523066680 on 2008-12-27 at 17:40 ] |
|
| 第2楼 tireless | 发表于 2008-12-27 20:36 |
| 银牌会员 发帖 1,122 积分 2,025 | |
|
谢谢提醒!
知道可以这样用,就是写代码时常常忘记这样用- - 在看这个帖子之前我也想起了这个东西,想起了我上一个回复的帖子里用的是: >a.txt echo ... >>a.txt echo ... ... |
|
| 第3楼 BC | 发表于 2008-12-27 21:24 |
| 中级用户 发帖 175 积分 338 | |
|
比较认同用more的方法,要养成习惯啊!
|
|
| 第4楼 HAT | 发表于 2008-12-28 00:26 |
| 版主 发帖 5,017 积分 9,023 | |
|
从来不用more的方法,可读性差,不利于维护。
|
|
| 第5楼 BC | 发表于 2008-12-28 09:52 |
| 中级用户 发帖 175 积分 338 | |
Originally posted by HAT at 2008-12-28 12:26 AM: 但是如果有大量的内容要输入呢?hat兄有何妙方? |
|
| 第6楼 HAT | 发表于 2008-12-28 20:56 |
| 版主 发帖 5,017 积分 9,023 | |
|
不知道你说的大量的内容要输入是啥意思,能否举个例子?(最好是跟实际工作有关系的,我对花花架子没兴趣:)
|
|
| 第7楼 BC | 发表于 2008-12-28 22:07 |
| 中级用户 发帖 175 积分 338 | |
|
re: hat
就是像exist同学那样,要将一个批处理的代码输出到另一个当中,应该如何做呢? |
|
| 第8楼 HAT | 发表于 2008-12-28 22:45 |
| 版主 发帖 5,017 积分 9,023 | |
|
Re 7楼 我会选择echo,不会选择more,原因见4楼。
|
|
| 第9楼 BC | 发表于 2008-12-28 22:47 |
| 中级用户 发帖 175 积分 338 | |
|
但是遇上比较长而且有许多特殊符号有怎么办呢?
|
|
| 第10楼 HAT | 发表于 2008-12-28 22:49 |
| 版主 发帖 5,017 积分 9,023 | |
|
Re 9楼 实际工作中没有遇到这样的需求,即使遇到,我宁可选择转义,也不会选择more
|
|
| 第11楼 BC | 发表于 2008-12-28 23:03 |
| 中级用户 发帖 175 积分 338 | |
|
从来不用more的方法,可读性差,不利于维护。
维护差的原因是当修改代码后要改动吗? 我觉得找个好点的IDE,应该都有行号可显示的. [ Last edited by BC on 2008-12-28 at 23:05 ] |
|
| 第12楼 HAT | 发表于 2008-12-29 02:00 |
| 版主 发帖 5,017 积分 9,023 | |
|
Re 11楼 1、代码比较长的时候,自己维护起来很头痛
2、即使代码短,别人维护起来头痛的要命 |
|
| 第13楼 523066680 | 发表于 2008-12-31 18:05 |
| 银牌会员 发帖 1,133 积分 2,362 | |
|
hat 说的对的,需要则用,况且很多时候是看情况而定的
特殊情况特殊对待,有时更省力 所以有感觉以前去做 一些前辈们 的题目有些"吃力不讨好了“ 我根本遇不上的东西。 [ Last edited by 523066680 on 2009-1-1 at 11:03 ] |
|
| 第14楼 523066680 | 发表于 2009-01-21 22:55 |
| 银牌会员 发帖 1,133 积分 2,362 | |
|
~ for 的代码也不会太长~
这个没经过测试的 for /f %%a in (x.x) do ( if "yes"=="yes" echo,%%a>>x2.x if "%%a"==":ok" set "yes=yes" ) |
|
| 第15楼 netbenton | 发表于 2009-01-23 02:01 |
| 银牌会员 发帖 752 积分 1,916 来自 广西 | |
|
call rifile xxx1 %0
call rifile xxx2 %0 ... goto :eof :rifile for /f "delims=:" %%a in ('findstr /n :%1 %2') do set sk=%%a for /f "skip=%sk% tokens=*" %%a in ('findstr .* %2') do if "%%a"=="@end" goto :eof&echo.%%a>>%1 goto :eof :xxx1 要写的内容 @end :xxx2 第二个要写的内容 @end ...... [ Last edited by netbenton on 2009-1-23 at 02:03 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |