标题: [原创] 【征集】批处理库函数征集 [打印本页]
作者: defanive 时间: 2009-1-31 13:02 标题: 【征集】批处理库函数征集
征集批处理函数专用贴。。。
此贴用来征集批处理函数的。。。
所谓的函数呢,就是一个标签,里面有编写好的功能,通过call和参数来执行。。。
使用批处理函数可以减少重复的代码,让批处理更简洁。。。
下面给一些库函数做参考,格式可以不按照下面的。。。
这个是计算两点时间差,call :TimePoint Time1 Time2 Var
Var变量里就保存了Time1到Time2的时间差- 1.0
- CN-DOS Jvive
- 不需要其他库的支持
- TimePoint、TimePoint_1标签
- 定义了TimePoint标签,用于计算两点时间差
- 用法 call :TimePoint Point1 Point2 Variable
- Point1和Point2是标准时间格式(例如time变量),Point2需大于Point1。两点时间差将保存在Variable变量里。
- 使用本库的时候可以给参数外加上双引号(如"%time%"),本库会自动处理
- 使用本库需要保留TimePoint、TimePoint_1标签
- 使用本库需要开启变量延迟
- //**//
- :TimePoint
- setlocal enableextensions
- :TimePoint_1
- set "P2=%~1"
- set "P2=!P2::=!"
- set /a "P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%)"
- if not "%~3"=="" (
- set "P1=!P2!"
- shift
- goto :TimePoint_1
- )
- if !P2! geq !P1! (
- set /a "df=!P2!-!P1!"
- ) else (
- set /a "df=!P2!-!P1!+8640000"
- )
- set /a "h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100"
- if %pt% leq 9 set "pt=0%pt%"
- endlocal&set "%~2=%h%:%m%:%s%.%pt%"
- goto:eof
复制代码
下面这个是Ritchie Lawrence写的,也是他最先提出批处理函数这个概念的
这个函数可以将日期转化为星期
- 1.1
- Ritchie Lawrence
- 不需要其他库的支持
- DateToDOW标签
- 定义了DateToDOW标签,用于将日期转化为星期(1-7)
- 用法 call :DateToDOW "Year" "Month" "Date" "Variable"
- Year为年,Month为月,Date为日。星期(1-7)将保存在Variable变量里。
- 使用本库的时候可以给参数外加上双引号(如"2009"),本库会自动处理
- 使用本库需要保留DateToDOW标签
- //**//
- :DateToDOW
- setlocal ENABLEEXTENSIONS
- set "yy=%~1"
- set "mm=%~2"
- set "dd=%~3"
- if 1%yy% LSS 200 if 1%yy% LSS 170 (set "yy=20%yy%") else (set "yy=19%yy%")
- set /a "dd=100%dd%%%100,mm=100%mm%%%100"
- set /a "z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2"
- set /a "dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1"
- endlocal&set "%~4=%dow%"
- 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.0
- Ritchie Lawrence
- 不需要其他库的支持
- isDirEmpty标签
- 定义了isDirEmpty标签,用于判断文件夹是否为空
- 用法 call :isDirEmpty "Directory"&& Command1 || Command2
- Directory是文件夹路径,可用短名。为空时,会执行Command1,否则执行Command2
- 使用本库的时候可以给参数外加上双引号(如"C:\Windows"),本库会自动处理
- 使用本库需要保留isDirEmpty标签,i变量
- //**//
- :isDirEmpty
- setlocal enableextensions
- dir/ad "%~1" >nul 2>nul||(goto :EOF)
- set i=0
- for /f %%a in ('dir /a/b "%~1" 2^>nul') do set /a "i+=1"
- if %i%==0 (ver>nul) else (md;2>nul)
- endlocal
- goto :EOF
复制代码
声明一个数组:
- 1.0
- BatCodeer
- 不需要其他库的支持
- NewArray标签,arrays贮存变量
- 定义了NewArray标签,用于定义新的数组,支持1-3维度。
- 用法:call :NewArray "Array" "Var"
- Array是形如array_2的字串符,其中array是数组名,2是一维长度。Var是数组的缺省值。定义二维数组则是形如array_2_2,三维则是array_2_2_2。
- 例如call :NewArray "array_2_2" "0",执行后变量array_1_1、array_1_2、array_2_1、array_2_2的值均为0
- 使用本库的时候可以给参数外加上双引号(如"array_2_2"),本库会自动处理
- 使用本库需要保留NewArray标签,arrays变量
- //**//
- :NewArray
- if "%~1"=="" goto :EOF
- for /f "eol= tokens=1-4 delims=_" %%1 in ("%~1") do (
- if "%%~2"=="" goto :EOF
- set arrays=%arrays%%%1;
- if "%%~3"=="" (
- for /l %%a in (1,1,%%2) do (
- set "%%1_%%a=%~2"
- )
- goto :EOF
- ) else (
- if "%%~4"=="" (
- for /l %%a in (1,1,%%2) do (
- for /l %%b in (1,1,%%3) do (
- set "%%1_%%a_%%b=%~2"
- )
- )
- ) else (
- for /l %%a in (1,1,%%2) do (
- for /l %%b in (1,1,%%3) do (
- for /l %%c in (1,1,%%4) do (
- set "%%1_%%a_%%b_%%c=%~2"
- )
- )
- )
- )
- )
- )
- goto :EOF
复制代码
获得数组的维数:
- 1.0
- BatCodeer
- 不需要其他库的支持
- GetArrayWides标签
- 定义了GetArrayWides标签,用于获得数组的维度
- 用法 call :GetArrayWides ArrayName Variable
- ArrayName是数组的名称(例如数组array_10_10,名称为array),数组可以是隐式或显式定义。数组的维度将保存在Variable变量里
- 使用本库的时候可以给参数外加上双引号(如"array"),本库会自动处理
- 使用本库需要保留GetArrayWides标签
- 使用本库需要开启变量延迟
- //**//
- :GetArrayWides
- setlocal enableextensions
- set "ArrayWides=%~1"
- set "AWs=0"
- for /l %%a in (1,1,3) do (
- set "ArrayWides=!ArrayWides!_1"
- if defined !ArrayWides! set "AWs=%%a"
- )
- endlocal&set "%~2=%AWs%"
- goto :EOF
复制代码
获得数组某一维上有多少个数据:
- 1.0
- BatCodeer
- 需要GetArrayWides库
- GetArrayWideNum、GetArrayWideNum_1标签
- 定义了GetArrayWideNum标签,用于获得数组维度中的数据个数
- 用法 call :GetArrayWideNum ArrayName ArrayWide Variable
- ArrayName是数组的名称(例如数组array_10_10,名称为array),数组可以是隐式或显式定义
- ArrayWide是需返回数据个数的数组维度。数组的维度将保存在Variable变量里
- 使用本库的时候可以给参数外加上双引号(如"array"),本库会自动处理
- 使用本库需要保留GetArrayWideNum、GetArrayWideNum_1标签
- 使用本库需要开启变量延迟以及GetArrayWides库
- //**//
- :GetArrayWideNum
- setlocal enableextensions
- call :GetArrayWides "%~1" "AWs"
- if %AWs%==0 (
- endlocal
- set "%~3=0"
- goto :EOF
- )
- if %AWs% lss %~2 (
- endlocal
- set "%~3=0"
- goto :EOF
- )
- set /a "leftn=%~2-1"
- set /a "rightn=%AWs%-%~2"
- for /l %%a in (1,1,%leftn%) do set "left=!left!_1"
- for /l %%a in (1,1,%rightn%) do set "right=!right!_1"
- set /a AWNs=0
- :GetArrayWideNum_1
- set /a AWNs+=1
- if defined %~1%left%_%AWNs%%right% goto GetArrayWideNum_1
- endlocal&set /a "%~3=%AWNs%-1"
- 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
判断文件/目录/不存在- ::判断指定路径代表的是文件、目录还是不存在。
- ::
- ::isF <文件/目录> [合格路径] [标志]
- :: <文件/目录> 要判断的路径。
- :: 最后一个字符可以是“\”,方便用于处理“%~dp0”等后面跟有斜杠的路径。
- :: 合格路径 返回变量,默认为 Fn。处理后其值最后一个字符定不是“\”。
- :: 标志 返回变量,默认为 isFF。含义如下:
- :: 文件/目录/不存在
- :: 1 / 2 /0
- ::
- ::isF C:\boot.ini
- ::isF "C:\WINDOWS\" NEW_PATH
- ::isF "D:\SOFT" QUA_PATH FILE_OR_DIR_FLOG
- ::
- setlocal
- set "$FF_path=%~1"
- if "%~2"=="" (set $Fn=Fn)else set $Fn=%~2
- if "%~3"=="" (set $isFF=isFF)else set $isFF=%~3
- if "%$FF_path:~-1%"=="\" set "$FF_path=%$FF_path:~,-1%"
- if exist "%$FF_path%\" (set $isF=2)else (
- if exist "%$FF_path%" (set $isF=1)else set $isF=0
- )
- endlocal&set %$Fn%=%$FF_path%&set %$isFF%=%$isF%
- goto :eof
复制代码
判断文件属性
- ::判断文件/目录的属性。
- ::
- ::Atn <文件/目录> [属性]
- :: <文件/目录> 指定文件/目录
- :: 属性 返回变量,默认为att。
- ::
- ::CALL Atn.BAT C:\BOOT.INI
- ::Atn "%WINDIR%\NOTEPAD.EXE" FILE_ATTRIBUTE
- ::
- setlocal
- if "%~2"=="" (set $att=att)else set $att=%~2
- set $atbt=%~a1
- endlocal&set %$att%=%$atbt%
- goto :eof
复制代码
判断分区文件系统
- ::判断文件系统类型(CHKNTFS 法)
- ::
- ::FSt <分区> [类型]
- :: <分区> 带冒号的分区盘符。
- :: 类型 返回变量,默认为FStye。代表分区类型。
- ::
- ::FSt C:
- ::FSt H:\ FILE_SYSTEM_TYPE
- ::
- setlocal
- set "$Drv=%~1"
- if "%~2"=="" (set $FStye=FStye)else set $FStye=%~2
- if "%$Drv:~-1%"=="\" set "$Drv=%$Drv:~,-1%"
- for /f "tokens=2 delims=。 " %%t in ('"chkntfs %$Drv%|find "类型""') do (
- set $type=%%t
- )
- ::set $type=%$type:~,-1%
- endlocal&set %$FStye%=%$type%
- goto :eof
复制代码
- ::判断文件系统类型(FSUTIL 法)
- ::
- ::FSt2 <分区> [类型]
- :: <分区> 带冒号的分区盘符。
- :: 类型 返回变量,默认为FStye。代表分区类型。
- ::
- ::FSt2 C:
- ::FSt2 G:\ FILE_SYSTEM_TYPE
- ::
- setlocal
- set "$Drv=%~1"
- if "%~2"=="" (set $FStye=FStye)else set $FStye=%~2
- if "%$Drv:~-1%"==":" set "$Drv=%$Drv%\"
- for /f "tokens=2 delims=: " %%t in ('"fsutil fsinfo volumeinfo %$Drv%|find "系统名""') do (
- set $type=%%t
- )
- endlocal&set %$FStye%=%$type%
- 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系统中测试出错:- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- :GetDate yy mm dd
- ::
- :: 作者:Ritchie Lawrence, 2002-06-15. 版本 1.0
- ::
- :: 功能:把本地系统日期赋值给参数 1 到 3。
- :: 适用于 NT4/2000/XP/2003.
- ::
- :: 参数:%1 该变量用于接收年,四位(引用调用)
- :: %2 该变量用于接收月,两位,01 到 12(引用调用)
- :: %3 该变量用于接收日,两位,01 到 31(引用调用)
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- setlocal ENABLEEXTENSIONS
- ::set t=2&if "%date%z" LSS "A" set t=1
- ::for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('echo/^|date') do (
- :: for /f "tokens=%t%-4 delims=.-/ " %%d in ('date/t') do (
- :: set %%a=%%d&set %%b=%%e&set %%c=%%f))
- set "first="
- for /f "tokens=1-3 delims=.-/ " %%a in ('date/t') do (
- if not defined first set first=1&set yy=%%a&set mm=%%b&set dd=%%c)
- endlocal&set %1=%yy%&set %2=%mm%&set %3=%dd%&goto :EOF
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
复制代码
作者: Batcher 时间: 2012-4-17 18:25
回复 19# yzlsc
http://www.bathome.net/thread-3328-1-1.html
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |