Board logo

标题: [其他] 给批处理“打包” [打印本页]

作者: 523066680    时间: 2008-11-22 15:59     标题: 给批处理“打包”

给当前批处理“打包”
代码如下:
  1. @echo off
  2. ::批处理给当前其他批处理打包,通过修改的话还能扩展很多功能.利用了一些特效中的技巧.
  3. ::blog    hi.baidu.com/523066680
  4. ::made by 523066680@cn-dos.net 和bbs.bathome.net
  5. set pname=SetupBat.bat
  6. for %%a in (*.bat) do (
  7.     if not "%%a"=="%~nx0" (
  8.       if not "%%a"=="%pname%" (call,set file="%%a" %%file%%)
  9.     )
  10. )
  11. echo,@set file=%file%>"%pname%"
  12. set "act="
  13. ::重定向 执行部分
  14. for /f "delims= eol=" %%a in (%~snx0) do (
  15.        if "%%a"=="::%pname% end" (goto :next)
  16.        if defined act echo,%%a>>"%pname%"
  17.        if "%%a"=="::%pname%" set act=act
  18. )
  19. :next
  20.   ::- - - - - - -重定向内容 - - - - - - - -
  21.   for %%a in (*.bat) do (
  22.     if not "%%a"=="%~nx0" (
  23.       if not "%%a"=="%pname%" (
  24.           echo,::%%a>>"%pname%"
  25.           type "%%a">>"%pname%"
  26.           echo,>>"%pname%"
  27.           echo,::%%a end>>"%pname%"
  28.       )
  29.     )
  30.   )
  31.   ::- - - - - - - - - - - - - - - - - - - -//重定向结束//
  32. if not exist %~sdp0tempfolder (md %~sdp0\tempfolder)
  33. move "%pname%" "%~sdp0tempfolder\"
  34. exit
  35. ::SetupBat.bat
  36. @echo off
  37. for %%a in (%file%) do (call :setup %%~a)
  38. exit
  39. :setup
  40. set "act="
  41. for /f "delims= eol=" %%a in (%~nx0) do (
  42.   if "%%a"=="::%* end" (goto :eof)
  43.   if defined act echo,%%a>>"%*"
  44.   if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
  45. )
  46. ::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年的大家的作品,好像都没出现,估计也是"失传"了...
    贴出代码如下(不知其原帖在何处...):
  1. @echo off
  2. :: 建立回收站
  3. :: Recycle位置可以随意放置,名字也可随便取
  4. :: 如果在某个分区里建了多个带回收站功能的文件夹,那么它们指向的都是同一个位置
  5. md %drv%:\Recycle>nul 2>nul
  6. attrib +s +h %drv%:\Recycle>nul 2>nul
  7. (echo [.ShellClassInfo]
  8. echo CLSID={645FF040-5081-101B-9F08-00AA002F954E})>C:\tmp
  9. copy c:\tmp %drv%:\Recycle\desktop.ini>nul 2>nul
  10. del c:\tmp>nul 2>nul
  11. 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     标题: 用来方便理解的例子

  1. @echo off
  2. for %%a in (test.bat test2.bat) do call :setup %%a
  3.     ::调用函数,%%a代表了标签名 也是重定向文件名
  4. exit
  5. :setup
  6. set "act="
  7. for /f "tokens=* eol=" %%a in (%~nx0) do (
  8.   if "%%a"=="::%* end" (goto :eof)
  9.   if defined act echo,%%a>>"%*"
  10.   if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
  11. )
  12. ::读取本身代码,出现 "::标签" 时开始重定向,"::标签 end"时 结束重定向。
  13. ::test.bat
  14. @echo off
  15. echo,这是为了方便理解也给的例子,所以段落比较短
  16. pause>nul
  17. ::test.bat end
  18. ::test2.bat
  19. @echo off
  20. echo,hi~  I am test2.bat
  21. pause>nul
  22. ::test2.bat end
复制代码

作者: 523066680    时间: 2009-7-26 13:37

可以选择脚本类型
  1. @echo off
  2. ::脚本打包工具 打包文本类型的文件,空行会被去掉
  3. ::blog    hi.baidu.com/523066680
  4. ::made by 523066680@cn-dos.net 和bbs.bathome.net
  5. :a
  6. echo,请正确输入。&echo,
  7. set /p type="请输入将打包的脚本的格式 一种(如 bat,txt...): "
  8. if not exist "*.%type%" (echo,当前不存在该格式文件 &pause>nul &cls &goto :a)
  9. set /p name="包裹的名称(如 parcel ,则生成parcel.bat): "
  10. if exist "tempfolder\%name%.bat" (echo,将对 tempfolder 文件夹中已存在的%name%.bat 进行覆盖 &pause)
  11. set "tempname=thisistempfilename.x"
  12. if not exist tempfolder (md tempfolder)
  13. for %%a in (*.%type%) do (
  14.     if not "%%a"=="%~nx0" (
  15.       if not "%%a"=="%tempname%" (call,set file="%%a" %%file%%)
  16.     )
  17. )
  18. echo,@set file=%file%>"%tempname%"
  19. set "act="
  20. ::重定向 执行部分
  21. for /f "delims= eol=" %%a in (%~snx0) do (
  22.        if "%%a"=="::%tempname% end" (goto :next)
  23.        if defined act echo,%%a>>"%tempname%"
  24.        if "%%a"=="::%tempname%" set act=act
  25. )
  26. :next
  27.   ::- - - - - - -重定向内容 - - - - - - - -
  28.   for %%a in (*.%type%) do (
  29.     if not "%%a"=="%~nx0" (
  30.       if not "%%a"=="%tempname%" (
  31.           echo,::%%a>>"%tempname%"
  32.           type "%%a">>"%tempname%"
  33.           echo,>>"%tempname%"
  34.           echo,::%%a end>>"%tempname%"
  35.       )
  36.     )
  37.   )
  38.   ::- - - - - - - - - - - - - - - - - - - -//重定向结束//
  39. ren "thisistempfilename.x" "%name%.bat"
  40. move "%name%.bat" "tempfolder\%name%.bat"
  41. echo,成功生成包裹%name%.bat 在 tempfolder 文件夹中
  42. pause
  43. exit
  44. ::thisistempfilename.x
  45. @echo off
  46. for %%a in (%file%) do (call :setup %%~a)
  47. exit
  48. :setup
  49. set "act="
  50. for /f "delims= eol=" %%a in (%~nx0) do (
  51.   if "%%a"=="::%* end" (goto :eof)
  52.   if defined act echo,%%a>>"%*"
  53.   if "%%a"=="::%*" errcommand>"%*" 2>nul&set act=act
  54. )
  55. ::thisistempfilename.x end
复制代码

作者: 523066680    时间: 2009-10-26 16:41

vbs版的拉~ 就是要增加注释符号,比较累赘,不过有代码搞成可再利用了。
包裹里有个代码,来判断自身内容并导出的,这个代码要
打包脚本来生成。而打包脚本本身要读取自身的这部分代码,并导出给包裹的开头。
因为功能有相同之处,我就写成读取自身的这部分并交给包裹,所以减少了一段。


http://www.cn-dos.net/forum/viewthread.php?tid=49108
  1. '#act#parcel.vbe
  2. ''ThisScriptParcel,code by paktc + if_exist + 523066680
  3. :set fs=createobject("scripting.filesystemobject")
  4. :set readme=fs.opentextfile(wscript.scriptname)
  5. :act=0
  6. :while readme.atendofstream=false
  7. :  linea=readme.readline
  8. :  if left(linea,6)=chr(39) &"#end#" then
  9. :     act=0 : fnow.close
  10. :  end if
  11. :  if act=1 then
  12. :     fnow.writeline mid(linea,2)
  13. :  end if
  14. :  if left(linea,6)=chr(39) &"#act#" then
  15. :     act=1
  16. :     set fnow=fs.createtextfile(mid(linea,7),true)
  17. :  end if
  18. :wend
  19. 'wscript.quit
  20. '#end#parcel.vbe
  21. fold=replace(wscript.scriptfullname,wscript.scriptname,"")
  22. set parcel=fs.opentextfile("parcel.vbe",8)
  23. strx=""
  24. format="txt,vbs,bat"
  25. for each fname in fs.getfolder(fold).files
  26. if replace(format,lcase(right(fname,3)),"")<>format then
  27. if replace(fname,wscript.scriptname,"")=fname then
  28.     strx=strx& fname &vbcrlf
  29.     set readx=fs.opentextfile(fname)
  30.     parcel.writeline chr(39) &"#act#"&fs.getfilename(fname)
  31.     parcel.writeline chr(39) &replace(readx.readall,vbcrlf,vbcrlf &chr(39))
  32.     parcel.writeline chr(39) &"#end#"&fs.getfilename(fname)
  33. end if
  34. end if
  35. next
  36. readx.close : parcel.close : msgbox strx
  37. 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