中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【共享】常用子过程、函数收集【专用帖】
作者:
标题: 【共享】常用子过程、函数收集【专用帖】 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『楼 主』:  【共享】常用子过程、函数收集【专用帖】

如题,本帖主要对批处理脚本中频繁要用到的子过程或函数进行收集

欢迎大家把自己感觉很实用的小函数或这子过程发来与大家分享,请参照后面的四个尽量发来,也许有更好的算法可以改进,你也必定会受益匪浅, 当然好的东西大家还会加分。

为了保证大家浏览方便,严禁灌水,请不要在此发表与本帖无关的话题违者斩!

你若不支持请减分,支持请加分。后续我会不断充实“函数库”的。

大家可以在下面的帖子讨论,交流意见:

http://www.cn-dos.net/forum/viewthread.php?tid=38969&fpage=1   "批处理函数库"

以前我曾发过这个”【共同参与】批处理函数库“的讨论的帖子,效果不是很好,虽然论坛里有不少会员并不暂成这样的做法

,但毫无疑问,”代码重用“可以减少我们编写代码所花费的时间,提高工作效率,虽然这些子过程不能完全扮演高级语言的函数

的角色,但它确实给大家提供了方法或者思想,大家可酌情修改少量部分代码---”为我所用“,有的甚至可以直接照搬过去。

为了这些子过程或类函数真正能起到这些作用,我不得不做些要求,

函数要尽量通用、高效、封装、简洁
通用---大部分人都用得上,且常用到,几乎不需要修改或者直接照搬就可以直接使用。

高效---调用一次函数所花费的时间尽量少
封装---函数一旦给点不必去管它如何实现,它只起到一个批文件的作用,

简洁---代码简短,结构紧凑。

先举个例子来说明这点:
拿"马甲"的Timediff函数为例
原帖:http://www.cn-dos.net/forum/viewthread.php?tid=39775&fpage=1(此帖已经更新至----下面)

--------------------------------------------------------------------------------------------------------------------------
有更精简的代码:(标签前加上下滑线表示可以作为库函数调用,以区别于普通的函数)
http://www.cn-dos.net/forum/viewthread.php?tid=37382
计算两个时间点的差Etime
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
rem 算法:
rem 在同一天内两时间点的差:etime=([h2,m2,s2]-[h1,m1,s1])*[360000;6000;1]
rem 要求:所测试任务的执行时间不超过1天
:etime <begin_time> <end_time> <return> // By plp626 On 09-7-20
setlocal&set be=%~1:%~2&set c=(%%d-%%a)*360000+(1%%e-1%%b)*6000+1%%f-1%%c
for /f "delims=: tokens=1-6" %%a in ("%be:.=%")do set/a c=%c%
endlocal&set/a %3=%c:-=8640000-%&exit/b
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
彩色字符函数colstr
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:_colstr [^<colorcode^>:"<color str>"^|"<common str>"^|^<escape Char^>];...
(if %1.==. exit/b)&setlocal enabledelayedexpansion&pushd %tmp%
for /f "tokens=1* delims=:" %%a in ("%1")do (
  if %%b.=="%%~b". (set col=%%a
    for %%z in ("LBlue=9";"LGreen=A";"LAqua=B";"LRed=C";"LPurple=D";
                "LYellow=E";"LWhite=F";"Black=0";"Blue=1";"Green=2";
                "Aqua=3";"Red=4";"Purple=5";"Yellow=6";"White=7";"Gray=8";
               )do set col=!col:%%~z!
      if exist "%%~b?" del/a/q "%%~b?"2>&1
      set/p= <nul>"%%~b"2>nul&findstr/a:!col! .* "%%~b?"2>nul 3>&2
    ) else if %1==\n (echo.
    ) else if %1==\b (set/p=<nul
    ) else if %1==\q (set/p=""^"<nul
    ) else if %1==\t (set/p=        <nul&rem 这里是制表符
    ) else (set/p"=%~1"<nul)
)&(if %2. neq . (shift&endlocal&goto:_colstr))&exit/b
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
基本形式就是
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::思路,基本介绍
::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:funname <必选参数>  ... [可选参数] ... <必选参数> ...
setlocal&rem 写紧凑些
do something
endlocal&if 有返回参数 (set %?=%返回%) else echo %返回%
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[ Last edited by plp626 on 2009-10-9 at 12:49 ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-25 13:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 2 楼』:  目前已收录函数:

TimeDiff    显示两个时间点的差(1楼)
ColStr        彩色字符控制输出   (3楼)
---------------------------------函数名:见名知意------------
有关时间日期转换的函数库
DateToDOW
DateToDays
DateToMJD
DateToMins
DateToOrdinal
DateToSecs
DateToWeek
DayName
DayNumber
DaysToDate
GetDate
GetTime
MJDToDate
MinsToDate
MonthName
MonthNumber
OrdinalToDate
SecsToDate
WeekToDate
文件 网络 系统类

FileSizeComp
GetDirStats
IsDirEmpty
IsInPath
GetDG
GetIP
GetMAC
GetNA
GetSM
GetOS
IsRunning
Sleep
Timer
Uptime

----------------------------------------------

[ Last edited by plp626 on 2008-4-27 at 03:50 AM ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-25 13:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 3 楼』:  Colstr 单行彩色字符控制输出帮助文件


@if not %prompt:~-4%==$s$h (start/b cmd /s/k"prompt %prompt%$s$h&%0/?"&exit)
@echo off
if %1.==.   exit/b
if %1.==/?. goto:usage
if %1==/1 goto:attr1
if %1==/2 goto:attr2
if %1==/4 goto:attr4
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:_colstr [^<colorcode^>:"<color str>"^|"<common str>"^|^<escape Char^>];...
(if %1.==. exit/b)&setlocal enabledelayedexpansion&pushd %tmp%
for /f "tokens=1* delims=:" %%a in ("%1")do (
  if %%b.=="%%~b". (set col=%%a
    for %%z in ("LBlue=9";"LGreen=A";"LAqua=B";"LRed=C";"LPurple=D";
                "LYellow=E";"LWhite=F";"Black=0";"Blue=1";"Green=2";
                "Aqua=3";"Red=4";"Purple=5";"Yellow=6";"White=7";"Gray=8";
               )do set col=!col:%%~z!
      if exist "%%~b?" del/a/q "%%~b?"2>&1
      set/p= <nul>"%%~b"2>nul&findstr/a:!col! .* "%%~b?"2>nul 3>&2
    ) else if %1==\n (echo.
    ) else if %1==\b (set/p=<nul
    ) else if %1==\q (set/p=""^"<nul
    ) else if %1==\t (set/p= <nul&这里是制表符
    ) else (set/p"=%~1"<nul)
)&(if %2. neq . (shift&endlocal&goto:_colstr))&exit/b
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:usage
echo.  colstr V1.1 code By plp626 On 09-5-30
echo.usage:
echo.  %~n0 [^<colorcode^>:"<color str>"^|"<common str>"^|^<escape Char^>];...
echo.
echo.^<colorcode^>:     
echo.       参看findstr /?的a参数,这里颜色属性16进制数字,
echo.       这里的颜色代码与它后面16进制颜色属性数字是等效的
echo.       Black=0   Blue=1   Green=2   Aqua=3   Red=4   Purple=5
echo        Yellow=6   White=7   Gray=8   LBlue=9   LGreen=A  
echo        LAqua=B   LRed=C   LPurple=D   LYellow=E   LWhite=F  
echo.^<color string^>:
echo.       除了非法文件名外的所有字符
echo.       另外,不可以是纯“空格”、纯“.” 不可以“空格”、“.”结尾
echo.       如果含有",;=^"其中之一给前面加上^^转义(命令行下)
echo.       如果含有惊叹号!需要给它前面加上6个^^转义(命令行下)     
echo.^<common string^>:
echo.       除了"外的所有字符, 注意对惊叹号的处理要在前面加上^
echo.^<escape char^>:
echo.   "\q"(双引号)、"\t"(制表符)、"\b"(退格)、"\n"(换行)
cmd/c %~n0 c:"[注意]";"多个字符串时用";\q;c:"^;";\q;"隔开";\n
echo.exapmple:&echo    命令行下键入:
echo.   %~n0  "欢迎发email:"; graygreen:"plp626@163.com"; "  交流^!";\n;
echo.
echo 将显示:&echo.
cmd/c %~n0 "欢迎发email:  "; graylgreen:"plp626@163.com"; "  交流^!";\n;\n;
echo.键入 "%~n0/1" 查看一位数字的颜色属性效果
echo.键入 "%~n0/2" 查看两位数字的颜色属性效果
echo.键入 "%~n0/4" 查看四位数字的颜色属性效果&exit/b
:attr1
for %%b in (LBlue LGreen LAqua LRed LPurple LYellow LWhite Black :
            Blue Green Aqua Red Purple Yellow White Gray
           )do if %%b==: (echo.) else cmd/c %~n0 "  ";%%b:"%%b"
echo\&&exit/b
:attr2
setlocal&set attr=0 1 2 3 4 5 6 7 8 9 a b c d e f
for %%a in (%attr%)do echo.&for %%b in (%attr%)do cmd/c %~n0 %%a%%b:"[%%a%%b]"
echo.&endlocal&exit/b
:attr4
echo     当attr为3-4位时,低两位的作用不变,高两位则输出相应的边缘线:
cmd/c %~n0 \n;"     0000 =  "&for %%b in (1 2 3 : 4 5 6 7 : 8 9 A B : C D E F)do (
    if %%b==: (echo\&echo\) else  cmd/c %~n0 "     0%%b00 = "; 0%%b00:"0";)
echo.&exit/b


[ Last edited by plp626 on 2009-6-14 at 23:23 ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-25 14:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 4 楼』:  

全盘搜索[转](不知道算不算,不是我写的):
[sch.bat]
::全盘搜索
::如:搜索BAT文件[sch *.bat],又如:搜索文件名含BAT的文件[sch bat],含空格的文件名要加引号。
@echo off
set alldrives=c d e f g h i j k l m n o p q r s t u v w x y z
for %%i in (%alldrives%) do if exist %%i:\ dir/a/b/s "%%i:\*%~1*.*"
pause
调用:
sch [要搜索的文件或目录名]


   此帖被 +1 点积分    点击查看详情   
评分人:【 jvive 分数: +1  时间:2008-4-25 22:22




┌───────┐
├→学习→实践→┤
└───────┘
2008-4-25 22:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jvive
初级用户

替身



积分 122
发帖 17
注册 2008-3-27
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by naughtypack at 2008-4-25 05:54 PM:
学习一下,谢谢

报告楼主,4楼的灌水,请拖出去斩了!

我这个帖可不是水贴哦。

[ Last edited by jvive on 2008-4-25 at 10:26 PM ]



进入网盘(各种工具)
2008-4-25 22:17
查看资料  发短消息 网志  OICQ (275928264)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


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

plp已经一个月以上不在线了……灌灌水 没什么。
                                                          -  “天高皇帝远”
很羡慕plp 他想法很多。把他当雷锋学习!



综合型编程论坛

我的作品索引
  
2008-7-29 10:17
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 7 楼』:  彩色字符函数colstr的缺点

总体来说“彩色字符函数colstr”是不错的,但是发现有2个缺点。

1. 在%TMP%目录下生成了很多文件。(为了让FINDSTR使用)

2. 不能显示带:号的系统变量,如: %DATE%, %TIME%

希望能在以上两点上加强。

2009-6-7 09:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by uiopuiop at 2009-6-7 09:15 AM:
总体来说“彩色字符函数colstr”是不错的,但是发现有2个缺点。

1. 在%TMP%目录下生成了很多文件。(为了让FINDSTR使用)

2. 不能显示带:号的系统变量,如: %DATE%, %TIME%

希望能在以上两点上加强。

1.pushd %tmp%是不较好的选择了,总比在当前文件夹里生产一大批临时文件好
2.带冒号的字符串属于”非法文件名字符“,不能彩色显示,只能当作普通字符串显示

请键入 colstr “123:456” 试试



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-6-14 23:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 9 楼』:  

彩色字符函数主要是利用文件名来生成彩色字符的,所以\/:*?"<>|字符不能正确处理



2009-6-14 23:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 10 楼』:  

不行了,很多都忘记了

2009-6-15 02:03
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
rabit123
新手上路





积分 6
发帖 6
注册 2009-4-16
状态 离线
『第 11 楼』:  

很不錯的說
只是,子过程写成子程序,不知道如何回传参数~

2009-6-15 07:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
rabit123
新手上路





积分 6
发帖 6
注册 2009-4-16
状态 离线
『第 12 楼』:  

很不錯的說
只是,子过程写成子程序,不知道如何回传参数~
我倒,該死的IE8~~~
让我重复发言了!
用临时文件回传参数貌似比较耗费资源。

[ Last edited by rabit123 on 2009-6-15 at 07:49 ]

2009-6-15 07:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
acaigg
初级用户





积分 115
发帖 92
注册 2010-12-24
状态 离线
『第 13 楼』:  

再顶一下此帖

2010-12-29 11:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: