中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]批处理代码发帖着色脚本 Batch2ubb(CMD & GAWK)
« [1] [2] [3] »
作者:
标题: [原创]批处理代码发帖着色脚本 Batch2ubb(CMD & GAWK) 上一主题 | 下一主题
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『楼 主』:  [原创]批处理代码发帖着色脚本 Batch2ubb(CMD & GAWK)

[原创]批处理代码发帖着色脚本 Batch2ubb(CMD & GAWK) 7.30 日更新
        这是我当初学习 AWK 时作出的东西,一直存在一些问题没有解决,所以也就没有贴出来。最近一段时间不能上网就重写了一下,并加入了可支持参数的调用批处理,多参数调用构架是 Willsort 兄的大作,我直接拷贝过来,详见:[原创]批处理参数问题一点谈 http://www.cn-dos.net/forum/viewthread.php?tid=17785。
        其中主要功能是由 GAWK 脚本完成的,剪贴板操作依赖于 winclip.exe ,语法文件是由我自己使用的 EmEditor 的批处理语法文件简化而来。所需执行文件下载链接:
        winclip        http://www.dmst.aueb.gr/dds/sw/outwit/outwit-bin-1.26.zip
        gawk        http://www.klabaster.com/progs/gawk32.zip

        关于此批处理的使用,有几种调用方式交待一下:
        1、直接双击运行。
        2、命令行调用,Batch2ubb /h 查看具体参数用法。
        3、在 sendto 建立快捷方式调用。
        4、建立快捷方式并设定热键调用。

        关于第 1 种运行方式,会将剪贴板中的代码转为 UBB 代码,重新写到剪贴板。
        关于第 3 种运行方式,使用方法是开始、运行 输入 sendto ,在 sendto 目录建立指向 Batch2ubb.cmd 的快捷方式,然后右键选定欲转换的批处理文件执行发送到建立的快捷方式,转换的代码存于剪贴板。此种方法适用于已经存在的批处理的转换。
        关于第 4 种运行方式,使用方法是在桌面或开始菜单中建立指向 Batch2ubb.cmd 的快捷方式并设定热键(后一位置重启后生效或在桌面按住F5键十秒种生效)或由 hoekey 等软件代劳,然后拷贝欲贴代码,按下热键,就可以在发帖窗口中粘贴了。并切可以在快捷方式中的目标位置选择是否启用 /n 参数。
        另请自行修改 Batch2ubb.awk 中时间戳语句中的名字为自己的名字。有问题或建议欢迎跟帖讨论,我会尽量完善的。

Batch2ubb.cmd

  Quote:

  1. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. :: Batch2ubb.cmd -V0.30 -- 批处理转 UBB 代码
  3. :: 无奈何@cn-dos.net - 更新于:2005-7-30 - CMD & GAWK
  4. :: 用法:Batch2ubb [/i 输入文件] [/o 输出文件] [/n 输出无行号] [/h 显示帮助]
  5. :: 支持文件: - gawk.exe  winclip.exe  Batch2ubb.awk  batch.esy
  6. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  7. @echo off
  8. setlocal
  9. set path=%path%;%cd%;%~dp0
  10. set error=
  11. rem 文件完整性检查。
  12. for %%i in (gawk.exe winclip.exe batch.esy batch2ubb.awk) do (
  13.         @if "%%~$PATH:i" == "" (
  14.                 echo 错误:程序所依赖文件 "%%i" 缺失。
  15.                 set error=错误:程序文件不完整。
  16.         ) else ( set %%~ni="%%~$PATH:i" )
  17. )
  18. if defined error goto error

  19. rem 测试剪贴板数据类型。
  20. winclip -i |findstr /r ".*_.*TEXT" >nul
  21. if ERRORLEVEL 1 set error=错误:剪贴板为空或内容为非文字数据!

  22. rem 空参数调用获得剪贴板数据,将转换结果复制到剪贴板。
  23. if "%~1" == "" (
  24.         if defined error goto error
  25.         winclip -p |gawk -v line=1 -f %Batch2ubb% |winclip -c
  26.         goto end
  27. )
  28. rem 只有一个参数时尝试作为输入文件处理,当其不存在时作参数处理。
  29. if "%~2" == "" (
  30.         if exist "%~1" (
  31.                 gawk -v line=1 -f %Batch2ubb% "%~1" |winclip -c
  32.                 goto end
  33.         )
  34. )
  35. set line=1
  36. set input=
  37. set out=

  38. :ParseLoop
  39. if "%~1" == "" goto Start
  40. if "%~1" == "/?" goto SwitchH
  41. rem 参数处理并转到相应标签。
  42. for %%s in (i I n N o O h H) do if "%~1"=="/%%s" goto Switch%%s
  43. set error=错误: 参数格式不正确 - "%1"!
  44. goto error

  45. :SwitchI
  46. set "input=%~2"
  47. if not exist "%input%" set error=警告:文件 "%input%" 不存在。 & goto error
  48. goto Next2Arg

  49. :SwitchO
  50. set "out=%~2"
  51. if not defined out set error=警告:请指定输出文件。 & goto error
  52. goto Next2Arg

  53. :SwitchN
  54. set line=0
  55. goto NextArg

  56. :Next2Arg
  57. shift
  58. :NextArg
  59. shift
  60. goto ParseLoop

  61. rem 不同参数分类判断处理。
  62. :Start
  63. if defined input (
  64.         if defined out (
  65.                 gawk -v line=%line% -f %Batch2ubb% "%input%" >"%out%"
  66.         ) else (
  67.                         gawk -v line=%line% -f %Batch2ubb% "%input%" |winclip -c
  68.                 )
  69. ) else (
  70.         if defined out (
  71.                         if defined error goto error
  72.                         winclip -p |gawk -v line=%line% -f %Batch2ubb% >"%out%"
  73.         ) else (
  74.                         if defined error goto error
  75.                         winclip -p |gawk -v line=0 -f %Batch2ubb% |winclip -c
  76.                 )
  77. )
  78. goto end

  79. :error
  80. echo.%error%
  81. echo.
  82. :SwitchH
  83. echo.批处理转 UBB 代码。
  84. echo.Batch2ubb [/i 输入文件] [/o 输出文件] [/n 输出无行号] [/h 显示帮助]
  85. echo.
  86. echo. /i        指定转换的文件,可包含路径,缺省从剪贴板获得。
  87. echo. /o        指定输出的文件,可包含路径,缺省输出到剪贴板。
  88. echo. /n        生成无行号的 UBB 代码,缺省带行号。
  89. echo. /h        显示本简短帮助,等价命令 /?
  90. echo.  本程序执行依赖以下文件 gawk.exe winclip.exe Batch2ubb.awk batch.esy。
  91. echo.
  92. :end
        无奈何发表于:  2006-07-30  23:44

Batch2ubb.awk
###########################################################
# Batch2ubb.awk -V0.2 -- 批处理转 UBB 代码脚本
# 无奈何 - 2005-7-2 --  GAWK 脚本
###########################################################
#读取配置文件,获取关键字
BEGIN {
        IGNORECASE=1
        while ((getline<"batch.esy") >0){
                if ($0!~/^[ \t]*;/ && $0!~/^$/) {
                        if ($0~/^[ \t]*#LINECOMMENT=/){
                                LineComment=substr($0,index($0,"=")+1)
                        } else if ($0~/^[ \t]*#VARIABLE=/){
                                Variable=substr($0,index($0,"=")+1)
                        } else if ($0~/^[ \t]*#PARAMETER=/){
                                Parameter=substr($0,index($0,"=")+1)
                        } else if ($0~/^[ \t]*#LABEL=/){
                                Label=substr($0,index($0,"=")+1)
                        } else if ($0~/^[ \t]*#KEYWORD/){
                                color[++i]=substr($0,index($0,"=")+1)
                        } else {
                                        keyword[$0]=color[i]
                        }
                }
        }
        print "[quote]"
        if (line) print "[list=1]"
}
#主程序开始
{
        before="[color=]"
        after="[/color]"
        #处理注释行及标签行
        if (($0~/^[ \t]*::/) || ($0~/^[ \t]*REM\>/)){
                gsub(/=.*]/,"=" LineComment "]",before)
                $0=before $0 after
        }else if ($0~/^[ \t]*:[^:]+/){
                gsub(/=.*]/,"=" Label "]",before)
                $0=before $0 after
        } else {
                temp=$0
                #分割出关键字
                gsub(/[][ \t,;'`~:+"=()<>{}^&|@\.]+/,"□",temp)
                gsub(/(^□|□$)/,"",temp)
                len=split(temp,word,"□+")
                for (i=1;i<=len;i++){
                        # COLOR 关键字与 UBB 颜色字符重叠,单独处理
                        if (word[i]~/COLOR/){
                                if(!fcolor){
                                        gsub(/=.*]/,"=" keyword["COLOR"] "]",before)
                                        gsub("\\<" word[i] "\\>",before "&" after,$0)
                                        delete word[i]
                                        fcolor=1
                                } else
                                        delete word[i]
                        }
                        #删除重复关键字
                        for (j=i+1;j<=len;j++){
                                if (word[i]==word[j])
                                        delete word[j]
                        }
                }

                for (i=1;i<=len;i++){
                        for (aa in keyword){
                                if (aa==toupper(word[i])){
                                        gsub(/=.*]/,"=" keyword[aa] "]",before)
                                        gsub("\\<" word[i] "\\>",before "&" after,$0)
                                }
                        }
                }
                #处理变量及命令参数等细节部分
                gsub(/=.*]/,"=" Variable "]",before)
                gsub (/%+[A-Za-z0-9:~]*%?/,before "&" after,$0)
                gsub (/!+[A-Za-z0-9:~]*!*/,before "&" after,$0)
                gsub(/=.*]/,"=" Parameter "]",before)
                gsub (/ \/[A-Za-z?\-]+/,before "&" after,$0)
                gsub (/(\(|\))/,"[b]&[/b]",$0)
                gsub (/(\")/,"[b]&[/b]",$0)
        }
        if (line) print "[*]" $0
        else print $0
}
END {
        if (line) printf "[/list]"
        #添加时间戳自行修改作者名
        print "[color=White]" strftime("\t无奈何发表于:  %Y-%m-%d  %H:%M") "[/color]"
        print "[/quote]"
}
所有文件打包下载见附件:

[ Last edited by 无奈何 on 2006-7-30 at 23:53 ]

   此帖被 +19 点积分        点击查看详情   
评分人:【 redtek 分数: +2  时间:2006-11-3 00:30
评分人:【 hxuan999 分数: +2  时间:2006-11-28 06:45
评分人:【 ccwan 分数: +15  时间:2007-2-9 03:30


附件 1: Batch2ubb.zip (2006-7-8 23:30, 145.3 K, 下载附件所需积分 1 点 ,下载次数: 385)
附件 2: Batch2ubb_V0.3.zip (2006-7-30 23:52, 145.46 K, 下载附件所需积分 1 点 ,下载次数: 490)


  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-7-3 20:16
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
220110
荣誉版主




积分 718
发帖 313
注册 2005-9-26
状态 离线
『第 2 楼』:  

re 无奈何

Batch2ubb.cmd 是否漏了 endlocal ?
怪不得这两天见你的贴子充满着色彩,我心想无奈何你不会无奈何到这样玩吧,哈哈,原来还有这必杀技,有创意!顶..

[ Last edited by 220110 on 2006-7-4 at 09:49 ]

2006-7-4 09:47
查看资料  发送邮件  发短消息 网志   编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 3 楼』:  

Re 220110
哈哈,无奈中多一点色彩。^_^
endlocal 并非漏掉,因为在批处理结束处暗含一个 endlocal 命令,所以  endlocal 可以省略。如果含有多段  setlocal 的话加上结束环境更改是必要的。



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-7-4 21:22
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 4 楼』:  



  Quote:

  1. @echo off
  2. set Version=VIRDEFVER
  3. find /i virusdb.cfg "%Version%"
  4. if not errorlevel 1 set Version=VersionNo
  5. for /F "tokens=1 delims=VIRDEFVER " %%A in ('find /i .\Rav\virusdb.cfg "VIRDEFVER"') do set No=%%A
  6. for /F "tokens=1 delims=VIRDEFUPDATEDATE " %%B in ('find /i .\Rav\virusdb.cfg "VIRDEFUPDATEDATE"') do set DATENO=%%B
  7. echo [Version]>.\001\VERSION.INF
  8. echo %Version%%NO%>>.\001\VERSION.INF
  9. echo UpdateDate%DATENO%>>.\001\VERSION.INF
        DOS一跟葱    2006-07-06  13:46

老大怎么签名字体是白的?

2006-7-6 13:59
查看资料  发送邮件  发短消息 网志   编辑帖子
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 5 楼』:  

不明白如何使用。

2006-7-6 19:10
查看资料  发送邮件  发短消息 网志   编辑帖子
doscc
中级用户




积分 256
发帖 93
注册 2006-3-26
来自 广东
状态 离线
『第 6 楼』:  

强人一个.好好学习

2006-7-6 21:10
查看资料  发短消息 网志   编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 7 楼』:  

Re fastslz
我添加时间戳记的目的有两个
1、利用戳记中的部分字句作为全文搜索的关键词,来查找自己发过的含有代码的帖子。
2、简单的添加时间标记。

关于 1 象1楼中单纯使用用户名作标记并不是很明智的做法,因为会搜到很多其他的帖子,所以个性一点的词句效果会好一些。关于为什么选择白色的,只是希望更含蓄一些,当然可以根据自己的喜好更改为更顺心的颜色。

Re  zhaxi
如果觉得设置快捷方式比较复杂,可以直接从命令行中调用。
更简单的方法是将要发帖的批处理代码拷贝到剪贴板,双击运行 Batch2ubb.cmd  ,然后就可以粘贴转换后的代码了。
我更新了一下,并且多添加了一些说明。

[ Last edited by 无奈何 on 2006-7-8 at 23:33 ]



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-7-8 16:48
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
IceCrack
中级用户

DOS之友


积分 332
发帖 168
注册 2005-10-6
来自 天涯
状态 离线
『第 8 楼』:  



  Quote:

  1. @echo off
  2. :start

  3. setlocal ENABLEDELAYEDEXPANSION
  4. :loop_a
  5. del tmp*.txt 2>nul
  6. for /l %%i in (1,1,6) do (
  7.                 echo %random% >nul
  8.                 set /a s%%i=!random:~-1!
  9.                 echo %random% >nul
  10.                 set /a g%%i=!random:~-1!
  11.                 if "!s%%i!"=="0" (set /a _VAR_=!g%%i! / 3) else (set /a _VAR_=!s%%i!!g%%i! / 3)
  12.                 if "!_VAR_:~1,1!"=="" set _VAR_=0!_VAR_!
  13.                
  14.                 findstr /m "!_VAR_!" tmp.txt 2>nul >nul && goto :loop_a
  15.                 if "!_VAR_!"=="00" (echo 33>>tmp.txt) else (echo !_VAR_!>>tmp.txt)
  16. )
  17. sort tmp.txt>tmp1.txt
  18. endlocal


  19. :loop_b

  20. setlocal ENABLEDELAYEDEXPANSION

  21. echo %random% >nul
  22. set /a s=!random:~-1!

  23. echo %random% >nul
  24. set /a g=!random:~-1!
  25.                
  26. if "!s!"=="0" (set /a _VAR_=!g! / 6) else (set /a _VAR_=!s!!g! / 6)
  27. if "!_VAR_:~1,1!"=="" set _VAR_=0!_VAR_!

  28. echo ^|>>tmp1.txt
  29. if "!_VAR_!"=="00" (echo 16>>tmp1.txt) else (echo !_VAR_!>>tmp1.txt)

  30. endlocal



  31. :echo
  32. setlocal ENABLEDELAYEDEXPANSION
  33. for /f %%i in (tmp1.txt) do (
  34.                 set n=%%i
  35.                 set m=!m! !n!
  36. )
  37. del tmp*.txt
  38. cls
  39. echo.
  40. echo.¥1000000000000000000000000000000000000000000.00
  41. echo.
  42. echo. Hitme,双色球必中,号码是 !m!
  43. echo.
  44. echo.¥1000000000000000000000000000000000000000000.00
  45. echo.



  46. :save
  47. set /p x=保留号码至num.txt[y/n]
  48. if /i [%x%]==[y] (echo !m!>>num.txt && endlocal && goto :start) else (endlocal && goto :start)
        IceCrack发表于:  2006-07-14  08:13

呵呵  效果还不错啊  又仔细的玩了一下, 觉得应该是这样的当剪切板上没有数据。且没有参数的情况下,跳转到帮助文件。而且在dos窗口下应该支持 /h /? 以及无参数都跳转到帮助文件。我是这样认为的。

[ Last edited by IceCrack on 2006-7-14 at 08:32 ]

   此帖被 +5 点积分     点击查看详情   
评分人:【 redtek 分数: +5  时间:2007-2-6 22:44


2006-7-14 08:21
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (369525996)  编辑帖子
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 9 楼』:  

谢谢 IceCrack 兄的建议。更新了一下 Batch2ubb.cmd 到 V0.3 版。有兴趣的朋友可以对比一下老版。



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-7-30 23:50
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 10 楼』:  

这程序太赞了,非常实用,不但好看,理解别人写的代码时条理也清楚多了。

2006-11-2 02:50
查看资料  发短消息 网志   编辑帖子
yangzhiyi
中级用户





积分 261
发帖 123
注册 2006-6-6
状态 离线
『第 11 楼』:  

好强,以后发贴都用一下
CODE:  [Copy to clipboard] 这个怎么做呢?

2006-11-2 06:47
查看资料  发短消息 网志   编辑帖子
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 12 楼』:  

下载以后一使用发现简直太方便了!!!
这个自动给批处理行号的功能非常有意思,要是讨论个某行某段的语句一说行号就行了~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-3 00:34
查看资料  发送邮件  发短消息 网志   编辑帖子
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 13 楼』:  


  呵呵。厉害啊~~无奈何兄一发帖就是好帖~顶~


2006-11-27 10:17
查看资料  发送邮件  发短消息 网志   编辑帖子
vlq5299
初级用户





积分 136
发帖 59
注册 2006-6-2
状态 离线
『第 14 楼』:  

不是十分明白

2006-12-5 03:17
查看资料  发送邮件  发短消息 网志   编辑帖子
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 15 楼』:  好厉害!

又解决了我的一个心病啊

赞一个

2006-12-24 02:52
查看资料  发短消息 网志   编辑帖子
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: