题目:[分享][讨论]段落重定向方式改进
文/523066680
blog: http://hi.baidu.com/523066680
首发于:
www.cn-dos.net/forum ...
以下就段落重定向方式改进而论。
我认为其中内容多不为人所知,因尝发一帖"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 时 开始下一个文件或退出。
如何让内容与文件名对应? 干脆直接用文件名做标签。
实际例子可参考 这个"少人问津" 的帖子:批处理分段重定向例子
和:批处理脚本打包工具
www.cn-dos.net/forum ...
缺点: 虽然开始用type 读取,但后面生成时是用 For结合echo的,空行会被干掉。
例如一些特效代码的后面有一些符号组成的图是有空行的,就会被....
还好我的批处理作品没有要命的空行,所以经常用这个工具来给自己某时期的作品做备份.
[
Last edited by 523066680 on 2008-12-27 at 17:40 ]