Board logo

标题: [原创] 【征集】批处理库函数征集 [打印本页]

作者: defanive    时间: 2009-1-31 13:02     标题: 【征集】批处理库函数征集

征集批处理函数专用贴。。。

此贴用来征集批处理函数的。。。

所谓的函数呢,就是一个标签,里面有编写好的功能,通过call和参数来执行。。。

使用批处理函数可以减少重复的代码,让批处理更简洁。。。

下面给一些库函数做参考,格式可以不按照下面的。。。

这个是计算两点时间差,call :TimePoint Time1 Time2 Var
Var变量里就保存了Time1到Time2的时间差
  1. 1.0
  2. CN-DOS Jvive
  3. 不需要其他库的支持
  4. TimePoint、TimePoint_1标签
  5. 定义了TimePoint标签,用于计算两点时间差
  6. 用法 call :TimePoint Point1 Point2 Variable
  7. Point1和Point2是标准时间格式(例如time变量),Point2需大于Point1。两点时间差将保存在Variable变量里。
  8. 使用本库的时候可以给参数外加上双引号(如"%time%"),本库会自动处理
  9. 使用本库需要保留TimePoint、TimePoint_1标签
  10. 使用本库需要开启变量延迟
  11. //**//
  12. :TimePoint
  13. setlocal enableextensions
  14. :TimePoint_1
  15. set "P2=%~1"
  16. set "P2=!P2::=!"
  17. set /a "P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%)"
  18. if not "%~3"=="" (
  19.         set "P1=!P2!"
  20.         shift
  21.         goto :TimePoint_1
  22. )
  23. if !P2! geq !P1! (
  24.         set /a "df=!P2!-!P1!"
  25. ) else (
  26.         set /a "df=!P2!-!P1!+8640000"
  27. )
  28. set /a "h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100"
  29. if %pt% leq 9 set "pt=0%pt%"
  30. endlocal&set "%~2=%h%:%m%:%s%.%pt%"
  31. goto:eof
复制代码


下面这个是Ritchie Lawrence写的,也是他最先提出批处理函数这个概念的
这个函数可以将日期转化为星期

  1. 1.1
  2. Ritchie Lawrence
  3. 不需要其他库的支持
  4. DateToDOW标签
  5. 定义了DateToDOW标签,用于将日期转化为星期(1-7)
  6. 用法 call :DateToDOW "Year" "Month" "Date" "Variable"
  7. Year为年,Month为月,Date为日。星期(1-7)将保存在Variable变量里。
  8. 使用本库的时候可以给参数外加上双引号(如"2009"),本库会自动处理
  9. 使用本库需要保留DateToDOW标签
  10. //**//
  11. :DateToDOW
  12. setlocal ENABLEEXTENSIONS
  13. set "yy=%~1"
  14. set "mm=%~2"
  15. set "dd=%~3"
  16. if 1%yy% LSS 200 if 1%yy% LSS 170 (set "yy=20%yy%") else (set "yy=19%yy%")
  17. set /a "dd=100%dd%%%100,mm=100%mm%%%100"
  18. set /a "z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2"
  19. set /a "dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1"
  20. endlocal&set "%~4=%dow%"
  21. goto :EOF
复制代码


大家多写点批处理函数发上来,谢谢了。。。。
作者: Batcher    时间: 2009-2-3 04:04

Ritchie Lawrence 批处理函数库中英文版
http://bbs.bathome.net/thread-3056-1-2.html
作者: defanive    时间: 2009-2-3 11:36

他的函数库看过了,很好很强大,不过基本都是日期类的,有很多函数不适合移植到中文系统。。。
作者: defanive    时间: 2009-2-3 11:52

再附上几个函数库做参考:

判断文件夹是否为空的函数:
  1. 1.0
  2. Ritchie Lawrence
  3. 不需要其他库的支持
  4. isDirEmpty标签
  5. 定义了isDirEmpty标签,用于判断文件夹是否为空
  6. 用法 call :isDirEmpty "Directory"&& Command1 || Command2
  7. Directory是文件夹路径,可用短名。为空时,会执行Command1,否则执行Command2
  8. 使用本库的时候可以给参数外加上双引号(如"C:\Windows"),本库会自动处理
  9. 使用本库需要保留isDirEmpty标签,i变量
  10. //**//
  11. :isDirEmpty
  12. setlocal enableextensions
  13. dir/ad "%~1" >nul 2>nul||(goto :EOF)
  14. set i=0
  15. for /f %%a in ('dir /a/b "%~1" 2^>nul') do set /a "i+=1"
  16. if %i%==0 (ver>nul) else (md;2>nul)
  17. endlocal
  18. goto :EOF
复制代码



声明一个数组:
  1. 1.0
  2. BatCodeer
  3. 不需要其他库的支持
  4. NewArray标签,arrays贮存变量
  5. 定义了NewArray标签,用于定义新的数组,支持1-3维度。
  6. 用法:call :NewArray "Array" "Var"
  7. Array是形如array_2的字串符,其中array是数组名,2是一维长度。Var是数组的缺省值。定义二维数组则是形如array_2_2,三维则是array_2_2_2。
  8. 例如call :NewArray "array_2_2" "0",执行后变量array_1_1、array_1_2、array_2_1、array_2_2的值均为0
  9. 使用本库的时候可以给参数外加上双引号(如"array_2_2"),本库会自动处理
  10. 使用本库需要保留NewArray标签,arrays变量
  11. //**//
  12. :NewArray
  13. if "%~1"=="" goto :EOF
  14. for /f "eol= tokens=1-4 delims=_" %%1 in ("%~1") do (
  15. if "%%~2"=="" goto :EOF
  16. set arrays=%arrays%%%1;
  17. if "%%~3"=="" (
  18.   for /l %%a in (1,1,%%2) do (
  19.    set "%%1_%%a=%~2"
  20.   )
  21.   goto :EOF
  22. ) else (
  23.   if "%%~4"=="" (
  24.    for /l %%a in (1,1,%%2) do (
  25.     for /l %%b in (1,1,%%3) do (
  26.      set "%%1_%%a_%%b=%~2"
  27.     )
  28.    )
  29.   ) else (
  30.    for /l %%a in (1,1,%%2) do (
  31.     for /l %%b in (1,1,%%3) do (
  32.      for /l %%c in (1,1,%%4) do (
  33.       set "%%1_%%a_%%b_%%c=%~2"
  34.      )
  35.     )
  36.    )
  37.   )
  38. )
  39. )
  40. goto :EOF
复制代码



获得数组的维数:
  1. 1.0
  2. BatCodeer
  3. 不需要其他库的支持
  4. GetArrayWides标签
  5. 定义了GetArrayWides标签,用于获得数组的维度
  6. 用法 call :GetArrayWides ArrayName Variable
  7. ArrayName是数组的名称(例如数组array_10_10,名称为array),数组可以是隐式或显式定义。数组的维度将保存在Variable变量里
  8. 使用本库的时候可以给参数外加上双引号(如"array"),本库会自动处理
  9. 使用本库需要保留GetArrayWides标签
  10. 使用本库需要开启变量延迟
  11. //**//
  12. :GetArrayWides
  13. setlocal enableextensions
  14. set "ArrayWides=%~1"
  15. set "AWs=0"
  16. for /l %%a in (1,1,3) do (
  17. set "ArrayWides=!ArrayWides!_1"
  18. if defined !ArrayWides! set "AWs=%%a"
  19. )
  20. endlocal&set "%~2=%AWs%"
  21. goto :EOF
复制代码



获得数组某一维上有多少个数据:
  1. 1.0
  2. BatCodeer
  3. 需要GetArrayWides库
  4. GetArrayWideNum、GetArrayWideNum_1标签
  5. 定义了GetArrayWideNum标签,用于获得数组维度中的数据个数
  6. 用法 call :GetArrayWideNum ArrayName ArrayWide Variable
  7. ArrayName是数组的名称(例如数组array_10_10,名称为array),数组可以是隐式或显式定义
  8. ArrayWide是需返回数据个数的数组维度。数组的维度将保存在Variable变量里
  9. 使用本库的时候可以给参数外加上双引号(如"array"),本库会自动处理
  10. 使用本库需要保留GetArrayWideNum、GetArrayWideNum_1标签
  11. 使用本库需要开启变量延迟以及GetArrayWides库
  12. //**//
  13. :GetArrayWideNum
  14. setlocal enableextensions
  15. call :GetArrayWides "%~1" "AWs"
  16. if %AWs%==0 (
  17. endlocal
  18. set "%~3=0"
  19. goto :EOF
  20. )
  21. if %AWs% lss %~2 (
  22. endlocal
  23. set "%~3=0"
  24. goto :EOF
  25. )
  26. set /a "leftn=%~2-1"
  27. set /a "rightn=%AWs%-%~2"
  28. for /l %%a in (1,1,%leftn%) do set "left=!left!_1"
  29. for /l %%a in (1,1,%rightn%) do set "right=!right!_1"
  30. set /a AWNs=0
  31. :GetArrayWideNum_1
  32. set /a AWNs+=1
  33. if defined %~1%left%_%AWNs%%right% goto GetArrayWideNum_1
  34. endlocal&set /a "%~3=%AWNs%-1"
  35. goto :EOF
复制代码

作者: defanive    时间: 2009-2-3 11:54

大家帮忙多写一点啊,软件是写好了,但是库函数少得不能见人。。。
作者: Batcher    时间: 2009-2-3 12:02     标题: 回复 3楼 的帖子

翻译的中文版里面哪个函数在中文系统中会出错?
作者: defanive    时间: 2009-2-3 12:35

有些不适用,而且很多用处也不大。。。。
作者: Batcher    时间: 2009-2-3 13:06     标题: 回复 7楼 的帖子

能否举例说明一下哪个不适用?也好让 HAT 去修改一下^_^
作者: defanive    时间: 2009-2-3 13:25

GetOS有问题,网络类的函数没测试,不过估计都是有问题的了。。。

findstr查找的单词是英文的,在中文系统上都换成中文了。。。
作者: Batcher    时间: 2009-2-3 13:56     标题: 回复 9楼 的帖子

经测试,GetOS在中文版系统上确实有问题。
HAT已经更新了电子书。
我也重新上传了附件。
感谢分享。

另,网络类的函数没有问题。
作者: defanive    时间: 2009-2-3 15:11

不过网络类的实用价值不大。。。
作者: BBCC    时间: 2009-2-3 15:41

batcher要做双面人啊,囧.
作者: Batcher    时间: 2009-2-3 19:06     标题: 回复 11楼 的帖子

对于网管来说,还是有点用的:)
作者: xouou_53320    时间: 2009-2-3 22:59

感谢楼主分享 顶上去
作者: freeback    时间: 2009-3-22 17:19

希望在以后能多增加一些库函数
作者: wxcute    时间: 2009-7-8 22:11

判断文件/目录/不存在
  1. ::判断指定路径代表的是文件、目录还是不存在。
  2. ::
  3. ::isF <文件/目录> [合格路径] [标志]
  4. ::  <文件/目录>   要判断的路径。
  5. ::          最后一个字符可以是“\”,方便用于处理“%~dp0”等后面跟有斜杠的路径。
  6. ::  合格路径    返回变量,默认为 Fn。处理后其值最后一个字符定不是“\”。
  7. ::  标志      返回变量,默认为 isFF。含义如下:
  8. ::          文件/目录/不存在
  9. ::          1 / 2 /0
  10. ::
  11. ::isF C:\boot.ini
  12. ::isF "C:\WINDOWS\" NEW_PATH
  13. ::isF "D:\SOFT" QUA_PATH FILE_OR_DIR_FLOG
  14. ::
  15. setlocal
  16. set "$FF_path=%~1"
  17. if "%~2"=="" (set $Fn=Fn)else set $Fn=%~2
  18. if "%~3"=="" (set $isFF=isFF)else set $isFF=%~3
  19. if "%$FF_path:~-1%"=="\" set "$FF_path=%$FF_path:~,-1%"
  20. if exist "%$FF_path%\" (set $isF=2)else (
  21.  if exist "%$FF_path%" (set $isF=1)else set $isF=0
  22. )
  23. endlocal&set %$Fn%=%$FF_path%&set %$isFF%=%$isF%
  24. goto :eof
复制代码
判断文件属性
  1. ::判断文件/目录的属性。
  2. ::
  3. ::Atn <文件/目录> [属性]
  4. ::  <文件/目录>  指定文件/目录
  5. ::  属性     返回变量,默认为att。
  6. ::
  7. ::CALL Atn.BAT C:\BOOT.INI
  8. ::Atn "%WINDIR%\NOTEPAD.EXE" FILE_ATTRIBUTE
  9. ::
  10. setlocal
  11. if "%~2"=="" (set $att=att)else set $att=%~2
  12. set $atbt=%~a1
  13. endlocal&set %$att%=%$atbt%
  14. goto :eof
复制代码
判断分区文件系统
  1. ::判断文件系统类型(CHKNTFS 法)
  2. ::
  3. ::FSt <分区> [类型]
  4. ::  <分区>  带冒号的分区盘符。
  5. ::  类型   返回变量,默认为FStye。代表分区类型。
  6. ::
  7. ::FSt C:
  8. ::FSt H:\ FILE_SYSTEM_TYPE
  9. ::
  10. setlocal
  11. set "$Drv=%~1"
  12. if "%~2"=="" (set $FStye=FStye)else set $FStye=%~2
  13. if "%$Drv:~-1%"=="\" set "$Drv=%$Drv:~,-1%"
  14. for /f "tokens=2 delims=。 " %%t in ('"chkntfs %$Drv%|find "类型""') do (
  15.  set $type=%%t
  16. )
  17. ::set $type=%$type:~,-1%
  18. endlocal&set %$FStye%=%$type%
  19. goto :eof
复制代码
  1. ::判断文件系统类型(FSUTIL 法)
  2. ::
  3. ::FSt2 <分区> [类型]
  4. ::  <分区>  带冒号的分区盘符。
  5. ::  类型   返回变量,默认为FStye。代表分区类型。
  6. ::
  7. ::FSt2 C:
  8. ::FSt2 G:\ FILE_SYSTEM_TYPE
  9. ::
  10. setlocal
  11. set "$Drv=%~1"
  12. if "%~2"=="" (set $FStye=FStye)else set $FStye=%~2
  13. if "%$Drv:~-1%"==":" set "$Drv=%$Drv%\"
  14. for /f "tokens=2 delims=: " %%t in ('"fsutil fsinfo volumeinfo %$Drv%|find "系统名""') do (
  15.  set $type=%%t
  16. )
  17. endlocal&set %$FStye%=%$type%
  18. goto :eof
复制代码

作者: 基拉freedom    时间: 2009-7-13 20:12

用批处理加到外部库 的确很好很强大
作者: wangtao6312    时间: 2012-4-17 13:06

先顶在说啊
作者: yzlsc    时间: 2012-4-17 16:39

翻译的中文版里面哪个函数在中文系统中会出错?
Batcher 发表于 2009-2-3 12:02


比如GetDate函数,用于获取本地系统日期,我进行了如下修改,否则在我的windows XP sp3系统中测试出错:
  1. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. :GetDate yy mm dd
  3. ::
  4. :: 作者:Ritchie Lawrence, 2002-06-15. 版本 1.0
  5. ::
  6. :: 功能:把本地系统日期赋值给参数 1 到 3。
  7. :: 适用于 NT4/2000/XP/2003.
  8. ::
  9. :: 参数:%1 该变量用于接收年,四位(引用调用)
  10. :: %2 该变量用于接收月,两位,01 到 12(引用调用)
  11. :: %3 该变量用于接收日,两位,01 到 31(引用调用)
  12. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  13. setlocal ENABLEEXTENSIONS
  14. ::set t=2&if "%date%z" LSS "A" set t=1
  15. ::for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('echo/^|date') do (
  16. :: for /f "tokens=%t%-4 delims=.-/ " %%d in ('date/t') do (
  17. :: set %%a=%%d&set %%b=%%e&set %%c=%%f))
  18. set "first="
  19. for /f "tokens=1-3 delims=.-/ " %%a in ('date/t') do (
  20. if not defined first set first=1&set yy=%%a&set mm=%%b&set dd=%%c)
  21. endlocal&set %1=%yy%&set %2=%mm%&set %3=%dd%&goto :EOF
  22. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
复制代码

作者: Batcher    时间: 2012-4-17 18:25

回复 19# yzlsc


    http://www.bathome.net/thread-3328-1-1.html




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2