标题: [其他] 给批处理“打包” [打印本页]
作者: 523066680 时间: 2008-11-22 15:59 标题: 给批处理“打包”
给当前批处理“打包”
代码如下:- @echo off
- ::批处理给当前其他批处理打包,通过修改的话还能扩展很多功能.利用了一些特效中的技巧.
- ::blog hi.baidu.com/523066680
- ::made by 523066680@cn-dos.net 和bbs.bathome.net
- set pname=SetupBat.bat
- for %%a in (*.bat) do (
- if not "%%a"=="%~nx0" (
- if not "%%a"=="%pname%" (call,set file="%%a" %%file%%)
- )
- )
- echo,@set file=%file%>"%pname%"
- set "act="
- ::重定向 执行部分
- for /f "delims= eol=" %%a in (%~snx0) do (
- if "%%a"=="::%pname% end" (goto :next)
- if defined act echo,%%a>>"%pname%"
- if "%%a"=="::%pname%" set act=act
- )
- :next
- ::- - - - - - -重定向内容 - - - - - - - -
- for %%a in (*.bat) do (
- if not "%%a"=="%~nx0" (
- if not "%%a"=="%pname%" (
- echo,::%%a>>"%pname%"
- type "%%a">>"%pname%"
- echo,>>"%pname%"
- echo,::%%a end>>"%pname%"
- )
- )
- )
- ::- - - - - - - - - - - - - - - - - - - -//重定向结束//
- if not exist %~sdp0tempfolder (md %~sdp0\tempfolder)
- move "%pname%" "%~sdp0tempfolder\"
- exit
- ::SetupBat.bat
- @echo off
- for %%a in (%file%) do (call :setup %%~a)
- exit
- :setup
- set "act="
- for /f "delims= eol=" %%a in (%~nx0) do (
- if "%%a"=="::%* end" (goto :eof)
- if defined act echo,%%a>>"%*"
- if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
- )
- ::SetupBat.bat end
复制代码
它可以干什么呢?可以给当前除本身以外的批处理打包(改改的话其他文本类文件也行)
生成一个SetupBat.bat 在tempfolder文件夹内
在另一个文件夹里双击它(以防出错),就会把之前“打包”的批处理全都解放出来,就像是解压缩一样。
优点:使用上个帖子 批处理分段重定向 (节省echo版) 的原理,生成的时候不会存在echo,结合>>出现的特殊字符问题。
不用慢慢测试然后加转义字符^了,更不用一长串地echo,x>x.x了
1我的观点:
a.当作备份使用,把自己经典的批处理打包起来,就合成了一个文件,然后可以很方便的存放,上传到网络上,
发表文章,这些都可以作为备份方式.
b.以文本形式上传/发表的话就更容易复制/粘贴代码.
c.可以通过打包再打包的方法实现分类打包功能,例如我自己做了一个:5230综合.bat 里面包含有三个子包裹
5230应用类.bat 5230视觉类.bat 5230数值计算类.bat 这几个包裹打开后生成各自包括的批处理作品。
2延展:这个版本的我没做太多功能,不过我认为还可以做成:
a.由用户指定 生成某个文件(段落),生成在哪个文件夹里.
b.如果拿来做坏事也是可怕的。
c.利用这个批处理的性质,还可以很方便的给每个打包后的批处理增加一个文件头信息,例如制作者的信息
或者把SetupBat.bat代码设置成可以由用户设置在文件的开头加上什么注释。
也相当于完成一些批量的操作呢。
d.可以改成对多类文本、脚本的。更深点,能完成这样的功能:
把所有脚本、文本文件以及其位置记录起来,类似压缩目录树,再解压缩一样.而重定向并不会影响其他文件.
当然用batch做这个事儿总怕在符号上有风险。
…………………等等等等
以下是我的批处理集合打包的例子:(是对原来的帖子进行的修正……有一些没发过的作品)
http://bbs.bathome.net/viewthread.php?tid=1627&highlight=%2B523066680
依然可能受到批评,不管怎样 谢谢网站给我这样一个空间。
作者: 523066680 时间: 2008-11-22 16:07
发现本人啰唆榜上no.1……
把自己作品复合一看……我也有30k的代码了啊
估计我不会再有比BatchGreedSnake更灵活的作品了,就此止步,读书,压得我喘不过气来。
如果有权人士发现我的帖子主题没有写分类 或者不符合,希望能帮我加上,网吧电脑有点问题。
不行就把帖子去了吧。我还有几个帖子发的很不对,希望能给它删了。
原来cn-dos能发这么长的代码
http://www.cn-dos.net/forum/viewthread.php?tid=44620&pid=312294&page=1&sid=vnjU0C#pid312294
[ 本帖最后由 523066680 于 2008-11-22 16:42 编辑 ]
作者: BBCC 时间: 2008-11-22 17:41
真够newb的。感谢分享!
作者: BBCC 时间: 2008-11-22 17:42
估计我不会再有比BatchGreedSnake更灵活的作品了,就此止步,读书,压得我喘不过气来。
这话说得有点晦气了吧,期待你的新作品!
作者: Batcher 时间: 2008-11-23 03:06 标题: 回复 2楼 的帖子
请问哪几个帖子发的很不对,希望能给它删了?
作者: 523066680 时间: 2008-11-23 08:32 标题: 回复 5楼 的帖子
http://bbs.bathome.net/viewthrea ... hlight=%2B523066680
我后来发现教程里有这个东西的
http://bbs.bathome.net/viewthrea ... hlight=%2B523066680
这个叫做一起来开根的 希望能转到贴图区。当个分享好了。
作者: Batcher 时间: 2009-3-10 17:45 标题: 回复 6楼 的帖子
涉及到技术的问题,建议还是留在原来的版块好了,说不定以后有人会从中学到知识呢^_^
作者: 523066680 时间: 2009-3-16 08:40 标题: Cn-dos----[分享][讨论]段落重定向方式改进
题目:[分享][讨论]段落重定向方式改进
文/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
[/url]
缺点: 虽然开始用type 读取,但后面生成时是用 For结合echo的,空行会被干掉。
例如一些特效代码的后面有一些符号组成的图是有空行的,就会被....
还好我的批处理作品没有要命的空行,所以经常用这个工具来给自己某时期的作品做备份.
作者: 523066680 时间: 2009-3-16 08:53 标题: 用来方便理解的例子
- @echo off
- for %%a in (test.bat test2.bat) do call :setup %%a
- ::调用函数,%%a代表了标签名 也是重定向文件名
- exit
- :setup
- set "act="
- for /f "tokens=* eol=" %%a in (%~nx0) do (
- if "%%a"=="::%* end" (goto :eof)
- if defined act echo,%%a>>"%*"
- if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
- )
- ::读取本身代码,出现 "::标签" 时开始重定向,"::标签 end"时 结束重定向。
-
- ::test.bat
- @echo off
- echo,这是为了方便理解也给的例子,所以段落比较短
- pause>nul
- ::test.bat end
-
- ::test2.bat
- @echo off
- echo,hi~ I am test2.bat
- pause>nul
- ::test2.bat end
复制代码
作者: 523066680 时间: 2009-7-26 13:37
可以选择脚本类型- @echo off
- ::脚本打包工具 打包文本类型的文件,空行会被去掉
- ::blog hi.baidu.com/523066680
- ::made by 523066680@cn-dos.net 和bbs.bathome.net
-
- :a
- echo,请正确输入。&echo,
- set /p type="请输入将打包的脚本的格式 一种(如 bat,txt...): "
- if not exist "*.%type%" (echo,当前不存在该格式文件 &pause>nul &cls &goto :a)
- set /p name="包裹的名称(如 parcel ,则生成parcel.bat): "
- if exist "tempfolder\%name%.bat" (echo,将对 tempfolder 文件夹中已存在的%name%.bat 进行覆盖 &pause)
-
- set "tempname=thisistempfilename.x"
- if not exist tempfolder (md tempfolder)
- for %%a in (*.%type%) do (
- if not "%%a"=="%~nx0" (
- if not "%%a"=="%tempname%" (call,set file="%%a" %%file%%)
- )
- )
- echo,@set file=%file%>"%tempname%"
- set "act="
-
- ::重定向 执行部分
- for /f "delims= eol=" %%a in (%~snx0) do (
- if "%%a"=="::%tempname% end" (goto :next)
- if defined act echo,%%a>>"%tempname%"
- if "%%a"=="::%tempname%" set act=act
- )
- :next
- ::- - - - - - -重定向内容 - - - - - - - -
- for %%a in (*.%type%) do (
- if not "%%a"=="%~nx0" (
- if not "%%a"=="%tempname%" (
- echo,::%%a>>"%tempname%"
- type "%%a">>"%tempname%"
- echo,>>"%tempname%"
- echo,::%%a end>>"%tempname%"
- )
- )
- )
- ::- - - - - - - - - - - - - - - - - - - -//重定向结束//
- ren "thisistempfilename.x" "%name%.bat"
- move "%name%.bat" "tempfolder\%name%.bat"
- echo,成功生成包裹%name%.bat 在 tempfolder 文件夹中
- pause
- exit
-
- ::thisistempfilename.x
- @echo off
- for %%a in (%file%) do (call :setup %%~a)
- exit
-
- :setup
- set "act="
- for /f "delims= eol=" %%a in (%~nx0) do (
- if "%%a"=="::%* end" (goto :eof)
- if defined act echo,%%a>>"%*"
- if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
- )
- ::thisistempfilename.x end
复制代码
作者: 523066680 时间: 2009-10-26 16:41
vbs版的拉~ 就是要增加注释符号,比较累赘,不过有代码搞成可再利用了。
包裹里有个代码,来判断自身内容并导出的,这个代码要
打包脚本来生成。而打包脚本本身要读取自身的这部分代码,并导出给包裹的开头。
因为功能有相同之处,我就写成读取自身的这部分并交给包裹,所以减少了一段。
http://www.cn-dos.net/forum/viewthread.php?tid=49108- '#act#parcel.vbe
- ''ThisScriptParcel,code by paktc + if_exist + 523066680
- :set fs=createobject("scripting.filesystemobject")
- :set readme=fs.opentextfile(wscript.scriptname)
- :act=0
- :while readme.atendofstream=false
- : linea=readme.readline
- : if left(linea,6)=chr(39) &"#end#" then
- : act=0 : fnow.close
- : end if
- : if act=1 then
- : fnow.writeline mid(linea,2)
- : end if
- : if left(linea,6)=chr(39) &"#act#" then
- : act=1
- : set fnow=fs.createtextfile(mid(linea,7),true)
- : end if
- :wend
- 'wscript.quit
- '#end#parcel.vbe
- fold=replace(wscript.scriptfullname,wscript.scriptname,"")
- set parcel=fs.opentextfile("parcel.vbe",8)
- strx=""
- format="txt,vbs,bat"
- for each fname in fs.getfolder(fold).files
- if replace(format,lcase(right(fname,3)),"")<>format then
- if replace(fname,wscript.scriptname,"")=fname then
- strx=strx& fname &vbcrlf
- set readx=fs.opentextfile(fname)
- parcel.writeline chr(39) &"#act#"&fs.getfilename(fname)
- parcel.writeline chr(39) &replace(readx.readall,vbcrlf,vbcrlf &chr(39))
- parcel.writeline chr(39) &"#end#"&fs.getfilename(fname)
- end if
- end if
- next
- readx.close : parcel.close : msgbox strx
- wscript.quit
复制代码
哪,既然发上来了,就做下说明
代码有一句 format="txt,vbs,bat"
这里面定义被打包的文件格式的。后面的操作是在文件集里面获取格式并判断
是否为其中之一。
[ 本帖最后由 523066680 于 2009-10-26 16:48 编辑 ]
作者: dguest 时间: 2009-10-27 22:53
非常活跃的一个论坛,希望以后能在论坛里混开,谢谢大家的支持
作者: wangchao 时间: 2011-7-16 00:32
10# 523066680 发现在提示输入包裹的名称的时候,如果输入"空格+非空格名字"的时候,生成的打包批处理不放出原文件.如输入:空格k
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |