中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [分享][讨论]段落重定向方式改进
作者:
标题: [分享][讨论]段落重定向方式改进 上一主题 | 下一主题
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『楼 主』:  [分享][讨论]段落重定向方式改进

题目:[分享][讨论]段落重定向方式改进
文/523066680
blog:  http://hi.baidu.com/523066680
首发于:http://www.cn-dos.net/forum/viewthread.php?tid=45409&fpage=1

    以下就段落重定向方式改进而论。
我认为其中内容多不为人所知,因尝发一帖"xxx",而少人问津,观者xx人,今日又见
一"新鲜"技巧,故稍作整理,愿与各位分享。

这一"新鲜"技巧说来其实不新鲜,是在 "批处理集合.rar" 里面看到的(看来这方法很早就有了),
只是看了这么多2008年的大家的作品,好像都没出现,估计也是"失传"了...
    贴出代码如下(不知其原帖在何处...):
@echo off
:: 建立回收站
:: Recycle位置可以随意放置,名字也可随便取
:: 如果在某个分区里建了多个带回收站功能的文件夹,那么它们指向的都是同一个位置
md %drv%:\Recycle>nul 2>nul
attrib +s +h %drv%:\Recycle>nul 2>nul
(echo [.ShellClassInfo]
echo CLSID={645FF040-5081-101B-9F08-00AA002F954E})>C:\tmp
copy c:\tmp %drv%:\Recycle\desktop.ini>nul 2>nul
del c:\tmp>nul 2>nul
attrib +s +h %drv%:\Recycle\desktop.ini
提取一下,就是类似
(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/view ... hlight=%2B523066680
    缺点: 虽然开始用type 读取,但后面生成时是用 For结合echo的,空行会被干掉。

例如一些特效代码的后面有一些符号组成的图是有空行的,就会被....

还好我的批处理作品没有要命的空行,所以经常用这个工具来给自己某时期的作品做备份.

[ Last edited by 523066680 on 2008-12-27 at 17:40 ]

   此帖被 +4 点积分        点击查看详情   
评分人:【 BC 分数: +4  时间:2008-12-27 21:23




综合型编程论坛

我的作品索引
  
2008-12-27 17:25
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 2 楼』:  

谢谢提醒!

知道可以这样用,就是写代码时常常忘记这样用- - 在看这个帖子之前我也想起了这个东西,想起了我上一个回复的帖子里用的是:

>a.txt echo ...
>>a.txt echo ...
...

2008-12-27 20:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 3 楼』:  

比较认同用more的方法,要养成习惯啊!



C:\
C:\Del BC
2008-12-27 21:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

从来不用more的方法,可读性差,不利于维护。



2008-12-28 00:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by HAT at 2008-12-28 12:26 AM:
从来不用more的方法,可读性差,不利于维护。

但是如果有大量的内容要输入呢?hat兄有何妙方?



C:\
C:\Del BC
2008-12-28 09:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  

不知道你说的大量的内容要输入是啥意思,能否举个例子?(最好是跟实际工作有关系的,我对花花架子没兴趣:)



2008-12-28 20:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 7 楼』:  

re: hat

就是像exist同学那样,要将一个批处理的代码输出到另一个当中,应该如何做呢?



C:\
C:\Del BC
2008-12-28 22:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  Re 7楼

我会选择echo,不会选择more,原因见4楼。



2008-12-28 22:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 9 楼』:  

但是遇上比较长而且有许多特殊符号有怎么办呢?



C:\
C:\Del BC
2008-12-28 22:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 10 楼』:  Re 9楼

实际工作中没有遇到这样的需求,即使遇到,我宁可选择转义,也不会选择more



2008-12-28 22:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 11 楼』:  

从来不用more的方法,可读性差,不利于维护。

维护差的原因是当修改代码后要改动吗?

我觉得找个好点的IDE,应该都有行号可显示的.

[ Last edited by BC on 2008-12-28 at 23:05 ]



C:\
C:\Del BC
2008-12-28 23:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 12 楼』:  Re 11楼

1、代码比较长的时候,自己维护起来很头痛
2、即使代码短,别人维护起来头痛的要命



2008-12-29 02:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 13 楼』:  

hat 说的对的,需要则用,况且很多时候是看情况而定的
特殊情况特殊对待,有时更省力

所以有感觉以前去做  一些前辈们   的题目有些"吃力不讨好了“
我根本遇不上的东西。

[ Last edited by 523066680 on 2009-1-1 at 11:03 ]



综合型编程论坛

我的作品索引
  
2008-12-31 18:05
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 14 楼』:  ~

for 的代码也不会太长~
这个没经过测试的
for /f %%a in (x.x) do (
   if "yes"=="yes" echo,%%a>>x2.x
   if "%%a"==":ok" set "yes=yes"
)



综合型编程论坛

我的作品索引
  
2009-1-21 22:55
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 15 楼』:  

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 ]

   此帖被 +15 点积分         点击查看详情   
评分人:【 523066680 分数: +15  时间:2016-9-27 10:09




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-23 02:01
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: