# CodeBlock

Name: AB选择菜单
Code:
echo 输入 A 跳到 A 标签
echo 输入 B 跳到 B 标签
echo;
set "input="
set /p input=请输入您的选择:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
echo 输入的是%input%


Name: 调用vbs的inputbox再将输入值传递给自身
Code:
%1 mshta vbscript:"<script language=vbs>input=inputbox(""input:""):createobject(""wscript.shell"").run """"""%~0"""" : ""&key:close</script>"&exit/b
echo key=%2


Name: 逐字插入空格
Code:
set str=逐字插入空格
setlocal enabledelayedexpansion
set tmp=
for /l %%a in (0 1 8192) do (
	if "!str:~%%a,1!" neq "" set tmp=!tmp! !str:~%%a,1!
)
echo;!tmp:~1!
endlocal


Name: 显示存在的盘符
Code:
for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)do (
	if exist %%a: (
		echo %%a
	)
)


Name: 修改网关设置
Code:
set 连接名称=本地连接
set ip地址=192.168.1.2
set 子网掩码=255.255.255.0
set 网关地址=192.168.1.1
netsh interface ip set address name="%连接名称%" source=static addr=%ip地址% mask=%子网掩码% gateway=%网关地址% gwmetric=1


Name: 修改DNS设置
Code:
set 连接名称=本地连接
set DNS地址=61.134.1.34
netsh interface ip set dns name="本地连接" source=static addr=%DNS地址%


Name: 结束当前cmd及其子进程
Code:
wmic process where name="wmic.exe" get ParentProcessId|(
	for /f %%a in ('findstr [0-9]')do taskkill /f /t /pid %%a
)


Name: 结束除了当前cmd之外的所有cmd及其子进程
Code:
wmic process where name="wmic.exe" get ParentProcessId|(
	for /f %%a in ('findstr [0-9]')do taskkill /f /t /fi "pid ne %%a" /im cmd.exe
)


Name: 或判断判断多个if中是否有一个成立
Code:
set 成立=
if "%A%"=="%B%" set 成立=1
if "%C%"=="%D%" set 成立=1
if defined 成立 (
	echo 有一个成立
) else (
	echo 均不成立
)


Name: 且判断判断多个if中是否均成立
Code:
set 成立=
if "%A%"=="%B%" if "%C%"=="%D%" set 成立=1
if defined 成立 (
	echo 均成立
) else (
	echo 至少有一个不成立
)


Name: 非判断判断多个if中是有且只有一个成立
Code:
set 成立=
if "%A%"=="%B%" set /a 成立=~成立
if "%C%"=="%D%" set /a 成立=~成立
if "%成立%"=="-1" (
	echo 有且只有一个成立
) else (
	echo 均不成立
)


Name: 显示当前setlocal递归层数
Code:
set /a n=0,m=32
(for /l %%a in (1 1 32)do setlocal&&set /a n=%%a,m=32-n) 2>nul
(for /l %%a in (1 1 %n%)do endlocal)&echo 已 setlocal 递归了 %m% 层，距离最大递归层还有 %n% 层


Name: 标题进度条
Code:
setlocal enabledelayedexpansion
set t=
for /l %%a in (1 1 80) do (
	set "t=>!t!"
	set /p=!t!<nul
	ping /n 1 127.1 >nul
)
endlocal


# Function

Name: DateToDOW
FileName: DateToDOW.CMD
Notice: 日期转星期第几天
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToDOW %yy% %mm% %dd% dow
::
:: 作者: Ritchie Lawrence, 2003-04-29. 版本 1.1
::
:: 功能: 获取某一日期是其所在星期的第几天，1 = 星期一，7 = 星期日
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数: %1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的月，可以以零开头（传值调用）
::       %3 待转换的日，可以以零开头（传值调用）
::       %4 该变量用于接收所在星期的第几天，1 到 7 （引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 待转换的年，两位或者四位（传值调用）
%2 待转换的月，可以以零开头（传值调用）
%3 待转换的日，可以以零开头（传值调用）
%4 该变量用于接收所在星期的第几天，1 到 7 （引用调用）

Example:
setlocal ENABLEEXTENSIONS
call GetDate y m d
call DateToDOW %y% %m% %d% dow
call DayName %dow% day
echo 今天是该星期的 %day%


Name: DateToDays
FileName: DateToDays.CMD
Notice: 日期转天数
Call: %1 待转换的年，两位或者四位（传值调用） %2 待转换的月，可以以零开头（传值调用） %3 待转换的日，可以以零开头（传值调用） %4 该变量用于接收所经过的天数（引用调用）
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToDays %yy% %mm% %dd% days
::
:: 作者：Ritchie Lawrence, 2002-09-26. 版本 1.0
::
:: 功能：返回从 1970 年 1 月 1 日到给定的日期之间所经过的天数。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的月，可以以零开头（传值调用）
::       %3 待转换的日，可以以零开头（传值调用）
::       %4 该变量用于接收所经过的天数（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %4=%j%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Example:
setlocal ENABLEEXTENSIONS
call DateToDays 2003 12 31 days
echo 从 1970-01-01 到 2003-12-31 之间所经过的天数是：%days%


Name: DateToMJD
FileName: DateToMJD.CMD
Notice: 日期转修正儒略日
Call: %1 待转换的年，两位或者四位（传值调用） %2 待转换的月，可以以零开头（传值调用） %3 待转换的日，可以以零开头（传值调用） %4 该变量用于接收修正儒略日（引用调用）
Example: setlocal ENABLEEXTENSIONS call DateToMJD 1999 12 31 x echo 1999-12-31 的修正儒略日是：%x%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToMJD %yy% %mm% %dd% MJD
::
:: 作者：Ritchie Lawrence, 2002-06-15. 版本 1.0
::
:: 功能：把一个协调世界时（UTC）日期转换为修正儒略日（MJD）
::       参考日期（第零天）是 1858 年 11 月 17 日
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的月，可以以零开头（传值调用）
::       %3 待转换的日，可以以零开头（传值调用）
::       %4 该变量用于接收修正儒略日（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2432046
endlocal&set %4=%j%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


Name: DateToMins
FileName: DateToMins.CMD
Notice: 日期转分钟数
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToMins %yy% %mm% %dd% %hh% %mm% result
::
:: 作者：Ritchie Lawrence, updated 2003-04-03. 版本 1.1
::
:: 功能：返回自从 1970-01-01 00:00 到指定日期之间所经过的分钟数
::       适用于 NT4/2K/XP/2003
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的月，范围是 1/01 到 12，可以以零开头（传值调用）
::       %3 待转换的日，范围是 1/01 到 31，可以以零开头（传值调用）
::       %4 待转换的小时，范围是 1/01 到 12 （12小时制，分钟数以“a”或者
::          “p”结尾）或者 0/00 到 23 （24小时制）（传值调用）
::       %5 待转换的分钟，范围是 00-59 （12小时制需加 a/p 后缀）（传值调用）
::       %6 该变量用于接收所经过的分钟数（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5
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,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
set /a hh=100%hh%%%100,nn=100%nn%%%100,j=j*1440+hh*60+nn
endlocal&set %6=%j%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 待转换的年，两位或者四位（传值调用）
%2 待转换的月，范围是 1/01 到 12，可以以零开头（传值调用）
%3 待转换的日，范围是 1/01 到 31，可以以零开头（传值调用）
%4 待转换的小时，范围是 1/01 到 12 （12小时制，分钟数以“a”或者“p”结尾）或者 0/00 到 23 （24小时制）（传值调用）
%5 待转换的分钟，范围是 00-59 （12小时制需加 a/p 后缀）（传值调用）
%6 该变量用于接收所经过的分钟数（引用调用）

Example:
setlocal ENABLEEXTENSIONS
call GetDate y m d
call GetTime hh mm ss tt
call DateToMins %y% %m% %d% %hh% %mm% mins
echo 从 1970-01-01 00:00 到 %y% %m% %d% %hh% %mm% 之间所经过的分钟数是：%mins%


Name: DateToOrdinal
FileName: DateToOrdinal.CMD
Notice: 日期转序号日期
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToOrdinal %yy% %mm% %dd% year doy
::
:: 作者：Ritchie Lawrence, updated 2002-11-22. 版本 1.1
::
:: 功能：通过日历日期获取 ISO 8601 序号日期。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的月，可以以零开头（传值调用）
::       %3 待转换的日，可以以零开头（传值调用）
::       %4 该变量用于接收年份，四位（引用调用）
::       %5 该变量用于接收一年中的第几天，001 到 366（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4799,k=y*365+y/4-y/100+y/400-31738,o=j-k+1
if %o% LSS 100 set o=0%o%&if %o% LSS 10 set o=00%o%
endlocal&set %4=%yy%&set %5=%o%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 待转换的年，两位或者四位（传值调用）
%2 待转换的月，可以以零开头（传值调用）
%3 待转换的日，可以以零开头（传值调用）
%4 该变量用于接收年份，四位（引用调用）
%5 该变量用于接收一年中的第几天，001 到 366（引用调用）

Example:
setlocal ENABLEEXTENSIONS
call GetDate y m d
call DateToOrdinal %y% %m% %d% year doy
echo 今天（序号日期）是：%year%-%doy%


Name: DateToSecs
FileName: DateToSecs.CMD
Notice: 日期转秒钟数
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToSecs %yy% %mm% %dd% %hh% %nn% %ss% secs
::
:: 作者：Ritchie Lawrence, updated 2002-08-13. 版本 1.1
::
:: 功能：返回自从 1970-01-01 00:00:00 到指定日期之间所经过的秒钟数
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的月，范围是 1/01 到 12，可以以零开头（传值调用）
::       %3 待转换的日，范围是 1/01 到 31，可以以零开头（传值调用）
::       %4 待转换的小时，范围是 1/01 到 12 （12小时制，分钟数以“a”或者
::          “p”结尾）或者 0/00 到 23 （24小时制）（传值调用）
::       %5 待转换的分钟，范围是 00-59 （12小时制需加 a/p 后缀）（传值调用）
::       %6 待转换的秒钟，范围是 0-59 或者 00-59（传值调用）
::       %7 该变量用于接收所经过的秒钟数（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5&set ss=%6
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,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
set /a j=j*86400+hh*3600+nn*60+ss
endlocal&set %7=%j%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Call:
%1 待转换的年，两位或者四位（传值调用）
%2 待转换的月，范围是 1/01 到 12，可以以零开头（传值调用）
%3 待转换的日，范围是 1/01 到 31，可以以零开头（传值调用）
%4 待转换的小时，范围是 1/01 到 12 （12小时制，分钟数以“a”或者“p”结尾）或者 0/00 到 23 （24小时制）（传值调用）
%5 待转换的分钟，范围是 00-59 （12小时制需加 a/p 后缀）（传值调用）
%6 待转换的秒钟，范围是 0-59 或者 00-59（传值调用）
%7 该变量用于接收所经过的秒钟数（引用调用）

Example:
setlocal ENABLEEXTENSIONS
call GetDate y m d
call GetTime hh mm ss tt
call DateToSecs %y% %m% %d% %hh% %mm% %ss% secs
echo 从 1970-01-01 00:00:00 到 %y% %m% %d% %hh% %mm% %ss% 所经过的秒数是：%secs%


Name: DateToWeek
FileName: DateToWeek.CMD
Notice: 日期转星期日期
FileDocument:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:DateToWeek %yy% %mm% %dd% yn cw dw
::
:: 作者：Ritchie Lawrence, Updated 2002-11-20. 版本 1.1
::
:: 功能：通过日历日期获取 ISO 8601 星期日期。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的月，可以以零开头（传值调用）
::       %3 待转换的日，可以以零开头（传值调用）
::       %4 该变量用于接收年份，四位（引用调用）
::       %5 该变量用于接收日历星期，两位，01 到 53（引用调用）
::       %6 该变量用于接收星期的第几天，一位，1 到 7（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 待转换的年，两位或者四位（传值调用）
%2 待转换的月，可以以零开头（传值调用）
%3 待转换的日，可以以零开头（传值调用）
%4 该变量用于接收年份，四位（引用调用）
%5 该变量用于接收日历星期，两位，01 到 53（引用调用）
%6 该变量用于接收星期的第几天，一位，1 到 7（引用调用）

Example:
setlocal ENABLEEXTENSIONS
call GetDate y d m
call DateToWeek %y% %m% %d% yn cw dw
echo 今天（ISO 8601 星期日期格式）是：%yn%-W%cw%-%dw%


Name: DayName
FileName: DayName.CMD
Notice: 星期第几天转星期名称
Call: %1 待转换的星期的第几天，1 到 7（传值调用） %2 该变量用于接收该日的星期名称（引用调用）
Example: setlocal ENABLEEXTENSIONS call DayName 3 day echo 星期的第三天是：%day%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DayName %d% day
::
:: 作者：Ritchie Lawrence, 2002-10-04. 版本 1.0
::
:: 功能：通过星期的第几天来获取该日的星期名称，1=星期一, 7=星期日。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的星期的第几天，1 到 7（传值调用）
::       %2 该变量用于接收该日的星期名称（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
for /f "tokens=%1" %%a in ('echo/星期一 星期二 星期三 星期四 星期五^
  星期六 星期日') do endlocal&set %2=%%a&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: DayNumber
FileName: DayNumber.CMD
Notice: 星期名称转星期第几天
Call: %1 待转换的星期名称（传值调用） %2 该变量用于接收该日是星期的第几天（引用调用）
Example: setlocal ENABLEEXTENSIONS call DayNumber 星期二 dow echo 星期二是一个星期中的第 %dow% 天
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DayNumber %Weekday% dow
::
:: 作者：Ritchie Lawrence, 2003-05-14. 版本 1.0
::
:: 功能：通过星期名称获取该天是星期的第几天。如果没有匹配值，则返回空。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的星期名称（传值调用）
::       %2 该变量用于接收该日是星期的第几天（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set i=0
for %%a in (星期一 星期二 星期三 星期四 星期五 星期六 星期日) do (
  set /a i+=1 & echo/%1|findstr /i /b "%%a" >nul && call set dow=%%i%%)
endlocal&set %2=%dow%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: DaysToDate
FileName: DaysToDate.CMD
Notice: 天数转日期
Example: setlocal ENABLEEXTENSIONS call DaysToDate 12345 y m d echo 1970-01-01 加上 12345 天是：%y%-%m%-%d%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DaysToDate %days% yy mm dd
::
:: 作者：Ritchie Lawrence, 2002-06-15. 版本 1.1
::
:: 功能：从 1970-01-01 到指定日期之间所经过的天数对应的日历日期。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 从 1970-01-01 到指定日期之间所经过的天数（传值调用）
::       %2 该变量用于接收年，四位（引用调用）
::       %3 该变量用于接收月，两位，01-12（引用调用）
::       %4 该变量用于接收日，两位，01-31（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 从 1970-01-01 到指定日期之间所经过的天数（传值调用）
%2 该变量用于接收年，四位（引用调用）
%3 该变量用于接收月，两位，01-12（引用调用）
%4 该变量用于接收日，两位，01-31（引用调用）


Name: GetDate
FileName: GetDate.CMD
Notice: 获取本地系统日期
Call: %1 该变量用于接收年，四位（引用调用） %2 该变量用于接收月，两位，01 到 12（引用调用） %3 该变量用于接收日，两位，01 到 31（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetDate y m d echo 今天是：%y%-%m%-%d%
FileDocument:
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: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&set date=
for /f "tokens=1-4 delims=0123456789" %%a in ("%date%")do set delims=%%a%%b%%c%%d
for /f "tokens=1-3 delims=%delims: =% " %%a in ("%date%")do (
endlocal&set %1=%%a&set %2=%%b&set %3=%%c&goto :EOF)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: GetTime
FileName: GetTime.CMD
Notice: 获取本地系统时间
Example: setlocal ENABLEEXTENSIONS call GetTime hh mm ss tt echo 现在时间是：%hh%:%mm%:%ss%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetTime HH mm ss tt
::
:: 作者：Ritchie Lawrence, 2002-06-15. 版本 1.0
::
:: 功能：把本地系统时间赋值给参数 1 到 4。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收小时，两位, 00 到 23（引用调用）
::       %2 该变量用于接收分钟，两位，00 到 59（引用调用）
::       %3 该变量用于接收秒数，两位，00 到 59（引用调用）
::       %4 该变量用于接收百分之一秒，两位，00 到 99（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal&set time=
for /f "tokens=1-4 delims=0123456789" %%a in ("%time%")do set delims=%%a%%b%%c%%d
for /f "tokens=1-4 delims=%delims: =% " %%a in ("%time%")do (
endlocal&(if %TIME:~0,2% leq 9 (set %1=0%%a)else (set %1=%%a))&set %2=%%b&set %3=%%c&set %4=%%d&goto :EOF)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  ', "Notice"='获取本地系统时间', "Call"='%1 该变量用于接收小时，两位，00 到 23（引用调用）
%2 该变量用于接收分钟，两位，00 到 59（引用调用）
%3 该变量用于接收秒钟，两位，00 到 59（引用调用）
%4 该变量用于接收百分之一秒，两位，00 到 99（引用调用）', "Example"='setlocal ENABLEEXTENSIONS
call GetTime hh mm ss tt
echo 现在时间是：%hh%:%mm%:%ss%', "ROWID"=12 WHERE _ROWID_ = 12;

Call:
%1 该变量用于接收小时，两位，00 到 23（引用调用）
%2 该变量用于接收分钟，两位，00 到 59（引用调用）
%3 该变量用于接收秒钟，两位，00 到 59（引用调用）
%4 该变量用于接收百分之一秒，两位，00 到 99（引用调用）


Name: MJDToDate
FileName: MJDToDate.CMD
Notice: 修正儒略日转日期
Call: %1 待转换修正儒略日（传值调用） %2 待转换的年，四位（引用调用） %3 待转换的月，两位，范围是 01 到 12（引用调用） %4 待转换的日，两位，范围是 01 到 31（引用调用）
Example: setlocal ENABLEEXTENSIONS call MJDToDate 55555 y m d echo 修正儒略日 55555 是：%y%-%m%-%d% （圣诞节！）
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:MJDToDate %MJD% yy mm dd
::
:: 作者：Ritchie Lawrence, 2002-06-15. 版本 1.1
::
:: 功能：把一个修正儒略日（MJD）日期转换为协调世界时（UTC）
::       参考日期（第零天）是 1858 年 11 月 17 日
::       适用于 NT4/2000/XP/2003.
:: 
:: Args: %1 待转换修正儒略日（传值调用）
::       %2 待转换的年，四位（引用调用）
::       %3 待转换的月，两位，范围是 01 到 12（引用调用）
::       %4 待转换的日，两位，范围是 01 到 31（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set /a a=%1+2432045,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


Name: MinsToDate
FileName: MinsToDate.CMD
Notice: 分钟数转日期
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:MinsToDate %mins% yy mm dd hh nn
::
:: 作者：Ritchie Lawrence, updated 2003-07-13. 版本 1.1
::
:: 功能：把自从 1970-01-01 00:00 所经过的分钟数转换为日历日期。
::       适用于 NT4/2K/XP/2003.
:: 
:: 参数：%1 待转换为日历日期的分钟数（传值调用）
::       %2 该变量用于接收年，四位（引用调用）
::       %3 该变量用于接收月，两位，范围是 01 到 12（引用调用）
::       %4 该变量用于接收日，两位，范围是 01 到 31（引用调用）
::       %5 该变量用于接收小时，两位，范围是 00 到 23（引用调用）
::       %6 该变量用于接收分钟，两位，范围是 00 到 59（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set /a i=%1,nn=i%%60,i/=60,hh=i%%24,dd=i/24,i/=24
set /a a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
(if %hh% LSS 10 set hh=0%hh%)&(if %nn% LSS 10 set nn=0%nn%)
endlocal&set %6=%nn%&set %5=%hh%&set %4=%dd%&^
set %3=%mm%&set %2=%yy%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 待转换为日历日期的分钟数（传值调用）
%2 该变量用于接收年，四位（引用调用）
%3 该变量用于接收月，两位，范围是 01 到 12（引用调用）
%4 该变量用于接收日，两位，范围是 01 到 31（引用调用）
%5 该变量用于接收小时，两位，范围是 00 到 23（引用调用）
%6 该变量用于接收分钟，两位，范围是 00 到 59（引用调用）

Example:
setlocal ENABLEEXTENSIONS
call GetDate y m d
call GetTime hh mm ss tt
call DateToMins %y% %m% %d% %hh% %mm% mins
set /a mins+=15
call MinsToDate %mins% y m d hh mm
echo 15分钟之后的日期时间是：%y%-%m%-%d% %hh%:%mm%


Name: MonthName
FileName: MonthName.CMD
Notice: 第几个月转月份名称
Call: %1 某个月是当年的第几个月，范围是 1 到 12 或者 01 到 12（传值调用） %2 该变量用于接收该月的名称（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetDate yy mm dd call MonthName %mm% month echo 当前的月份是：%month%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:MonthName %mm% month
::
:: 作者：Ritchie Lawrence, 2002-10-04. 版本 1.0
::
:: 功能：通过某个月是当年的第几个月来获取该月名称。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 某个月是当年的第几个月，范围是 1 到 12 或者 01 到 12（传值调用）
::       %2 该变量用于接收该月的名称（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS&set /a m=100%1%%100
for /f "tokens=%m%" %%a in ('echo/一月 二月 三月 四月 五月 六月 七月 八月^
  九月 十月 十一月 十二月'
) do endlocal&set %2=%%a&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: MonthNumber
FileName: MonthNumber.CMD
Notice: 月份名称转第几个月
Call: %1 待转换的月份名称，范围是一月到十二月（传值调用） %2 该变量用于接收此月是当年的第几个月（引用调用）
Example: setlocal ENABLEEXTENSIONS call MonthNumber 四月 mm echo 四月是第 %mm% 个月
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:MonthNumber %month% mm
::
:: 作者：Ritchie Lawrence, 2003-05-14. 版本 1.0
::
:: 功能：通过月份名称来获取该月是当年的第几个月。
::       返回值是 01 到12，如果没有匹配项，将返回空。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的月份名称，范围是一月到十二月（传值调用）
::       %2 该变量用于接收此月是当年的第几个月（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set i=0
for %%a in (一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月^ 十二月) do (
  set /a i+=1 & echo/%1|findstr /i /b "%%a" >nul && call set mm=%%i%%)
(if 1%mm% LSS 110 set mm=0%mm%) & endlocal&set %2=%mm%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


Name: OrdinalToDate
FileName: OrdinalToDate.CMD
Notice: 序号日期转日历日期
Example: setlocal ENABLEEXTENSIONS call OrdinalToDate 2000 090 y m d echo 2000年的第90天是：%y%-%m%-%d%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:OrdinalToDate %year% %doy% yy mm dd
::
:: 作者：Ritchie Lawrence, 2002-09-29. 版本 1.0
::
:: 功能：通过 ISO 8601 序号日期获取日历日期。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 一年中的第几天，001 到 366（传值调用）
::       %3 该变量用于接收年，四位（引用调用）
::       %4 该变量用于接收月，两位，范围是 01 到 12（引用调用）
::       %5 该变量用于接收日，两位，范围是 01 到 31（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
for /f "tokens=1-2" %%a in ('echo/%1 %2') do set /a yy=%%a,o=1%%b%%1000
set /a z=14-1,z/=12,y=yy+4800-z,m=1+12*z-3,j=153*m+2
set /a j=j/5+1+y*365+y/4-y/100+y/400-2432046,j+=o-1
set /a a=j+2432045,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %3=%yy%&set %4=%mm%&set %5=%dd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 待转换的年，两位或者四位（传值调用）
%2 一年中的第几天，001 到 366（传值调用）
%3 该变量用于接收年，四位（引用调用）
%4 该变量用于接收月，两位，范围是 01 到 12（引用调用）
%5 该变量用于接收日，两位，范围是 01 到 31（引用调用）


Name: SecsToDate
FileName: SecsToDate.CMD
Notice: 秒钟数转日期
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:SecsToDate %secs% yy mm dd hh nn ss
::
:: 作者：Ritchie Lawrence, updated 2002-07-24. 版本 1.1
::
:: Func: 把自从 1970-01-01 00:00:00 所经过的秒钟数转换为日期。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 所经过的秒钟数（传值调用）
::       %2 该变量用于接收年，四位（引用调用）
::       %3 该变量用于接收月，两位，范围是 01 到 12（引用调用）
::       %4 该变量用于接收日，两位，范围是 01 到 31（引用调用）
::       %5 该变量用于接收小时，两位，范围是 00 到 23（引用调用）
::       %6 该变量用于接收分钟，两位，范围是 00 到 59（引用调用）
::       %7 该变量用于接收秒钟，两位，范围是 00 到 59（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set /a i=%1,ss=i%%60,i/=60,nn=i%%60,i/=60,hh=i%%24,dd=i/24,i/=24
set /a a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
(if %hh% LSS 10 set hh=0%hh%)&(if %nn% LSS 10 set nn=0%nn%)
if %ss% LSS 10 set ss=0%ss% 
endlocal&set %7=%ss%&set %6=%nn%&set %5=%hh%&^
set %4=%dd%&set %3=%mm%&set %2=%yy%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Call:
%1 所经过的秒钟数（传值调用）
%2 该变量用于接收年，四位（引用调用）
%3 该变量用于接收月，两位，范围是 01 到 12（引用调用）
%4 该变量用于接收日，两位，范围是 01 到 31（引用调用）
%5 该变量用于接收小时，两位，范围是 00 到 23（引用调用）
%6 该变量用于接收分钟，两位，范围是 00 到 59（引用调用）
%7 该变量用于接收秒钟，两位，范围是 00 到 59（引用调用）

Example:
setlocal ENABLEEXTENSIONS

rem 获取系统安装时间用于演示，与函数的引用无关。
set key="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
set val="InstallDate"
for /f "delims=" %%a in ('reg query %key% /v %val%^|find %val%') do (
  for %%b in (%%a) do set secs=%%b
)
rem 以上代码将系统安装时间对应秒数保存为 %secs%

call SecsToDate %secs% yy mm dd hh nn ss
rem 调用 SecsToDate 将秒数转为对应日期时间

echo Windows 的安装日期是：%yy%-%mm%-%dd% %hh%:%nn%:%ss%


Name: WeekToDate
FileName: WeekToDate.CMD
Notice: 星期日期转日历日期
Example: setlocal ENABLEEXTENSIONS call WeekToDate 2000 15 2 yy mm dd echo 2000年第15个星期的第二天是：%yy%-%mm%-%dd%
FileDocument:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:WeekToDate %yn% %cw% %dw% yy mm dd
::
:: 作者：Ritchie Lawrence, 2002-10-04. 版本 1.0
::
:: 功能：通过 ISO 8601 星期日期获取日历日期。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待转换的年，两位或者四位（传值调用）
::       %2 待转换的日历星期，两位，01 到 53（传值调用）
::       %3 待转换的星期的第几天，一位，1 到 7（传值调用）
::       %4 该变量用于接收年，四位（引用调用）
::       %5 该变量用于接收月，两位，范围是 01 到 12（引用调用）
::       %6 该变量用于接收日，两位，范围是 01 到 31（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yn=%1&set cw=%2&set dw=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a cw=100%cw%%%100,d=3210654
set /a z=14-1,z/=12,y=yn+4800-z,m=1+12*z-3,Jt=153*m+2
set /a Jt=Jt/5+1+y*365+y/4-y/100+y/400-32045,wt=Jt%%7
call set at=%%d:~%wt%,1%%&set /a Jt=at+Jt-3 
set /a Jt=Jt+7*cw+dw-9,a=Jt+32045,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %4=%yy%&set %5=%mm%&set %6=%dd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Call:
%1 待转换的年，两位或者四位（传值调用）
%2 待转换的日历星期，两位，01 到 53（传值调用）
%3 待转换的星期的第几天，一位，1 到 7（传值调用）
%4 该变量用于接收年，四位（引用调用）
%5 该变量用于接收月，两位，范围是 01 到 12（引用调用）
%6 该变量用于接收日，两位，范围是 01 到 31（引用调用）


Name: FileSizeComp
FileName: FileSizeComp.CMD
Notice: 文件大小比较
Call: %1 待比较的文件（传值调用） %2 比较操作符 <EQU | NEQ | LSS | LEQ | GTR | GEQ> （传值调用） %3 以字节为单位的待比较的大小（传值调用）
FileDocument:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:FileSizeComp %file% %operand% %size%
::
:: 作者：Ritchie Lawrence, 2003-08-22. 版本 1.0
::
:: 功能：比较指定文件的大小。如果结果为真，Errorlevel 被设置为 0，如果结果为
::       假，Errorlevel 被设置为 1，如果找不到文件，Errorlevel 被设置为 0。
::       适用于 NT4/2000/XP/2003.
::
:: 参数：%1 待比较的文件（传值调用）
::       %2 比较操作符 <EQU | NEQ | LSS | LEQ | GTR | GEQ> （传值调用）
::       %3 以字节为单位的待比较的大小（传值调用）
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "filter=2^>nul^|findstr/b /v /c:" ""
for /f "tokens=3" %%a in ('dir/-c %1 %filter%') do set z=%%a 0000000000000
if not defined z (endlocal & fc;: 2>nul & goto :EOF) else (set z=%z:~0,13%)
set "c=%3 0000000000000" & call set "c=%%c:~0,13%%"
for /f "tokens=1-4" %%a in ("%z% %c%") do set "z=%%b%%a" & set "c=%%d%%c"
(md;2>nul & if "%z%" %2 "%c%" ver>nul) & (endlocal & goto:EOF)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Example:
call FileSizeComp c:\logs\backup.log GTR 1048576 && (
  echo c:\logs\backup.log is larger than 1MB
) || (
  echo c:\logs\backup.log isn't larger than 1MB
)


Name: IsInPath
FileName: IsInPath.CMD
Notice: 判断文件是否在path中
Call: %1 以空格分开的指定文件列表（传值调用）
FileDocument:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:IsInPath %filelist%
::
:: 作者：Ritchie Lawrence, 2003-11-29. 版本 1.0
::
:: Func: 判断指定文件是否在当前目录或者 path 变量声明的目录中。
::       如果可以找到指定的所有文件，errorlevel 被设置为 0，否则被设置为非 0。
::       适用于 NT4/2000/XP/2003.
::
:: 参数：%1 以空白符分开的指定文件列表（传值调用）
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "path=.;%path%" & set "i="
for %%a in (%*) do for %%b in (%%a) do if not exist "%%~$PATH:b" set "i=1"
ver>nul & if defined i md;2>nul & endlocal & goto :EOF
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

Example:
setlocal ENABLEEXTENSIONS
set "tools="
set "tools=%tools% ping.exe"
set "tools=%tools% find.exe"
set "tools=%tools% drivers\etc\hosts"
rem 若路径含空格需加引号

call IsInPath %tools% && (
  echo/成功：代码所需文件均可找到。
) || (
  echo/错误：无法找到代码所需文件。
)
rem 依次检查各个文件是否存在于当前目录或 %path% 目录下
rem 若能找到代码所需文件，则设 %errorlevel% 值为 0，否则为 1


Name: GetDG
FileName: GetDG.CMD
Notice: 获取默认网关
Call: %1 该变量用于接收默认网关（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetDG dg echo/默认网关是：%dg%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetDG dg
::
:: 作者：Ritchie Lawrence, 2003-09-22. 版本 1.0
::
:: 功能：获取默认网关。如果失败，将返回 0.0.0.0
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收默认网关（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "g=0.0.0.0" & set "j="
for /f "tokens=3" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do (
  if not defined j for %%b in (%%a) do set "g=%%b" & set "j=1")
endlocal & set "%1=%g%" & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: GetIP
FileName: GetIP.CMD
Notice: 获取IP地址
Call: %1 该变量用于接收 IP 地址（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetIP ip echo IP 地址是：%ip%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetIP ip
::
:: 作者：Ritchie Lawrence, 2003-09-22. 版本 1.0
::
:: 功能：主网卡的 IP 地址。如果失败，将返回 0.0.0.0
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收 IP 地址（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "i=0.0.0.0" & set "j="
for /f "tokens=4" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do (
  if not defined j for %%b in (%%a) do set "i=%%b" & set "j=1")
endlocal & set "%1=%i%" & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: GetMAC
FileName: GetMAC.CMD
Notice: 获取MAC地址
Call: %1 该变量用于接收 MAC 地址（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetMAC mac echo MAC address is: %mac%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetMAC mac
::
:: 作者：Ritchie Lawrence, 2003-09-24. 版本 1.0
::
:: 功能：主网卡的 MAC 地址，格式为XX-XX-XX-XX-XX-XX。
::       如果失败，将返回 00-00-00-00-00-00
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收 MAC 地址（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS&set "m=00-00-00-00-00-00"&set "i="&set "j="&set "n=0"
for /f "tokens=3" %%a in ('route print^|find "0.0.0.0"') do if %%a lss a set "i=%%a"&set "j=1"&set "j="
if not defined i endlocal & set "%1=%m%" & goto :EOF
for /f "tokens=2 delims=:" %%a in ('
ipconfig/all^|findstr /r "Physical 物理 Gateway 网关"') do (
if "%%a"==" %i%" (call set m=%%last%%)else set last=%%a)
endlocal & set "%1=%m%" & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: GetNA
FileName: GetNA.CMD
Notice: 获取网络地址
Call: %1 该变量用于接收网络地址（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetNA na echo 网络地址是：%na%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetNA na
::
:: 作者：Ritchie Lawrence, 2003-09-22. 版本 1.0
::
:: 功能：获取主网卡的网络地址。如果失败，将返回 0.0.0.0
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收网络地址（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "i=0.0.0.0" & set "n=0.0.0.0" & set "j="
for /f "tokens=4" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do (
if not defined j (for %%b in (%%a) do set "i=%%b" & set j=1)) & set "k="
for /f "skip=1 tokens=1,3-4" %%a in ('route print^|findstr/b /c:" "') do (
  for %%e in (%%a) do set "x=%%e" & for %%f in (%%b) do set "y=%%f"
  for %%g in (%%c) do set "z=%%g"
  for /f "tokens=1-3" %%a in ('echo/%%x%% %%y%% %%z%%') do (
    if not defined k if "%%c"=="%i%" if "%%b"=="%i%" set k=1 & set n=%%a))
endlocal & set "%1=%n%" & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: GetSM
FileName: GetSM.CMD
Notice: 获取子网掩码
Call: %1 该变量用于接收子网掩码（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetSM sm echo 子网掩码是：%sm%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetSM sm
::
:: 作者：Ritchie Lawrence, 2003-09-22. 版本 1.0
::
:: 功能：获取主网卡的子网掩码。如果失败，将返回 0.0.0.0
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收子网掩码（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "i=0.0.0.0" & set "m=0.0.0.0" & set "j="
for /f "tokens=4" %%a in ('route print^|findstr 0.0.0.0.*0.0.0.0') do (
  if not defined j (for %%b in (%%a) do set "i=%%b" & set j=1)) & set "k="
for /f "skip=1 tokens=2-4" %%a in ('route print^|findstr/b /c:" "') do (
  for %%e in (%%a) do set "x=%%e" & for %%f in (%%b) do set "y=%%f"
  for %%g in (%%c) do set "z=%%g"
  for /f "tokens=1-3" %%a in ('echo/%%x%% %%y%% %%z%%') do (
    if not defined k if "%%c"=="%i%" if "%%b"=="%i%" set k=1 & set m=%%a))
endlocal & set "%1=%m%" & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: GetOS
FileName: GetOS.CMD
Notice: 获取系统版本
Call: %1 该变量用于接收操作系统版本（引用调用）
Example: setlocal ENABLEEXTENSIONS call GetOS ver echo 操作系统版本是：%ver%
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetOS os
::
:: 作者：Ritchie Lawrence, 2003-09-18. 版本 1.0
::
:: 功能：获取操作系统版本。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收操作系统版本（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "cmd=net config work^|findstr/b /c:"软件版本""
for /f "tokens=1-2 delims=." %%a in ('%cmd%') do (
  for %%z in (%%a%%b) do set o=%%z)
endlocal & set "%1=%o:40=NT40%" & (goto :EOF)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: IsRunning
FileName: IsRunning.CMD
Notice: 判断服务状态
Call: %1 待检测服务的显示名称（传值调用）
Example: setlocal ENABLEEXTENSIONS call IsRunning "Task Scheduler" && echo 正在运行 || echo 不在运行
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:IsRunning %svc%
::
:: 作者：Ritchie Lawrence, 2003-10-08. 版本 1.0
::
:: 功能：如果指定的服务正在运行，errorlevel 被设置为 0，否则被设置为 1。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 待检测服务的显示名称（传值调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "svc=%1"
set svc=%svc:"=%
net start | findstr/i /b /e /c:"   %svc%" >nul
endlocal & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: Sleep
FileName: Sleep.CMD
Notice: 延时
Call: %1 延时的秒数（传值调用）
Example: call Sleep 5
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Sleep %secs%
::
:: 作者：Ritchie Lawrence, 2003-09-16. 版本 1.0
::
:: 功能：在批处理文件中延时指定秒数。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 延时的秒数（传值调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set /a n=%1+1
ping -n %n% 127.0.0.1 >nul
endlocal & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: Uptime
FileName: Uptime.CMD
Notice: 获取启动时间
Call: %1 该变量用于接收启动的天数（引用调用） %2 该变量用于接收启动的小时数（引用调用） %3 该变量用于接收启动的分钟数（引用调用） %4 该变量用于接收启动的秒钟数（引用调用）
Example: setlocal ENABLEEXTENSIONS call Uptime d h n s echo 系统运行了：%d% 天，%h% 小时，%n% 分，%s% 秒。
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Uptime days hours mins [secs]
::
:: 作者：Ritchie Lawrence, 2003-09-24. 版本 1.0
::
:: 功能：获取自从上次系统启动经历的天数、小时数、分钟数、秒钟数。
::       适用于 NT4/2000/XP/2003.
:: 
:: 参数：%1 该变量用于接收启动的天数（引用调用）
::       %2 该变量用于接收启动的小时数（引用调用）
::       %3 该变量用于接收启动的分钟数（引用调用）
::       %4 该变量用于接收启动的秒钟数（引用调用）
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set time=
for /f "tokens=1-3 delims=.-/ " %%a in ("%date%") do set yy=%%a&set mm=%%b&set dd=%%c
for /f "tokens=1-3 delims=:. " %%a in ("%time%") do set "hh=%%a" & set "nn=%%b" & set "ss=%%c"
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,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
set hh=%hh: =0%
set /a hh=100%hh%%%100,nn=100%nn%%%100,f=j*1440+hh*60+nn
for /f "tokens=2-7 delims=/:M " %%a in ('net statistics work^|findstr /brc:"Statistics" /c:"统计"') do (
set yy=%%a&set mm=%%b&set dd=%%c&set hh=%%d&set nn=%%e%%f)
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,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
if {%nn:~2,1%} EQU {P} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
if {%nn:~2,1%} EQU {A} if "%hh%" EQU "12" set hh=00
if {%nn:~2,1%} GEQ {A} set nn=%nn:~0,2%
set /a hh=100%hh%%%100,nn=100%nn%%%100,s=j*1440+hh*60+nn,n=f-s
set /a d=n/1440,n%%=1440,h=n/60,n%%=60
endlocal & set "%1=%d%" & set "%2=%h%" & set "%3=%n%" ^
  & (if "%4" NEQ "" set "%4=%ss%") & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  


Name: 2x10
FileName: 2x10.cmd
Notice: 2进制转10进制
FileDocument:
:2x10  2进制转 10进制 @随风 @bbs.bathome.net （封装）
@echo off&setlocal enabledelayedexpansion
set /a nnn=1,num=0&set nn=&set "n=%~1"
set "n=!n:0= 0!"&set "n=!n:1= 1!"
for %%a in (!n!) do set "nn=%%a !nn!"
for %%a in (!nn!) do set /a num+=%%a*nnn,nnn*=2
endlocal&set %~2=%num%&goto :EOF

Example:
call 2x10 11111111111 num
echo 11111111111 = %num%
echo;
call 2x10 101111011001011000010101000 num
echo 101111011001011000010101000 = %num%


Name: 2x16
FileName: 2x16.cmd
Notice: 2进制转16进制
FileDocument:
::以4位一段，分别转换为十六进制,不必考虑超大数问题
::http://bbs.bathome.net/viewthread.php?tid=3372
:2x16 二进制 转 十六进制  @随风 @bbs.bathome.net （封装）
@echo off&setlocal enabledelayedexpansion
set "str=0123456789ABCDEF"
set k=&set kk=&set xx=&set "x=000%~1"
set x=!x:0= 0!&set x=!x:1= 1!&set /a jj=0,ss=1
for %%a in (!x!) do set "xx=%%a !xx!"
for %%a in (!xx!) do (set /a jj+=%%a*ss,ss=ss*2
if !ss! equ 16 set k=!jj! !k!&set /a jj=0,ss=1)
for %%a in (!k!) do set kk=!kk!!str:~%%a,1!
endlocal&set %~2=%kk%&goto :EOF

Example:
call 2x16 11111111111 num
echo 11111111111 = 0x%num%
echo;
call 2x16 101111011001011000010101000 num
echo 101111011001011000010101000 = 0x%num%


Name: 16x2
FileName: 16x2.cmd
Notice: 16进制转2进制
Example: call 16x2 7FF num echo 7FF = %num% echo; call 16x2 5ECB0A8 num echo 5ECB0A8 = %num%
FileDocument:
::以4位一段，分别转换为二进制,不必考虑超大数问题
::http://bbs.bathome.net/viewthread.php?tid=3372
:16x2 十六进制 转 二进制  @随风 @bbs.bathome.net （封装）
@echo off&setlocal enabledelayedexpansion
set str=0123456789abcdef&set ok=&set "num=%~1"
for /l %%a in (0 1 15) do (set ".!str:~%%a,1!=%%a"
call set "num=%%num:!str:~%%a,1!= !str:~%%a,1!%%")
for %%i in (!num!) do (set /a x=0,n=!.%%i!
for %%a in (8 4 2 1) do (set /a x+=%%a
if !n! geq !x! (set ok=!ok!1) else (
set ok=!ok!0&set /a x-=%%a)))
endlocal&set %~2=%ok%&goto :EOF


Name: CheckDate
FileName: CheckDate.cmd
Notice: 检查日期是否合法
FileDocument:
:ChechDate Date(YYYYMMDD)
::检查日期是否合法，合法时将改变 errorlevel 变量的值为 0，非法时为 1，参数格式错误时不作改变
setlocal disabledelayedexpansion
set/a"1/((date=%~1)/10000)" 2>nul||echo call :ChechDate Date(YYYYMMDD)&&exit/b
set/a"b=1,y=%date:~,-4%,m=1%date:~-4,2%-100,d=1%date:~-2%-100,test=!(y%%4|!(y%%100)*!!(y%%400))*!(m^2)+(m+m/8)%%2-2*!(m^2)+30,b=0/(test/d*!(m/13))" 2>nul&&echo Right||echo Wrong
exit/b%b%

Example:
echo 20111215
call CheckDate 20111215
echo   %%errorlevel%%=%errorlevel%
::一个正确的日期
echo;
echo 20110229
call CheckDate 20110229
echo   %%errorlevel%%=%errorlevel%
::一个错误的日期
echo;
echo 20120229
call CheckDate 20120229 >nul
if errorlevel 1 (echo 错误) else echo 正确
echo   可以用 if errorlevel 判断
::也可以用连接符进行正误判断并自定义操作
echo;
echo 20120100
call CheckDate 20120100 >nul&&echo 正确||echo 错误
echo   也可以用管道符判断正误
::也可以用连接符进行正误判断并自定义操作


Name: cheng
FileName: cheng.cmd
Notice: 乘法运算
FileDocument:
:cheng 乘法函数（封装）by @随风 @bbs.bathome.net
::计算任意位数的正整数乘法
::http://bbs.bathome.net/viewthread.php?tid=3372
setlocal enabledelayedexpansion
if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
set f=&set jia=&set ji=&set /a n1=0,n2=0
set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
for /l %%a in (0 1 9) do (
set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
for %%a in (!vard1!) do (set "t="&set /a j=0
for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
set "ji=!t:~-1!!ji!"
if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
set jia=!ss!!t:~0,-1!)
if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
set "ji=!t!!ji:~1!"
Endlocal&set %~3=%ji%&goto :EOF

Example:
call cheng 111222333444555666777888999000 123123123123123123123 num
echo 111222333444555666777888999000*123123123123123123123
echo 的结果为 %num%


Name: chu
FileName: chu.cmd
Notice: 除法运算
FileDocument:
:cu0 500位内整数除法函数（封装）by @随风 bbs.bathome.net
::函数内有 cu1 cu2 cu3 cu4 四个标签，引用时需注意
::http://bbs.bathome.net/viewthread.php?tid=3372
setlocal enabledelayedexpansion&set "lin=00000"
set /a zongw=1000,cs1w=0,cs2w=0,falg=0,x=0
if "!str!"=="1" Endlocal&set %~3=%ff%!num!&goto :EOF
if "%~1"=="0" set sang=0&goto cu4
if "!str!"=="0" set sang=以零为除数的错误。&goto cu4
if not defined xiaosu set /a xiaosu=10
for /l %%a in (1 1 5) do set "lin=!lin!!lin!!lin!"
set sang=&set ppp=&set var1=%~1&set "var2=%~2"
for /f "tokens=* delims=0" %%a in ("!var1!")do set var1=%%a
for /f "tokens=* delims=0" %%a in ("!var2!")do set var2=%%a
for /l %%a in (0 1 9)do (set "var1=!var1:%%a= %%a !"
set "var2=!var2:%%a= %%a !")
for %%a in (!var1!) do set /a cs1w+=1
for %%a in (!var2!) do set /a cs2w+=1
for /l %%a in (1 1 10) do (set t=&set cs=%~2&set/a j=0
for /l %%b in (1 1 !cs2w!) do (set /a a=%%a*!cs:~-1!+j
set t=!a:~-1!!t!&set a=0!a!&set "j=!a:~-2,1!"
set cs=!cs:~0,-1!&set cs%%a=&set "bj%%a=")
if !j! neq 0 (set cs%%a=!lin!!j!!t!&set "bj%%a=!j!!t!"
) else set cs%%a=!lin!!t!&set "bj%%a=!t!"
set "cs%%a=!cs%%a:~-%zongw%!")
set var2=!lin!!var2: =!&set "var2=!var2:~-%zongw%!"
set /a cswc=cs1w-cs2w&set "var1=!var1: =!"
if !cswc! lss 0 (set cswc=!cswc:-=!&set/a flag=1
for /l %%a in (1 1 !cswc!)do (
if %%a leq 11 set sang=0!sang!&set /a x=cswc-1
set "var1=!var1!0")
set "sang=!sang:~0,1!.!sang:~1!")
set ppp=!var1:~0,%cs2w%!&set "var1=!var1:~%cs2w%!"
if !flag! equ 1 (set /a bul=1) else set /a bul=0
goto cu2
:cu1
if not defined var1 (set "var1=0"
if not defined ppp goto cu4
if !flag! equ 0 (set sang=!sang!.&set /a flag=1))
set/a bul=1&set ppp=!ppp!!var1:~0,1!&set "var1=!var1:~1!"
:cu2
if !x! geq %xiaosu% goto cu4
set pvar1=!lin!!ppp!&set "pvar1=!pvar1:~-%zongw%!"
if "!pvar1!" lss "!var2!" (
if !bul! equ 1 (set sang=!sang!0&set /a bul=0
if !flag! equ 1 set /a x+=1)
if "!ppp:~0,1!"=="0" set "ppp="
goto cu1)
if !flag! equ 1 set /a x+=1
set /a bul=0
::计算商
for /l %%a in (1 1 10) do (
if "!cs%%a!" equ "!pvar1!" (
set "sang=!sang!%%a"&set "yu=!bj%%a!"&goto cu3)
if "!cs%%a!" gtr "!pvar1!" (set /a s=%%a-1
set "sang=!sang!!s!"&set yu=!t!&goto cu3)
set "t=!bj%%a!")
:cu3 计算差
set cjs=!ppp!&set cj1=&set m=&set/a jjj=0
for /l %%a in (0 1 9) do set "cjs=!cjs:%%a= %%a !"
for %%a in (!cjs!) do set "cj1=%%a !cj1!"
for %%a in (!cj1!) do (if "!yu!"=="" set/a yu=0
set /a a=%%a-jjj,b=!yu:~-1!
if !a! lss !b! (set /a a+=10,jjj=1)else set/a jjj=0
set /a w=a-b&set m=!w!!m!&set yu=!yu:~0,-1!)
for /f "tokens=* delims=0" %%m in ("!m!") do (
if "%%m"=="" (set m=0) else set "m=%%m")
if !m! equ 0 (
if "!var1:0=!"=="" set sang=!sang!!var1!&goto cu4
set ppp=&goto cu1) else set "ppp=!m!"
goto cu2
:cu4
if "!sang:~0,1!"=="." set "sang=0!sang!"
Endlocal&set %~3=%ff%%sang%&goto :EOF

Example:
call chu 111222333444555666777888999000 123123123123123123123 num
echo 111222333444555666777888999000/123123123123123123123
echo 的结果为 %num%


Name: clean
FileName: clean.cmd
Notice: 清除前N行
Call: %1 Lines 要回退的行数 %2 CleanCols 要清空的行宽，默认=8
FileDocument:
:Clean Lines CleanCols
::用法：
::    call :Clean Lines CleanCols
::          %1  Lines      要回退的行数
::          %2  CleanCols  要清空的行宽，默认=8
::                         有效值为 8~窗口宽度

@echo off&setlocal enabledelayedexpansion&set k=&set clean=
if "	" lss "' " echo 函数中的 Tab 制表符失效&exit/b1
for /l %%a in (1 1 11)do set "k=!k!"
(for /l %%b in (1 1 %~2)do set clean= !clean!
for /l %%a in (1 1 %~1)do (if %~2@ neq @ echo 	!k! !clean!)&echo 	!k!)2>nul
if /i %0==:clean exit/b0

Example:
setlocal enabledelayedexpansion
for /l %%a in (1 1 500) do set /p=%%a <nul
echo;
pause
set /a 行=!random:~,1!+1,宽=!random!%%80,lines+=行
for /l %%a in () do (
	call clean !行! !宽!
	pause>nul
	set /a 行=!random:~,1!+1,宽=!random!%%80,lines+=行
	if !lines! gtr 25 exit
)


Name: colour
FileName: colour.cmd
Notice: 彩色显示文字
Call: %1 为颜色设置 %2 为要彩显的内容
FileDocument:
::findstr 彩显文字，此处 %1 为颜色设置，详见 color /?，%2 为要彩显的内容
:colour attr String
pushd "%temp%"&set/p= <nul>"%~2"&findstr /a:%~1 .* "%~2" nul&del "%~2"&popd

Example:
:colour attr String
call colour 4e T
call colour 2d E
call colour 3f S
call colour 5a T
::不换行显示彩字 TEST


Name: count
FileName: count.cmd
Notice: 统计关键词次数
FileDocument:
:::::::::::::::::::::::::统计关键词出现次数::::::::::::::::::::::::::::::::
:: call :Count  [retvar=][/c: | /g:]Keys  [:: | /f:]Str/File  [retvar]   ::
::                                                                       ::
::       %1    "Key1..KeyN"       需要计数的关键词（不分大小写），关键词 ::
::                            不能含有 * ~ = !，多个关键词以空格间隔，空 ::
::                            格可用 \ 号转义。                          ::
::                   /c:Key       使用指定字符串作为文字搜索字符串，等于 ::
::                            将所有空格转义，将 %1 作为一条关键词看待。 ::
::                  /g:File       如果启用 /g 开关，则从指定的文件获得搜 ::
::                            索字符串，但仅能指定一个目标文件。         ::
::                 retvar=%1      特殊用法，将 retvar= 写在 %1 之前时，  ::
::                            会将计数的结果赋给指定变量，此处指定的变量 ::
::                            名优先于 % 3中设定的变量名，不会与 %1 的其 ::
::                            它语法相冲突。                             ::
::       %2        Str/File       指定需要计算关键词数量的字符串或文指定 ::
::                            件名，兼容通配文件名和相对路径。           ::
::                    ::Str      当以 :: 为前缀时将指定此项为字符串，否  ::
::                            则自行判断是否为文件，为首的 :: 生效后将被 ::
::                            去除，不会干扰计数。                       ::
::                  /f:File      如果启用 /f 开关，将认为此项代表从指定  ::
::                            的文件获取文件列表。                       ::
::       %3          retvar       设定一个变量名，用于保存计数的变量，如 ::
::                            不设置则直接输出结果。                     ::
::                                                                       ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::                                                                       ::
::           函数算法基于变量替换，所以无法对包含 * ~ = ! 的关键词进行   ::
::  函   计数。另外，因为每次替换时都将关键词替换为两个字符宽度，所以当  ::
::       行字符数+(行中出现关键词的总长度-出现关键词的次数*2)>8189 时将  ::
::  数   出错。                                                          ::
::           /g 和 /f 开关都不支持通配文件名，所以使用它们时请指定一个   ::
::  说   确凿有效的文件名。                                              ::
::           部分语法模仿 findstr，以助理解，但仅仅是相似。除可用 \ 转   ::
::  明   义空格之外未提供正则支持。                                      ::
::                                     批处理之家 bbs.bathome.net  Crlf  ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:Count  [retvar=][/c: | /g:]Keys  [:: | /f:]Str/File  [retvar]
setlocal disabledelayedexpansion&set ret=%3&set c=&set ff=&set cf=.&set s=%*
for /f "delims==" %%a in ("%s:"=%")do if %%a==%1 set ret=%1&shift
set s=/?&set "g=%~1"&set "f=%~2"&setlocal enabledelayedexpansion&set gf="
for %%a in (g c) do if !cf!==. if /i !g:~^,3!==/%%a: set g=!g:~3!&set cf=&set %%af=
for /f "tokens=2delims=*~=^!" %%a in (%gf%!g!%gf%)do echo 关键词不能含有 * ~ = ^!&exit/b1
if %~d2==:: (set f=!f:~2!)else set s=&if /i !f:~^,3!==/f: set f=!f:~3!&set ff=/f "usebackeol=:delims="
if "!g:~,1!!g:~-1!"=="""" set g=!g:~1,-1!
dir !s! /a-d "!f!">nul 2>nul&&(set s=useback)||set s=&&set ff=/f "delims="&set c=^


for %%a in ("!c!")do (for %%b in (g f)do if !%%b!.==. echo call :Count Key String/File&exit/b1
if !cf!==. set g=!g:\ =\~!&set g=!g: =%%~a!&set g=!g:\~= !
(for %%b in (cf gf ff)do set %%b=)&setlocal disabledelayedexpansion
for %ff% %%b in ("%f:"=%")do for /f "%s%eol=麤delims=" %%c in ("%%~b")do (echo %%c>>tmp.txt
set s=%%c&setlocal enabledelayedexpansion
for /f "eol==delims=" %%d in (%gf%!g!%gf%)do set "s=[!s:%%d=%%~a]!"
(for /f eol^=麤 %%d in ("!s!")do set/ac+=1)&for /f %%d in ("!c!")do endlocal&set/ac=%%d-1))
endlocal&endlocal&endlocal&2>nul set %ret%=%c%||echo;%c%&if /i %0==:count exit/b0

Call:
%1          Key  需要计数的关键词（不分大小写）.不能以 * 与 ~ 开头，也不能含有 =、!、"
%2  String/File  所需计算关键词数量的字符串或文件.兼容通配文件名和相对路径
%3       retvar  指定用于保存计数的变量，如不设置则直接.显示结果

Example:
echo [ 在字符串中计数 ]
echo;
call Count count=M "VF4HT-MPWB8-TWV6R-K6QM4-W6JCM"
echo 在字符串 "VF4HT-MPWB8-TWV6R-K6QM4-W6JCM" 中一共有 %count% 个 M
::可以将计数值赋予给指定变量以便引用，比如此处将指定字符串中

echo;&echo;
echo 在字符串 “%0” 中，符号 \ 的数量为：
call Count \ ::%0
echo;&echo;
::也可以不将计数值赋予给变量，如果不指定保存计数的变量名，将直接显示结果
pause&cls

echo [ 在文件中计数 ]
echo;
call Count a="c 0" *.bat
echo 当前目录下所有 bat 文件中一共有 %a% 个 “c” 或 “0”
::除了用 %3 指定变量名，还可以写成   call Count 变量名="关键词"  字符串/文件   的形式来赋值

echo;&echo;
set /p=在文件 %0 中 @echo off 的个数为：<nul
call Count /c:"@echo off" %0
::/c 开关可以取消空格的分隔效果，如不取消，关键词将以空格为分隔符分成 @echo 和 off

echo;&echo;
echo 演示脚本中 “call count” 与 “-” 共有：
call Count "call\ count -" %0
::不用 /c 开关的情况下，也可以用 \ 将空格转义，\仅在转义空格后消失
pause&cls

echo [ /g 从文件读取关键词 ]
echo;
(echo c&echo @)>keys.tmp
echo 从 keys.tmp 获取的关键词列表如下：
type keys.tmp
call Count num=/g:keys.tmp %0
echo 在演示脚本中找到的对应关键词共 %num% 个
::可以指定一个文件（仅一个），从中读取关键词用于计数
pause&cls

echo [ /f 从文件读取文件列表 ]
echo;
(dir /b *.bat *.cmd)>file.tmp
echo 从 file.tmp 获取的文件列表如下：
type file.tmp
call Count @ /f:file.tmp N
echo 文件列表中的文件内容中含有 “@” 总共 %N% 个
::可以指定一个文件（仅一个），从中读取需要计数的文件列表
(del keys.tmp file.tmp)>nul
pause


Name: date2days
FileName: date2days.cmd
Notice: 日期转天数函数
FileDocument:
:::::::::::::::::::::::::::::日期转天数函数::::::::::::::::::::::::::::
:date2days
:: 用法1：计算从 1970-01-01 到指定日期之间所经过的天数对应的日历日期。
::  call :Date2Days %yy% %mm% %dd% days
::  参数：%1 待转换的年
::        %2 待转换的月，可以以零开头
::        %3 待转换的日，可以以零开头
::        %4 该变量用于接收所经过的天数（可为空）
::
:: 用法2：计算两个日期的天数差值
::  call :Date2Days %y1% %m1% %d1% %y2% %m2% %d2% days
::  参数：%1 待转换的年1
::        %2 待转换的月1，可以以零开头
::        %3 待转换的日1，可以以零开头
::        %4 待转换的年2
::        %5 待转换的月2，可以以零开头
::        %6 待转换的日2，可以以零开头
::        %7 该变量用于接收所经过的天数（可为空）
::
:: 注：可选项若为空，则显示结果到屏幕，否则把结果存储到相应变量中
::
::                                Made by Crlf     http://bbs.bathome.net
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal disabledelayedexpansion
set/a days=10%~3%%100-719050+30*(m=10%~2%%100)+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!((y=%1)%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400-396-%50/10*!%60
(endlocal&set %7=%days%||set %4=%days%||echo %days%
if %6. neq . call %0 %4 %5 %6 %7 %days%) 2>nul
if /i %0==:date2days exit/b0

Example:
echo date2days 函数效果示例：

call date2days 2011 12 5 n
rem 用法1：计算从 1970-01-01 到指定日期之间所经过的天数对应的日历日期。
rem call :Date2Days %yy% %mm% %dd% days
echo 2011/12/5 在 1970-01-01 之后总共经过了 %n% 天

call date2days 2011 11 30 2011 12 05 n
rem 用法2：计算两个日期的天数差值
rem call :Date2Days %y1% %m1% %d1% %y2% %m2% %d2% days
echo 2011/11/30 与 2011/12/05 相差 %n% 天

echo;
echo 注：新旧日期函数可以通用
echo date2days 与 days2date 两个函数均不判断输入日期的合法性


Name: datelist
FileName: datelist.CMD
Notice: 枚举日期
FileDocument:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 说明： call datelist StartDate EndDate OutputFile delims              ::
::                                                                       ::
::          %1  StartDate  格式为 YYYYMMDD，非纯数字输入将致错           ::
::          %2  EndDate    格式为 YYYYMMDD，非纯数字输入将致错           ::
::          %3  OutputFile 设置一个有效文件名，以供输出，如要输出到屏幕，::
::                         请设为 con                                    ::
::          %4  delims     年月日之间的分隔符，可不填，如为逗号、分号、  ::
::                         空格或制表符等默认分隔符，请加上双引号，分隔  ::
::                         符仅能是一个字符，多设无效。                  ::
::                                                                       ::
:: 由于需要用外部命令 findstr.exe 进行筛选，因此请确保 %path% 变量有效。 ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:datelist StartDate(YYYYMMDD) EndDate(YYYYMMDD) OutputFile    全天占线
setlocal enabledelayedexpansion&set f=&if \%4 neq \ set "f=\%~4"&set f=!f:~,2!
(set/a"start=%~1","end=%~2","test/=^!start*^!end-1" 9>"%~3")2>nul||(
echo :datelist  StartDate(YYYYMMDD^)  EndDate(YYYYMMDD^) outputfile&exit/b1)
for /l %%a in (1 1 31)do set str=0%%a&set md=!md! !str:~-2!
(for /l %%a in (%start:~,-4% 1 %end:~,-4%)do for %%b in (%md:~,36%) do for %%c in (%md%) do (
set/a"test/=(%%a%%b%%c-start|end-%%a%%b%%c)>>31"||echo %%a^%~4%%b^%~4%%c))>"$%~3.$" 2>nul
set f1="0[2469]f31 02f30 11f31 [13579][048]00f02f29 [02468][26]00f02f29"
set f2="[^2]f.. 12f.. 02f[0-1]. 02f2[0-8] ^[48]f02f29 ^[48]00f02f29 [02468][048]f02f29 [13579][26]f02f29"
if %4. neq . set f1=/rc:!f1: =" /c:"!&set f2=/rc:!f2: =" /c:"!
set f1=!f1:f=%f%!&set "f2=!f2:f=%f%!"
findstr /ve !f1! "$%~3.$"|findstr /e !f2!>%3&del /f "$%~3.$">nul 2>nul
if /i %0==:datelist exit/b0

Call:
%1  StartDate  格式为YYYYMMDD
%2  EndDate    格式同上
%3  OutputFile 设置一个有效文件名，以供输出，如要输出到屏幕，请设为 con
%4  delims     年月日之间的分隔符，可不填，假如为逗号、分号、制表符等默认分隔符，请加上双引号，若分隔符中存在空格或 * 字符将出错

Example:
echo 把 20111215 到 20121214 之间的日期输出到 list.txt
call datelist 20111215 20121214 list.txt
list.txt&del list.txt
echo 以 - 作为年月日的分隔符，向屏幕输出 20111214 到 20121231 之间的日期
call datelist 20111214 20120101 con -


Name: days2date
FileName: days2date.cmd
Notice: 天数转日期函数
FileDocument:
:::::::::::::::::::::::::::::天数转日期函数::::::::::::::::::::::::::::
:days2date
:: 用法1：计算从 1970 年 1 月 1 日到给定的日期之间所经过的天数。
::  call :DaysToDate %days% yy mm dd
::  参数：%1 在公元纪年中所经过的天数
::        %2 该变量用于接收年（可选）
::        %3 该变量用于接收月（可选）
::        %4 该变量用于接收日（可选）
::
:: 用法2：日期偏移计算
::  call :DaysToDate %yy% %mm% %dd% %days% yy mm dd
::  参数：%1 该变量用于接收起始年
::        %2 该变量用于接收起始月
::        %3 该变量用于接收起始日
::        %4 偏移天数
::        %5 该变量用于接收年（可选）
::        %6 该变量用于接收月（可选）
::        %7 该变量用于接收日（可选）
::
:: 注：可选项若为空，则显示结果到屏幕，否则把结果存储到相应变量中
::
::                                Made by Crlf     http://bbs.bathome.net
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal disabledelayedexpansion&set d=%1&set /a "1/(!%20+!%30+!%40)" 2>nul||(
set/a "d=10%~3%%100-719162+30*(m=10%~2%%100)+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!((y=%1)%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400-396+%4"
shift&shift&shift)
set/a d-=(d+=719162)/1460-d/36524+d/146096,y=d/365+1,r=!(y%%4)-!(y%%100)+!(y%%400),d+=(d%%=365)/(212+r)*30+r,d+=!!(d/(59+r))*(2-r),m=d/61*2+d%%61/31,d-=m*61/2+m*61%%2-101,m+=101-m/8
endlocal&2>nul set %4=%d:~-2%&&set %3=%m:~-2%&&set %2=%y%||echo %y% %m% %d%
if /i %0==:days2date exit/b0

Example:
echo;&echo days2date 函数效果示例：

call days2date 15425 y m d
rem 用法1：计算从 1970 年 1 月 1 日到给定的日期之间所经过的天数。
rem call :DaysToDate %days% yy mm dd
echo 1970-01-01 后第 15425 天是 %y%/%m%/%d%

call days2date 2011 12 5 5 y m d
rem 用法2：日期偏移计算
rem call :DaysToDate %yy% %mm% %dd% %days% yy mm dd
echo 2011/12/5 的 5 天后是 %y%/%m%/%d%

echo;
echo 注：新旧日期函数可以通用
echo date2days 与 days2date 两个函数均不判断输入日期的合法性


Name: div
FileName: div.cmd
Notice: 除法运算
FileDocument:
:div retvar dividend divisor Acc        Made in http:\\bbs.bathome.net
::   %1    retvar  必须指定将结果保存在某一变量
::   %2  dividend  被除数，可用范围为包括精度在内正负 100 位的整数
::   %3     divisor  除数，不支持超长数和浮点
::   %4       Acc  精度，设定结果精确到小数后几位，若不指定则默认输出整数
setlocal enabledelayedexpansion&(set %1=&set "a=%~2"&set/ab=%3,y=0)2>nul||echo 参数有误&&exit/b1
for /f "delims=-0123456789" %%a in ("0!a!")do set b=
2>nul (set/ax=%4-0,"1/b"&&(for /l %%a in (1 1 %~4)do set a=!a!0
if !a:~100!. neq . set/a!a!))||echo 参数有误&&exit/b1
for /l %%a in (1 1 25)do if defined a (
set c=000!a:~-4,4!&set "num=!c:~-4! !num!"&set a=!a:~,-4!)
(set c=&for %%a in (%num:-=0%)do (set/a"s=(a=~-y*10000+1%%a)/b,y=a%%b"
(if defined c set s=!s:-=0!)&set "x=000!s!"&set c=!c!!x:~-4!)
for /f "tokens=*delims=0" %%a in ("!c!")do set c=%%a
(if %4. neq . set c=!c:~,-%x%!.!c:~-%x%!)&if "!num:-=!" neq "!num!" set c=-!c!)
endlocal&set %1=%c%&if /i %0==:div exit/b0

Call:
%1    retvar  必须指定将结果保存在某一变量
%2  dividend  被除数，可用范围为包括精度在内正负 100 位的整数
%3     divisor  除数，不支持超长数和浮点
%4       Acc  精度，设定结果精确到小数后几位，若不指定则默认输出整数

Example:
@echo off
call div j 12345678901234567890 789
echo 12345678901234567890/789=%j%
echo;
call div j 20000000000000000 123 5
echo 20000000000000000/123=%j%


Name: get_tab
FileName: get_tab.cmd
Notice: 获取制表符通用函数
FileDocument:
::::::::::::::::::::::::get_tab：tab获取通用批处理函数::::::::::::::::::::::::::::
::::::用于高效解决大部分论坛和贴吧自动将tab转为空格导致代码不通用的函数方案:::::::
::::::::::由 batman 首发于 http://bbs.bathome.net/thread-12054-1-8.html:::::::::::

:get_tab retvar
for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined %1 set "%1=%%a
call,set "%1=%%%1:~,-1%%"

Example:
call get_tab t
echo tab%t%也叫做制表符%t%作用是%t%以 8 字节宽度%t%为一节%t%使异行同列能左对齐排版
echo 但是，%t%在贴吧%t%和许多论坛中，%t%制表符%t%经常是不被支持的，使内容走形、无法直接复制运行。
echo 批处理之家的%t%batman%t%为解决这个障碍，%t%提出了%t%从系统文件中
echo 提取制表符的解决方案%t%也就是本函数。
echo;
echo 0%t%1%t%2%t%3%t%4%t%5%t%6%t%7%t%8
echo 1%t%2%t%4%t%8%t%16%t%32%t%64%t%128%t%256


Name: goback
FileName: goback.cmd
Notice: 回退的行数
Call: %1 Lines 要回退的行数
FileDocument:
:Goback Lines
::用法：
::    call :Goback Lines
::          %1 Lines       要回退的行数
::
::               http:\\bbs.bathome.net

@setlocal enabledelayedexpansion&set k=
@if "	" lss "' " echo 函数中的 Tab 制表符失效&endlocal&exit/b1
@for /l %%a in (0 2 %10) do @set "k=!k!"
2>nul @echo 	%k%&set /p=<nul&if /i %0==:goback exit/b0

Example:
title 神奇的回退
set "t=	"
for /l %%a in (1,1,1000) do set "k=!k!"
for /l %%a in (1,1,10) do echo ○○○○○○○○○○
ping /n 2 127.1>nul
:: 这里将光标退回原点处，请仔细注意光标的位置
call goback 10
pause>nul
:: 请注意6-10行第6-10个字符的输出是没有改变的
for /l %%a in (1,1,5) do echo ●●●●●¤¤¤¤¤
for /l %%a in (1,1,5) do echo ⊙⊙⊙⊙⊙
pause>nul


Name: jia
FileName: jia.cmd
Notice: 加法函数
FileDocument:
:jia 加法函数（封装）by @随风 @bbs.bathome.net
::计算任意位数的正整数加法
::http://bbs.bathome.net/viewthread.php?tid=3372
setlocal enabledelayedexpansion&set f=&set "t="
set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
for /l %%a in (0 1 9) do (set vard1=&set "vard2="
set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
(if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
if !j! neq 0 set "t=!j!!t!"
Endlocal&set %~3=%t%&goto :EOF

Example:
call jia 111222333444555666777888999000 123123123123123123123 num
echo 111222333444555666777888999000+123123123123123123123
echo 的结果为 %num%


Name: jian
FileName: jian.cmd
Notice: 减法函数
FileDocument:
:jian 减法函数（封装）by @随风 @bbs.bathome.net
::计算1000位以内的正整数减法
::http://bbs.bathome.net/viewthread.php?tid=3372
setlocal enabledelayedexpansion&&set t=&set f=&set "lin="
for /l %%a in (1 1 10) do set "lin=0000000000!lin!"
set lin=!lin!!lin!!lin!!lin!!lin!&set "lin=!lin!!lin!"
set var1=!lin!%~1&set var2=!lin!%~2&set vard1=&set/a j=0
set var1=!var1:~-1000!&set "var2=!var2:~-1000!"
if "!var1!" lss "!var2!" (set var1=%~2&set "var2=%~1"
set "f=-") else set var1=%~1&set "var2=%~2"
for /l %%a in (0 1 9) do set "var1=!var1:%%a= %%a !"
for %%a in (!var1!) do set "vard1=%%a !vard1!"
for %%a in (!vard1!) do (if "!var2!"=="" set/a var2=0
set /a a=%%a-j,b=!var2:~-1!
if !a! lss !b! (set /a a+=10,j=1)else set /a j=0
set /a w=a-b&set t=!w!!t!&set var2=!var2:~0,-1!)
for /f "tokens=* delims=0" %%a in ("!t!") do (
if "%%a"=="" (set t=0) else set "t=%%a")
Endlocal&set %~3=%f%%t%&goto :EOF

Example:
call jian 111222333444555666777888999000 123123123123123123123 num
echo 111222333444555666777888999000-123123123123123123123
echo 的结果为 %num%


Name: strlen
FileName: strlen.cmd
Notice: 获取变量长度
FileDocument:
:strlen <stringVarName> [retvar] 
:: 思路： 二分回溯联合查表法
:: 说明： 所求字符串大小范围 0K ~ 8K；
::    stringVarName ---- 存放字符串的变量名
::    retvar      ---- 接收字符长度的变量名
:: 原帖：http://www.dostips.com/forum/viewtopic.php?f=3&t=1429

setlocal enabledelayedexpansion
set "$=!%1!#"
set N=&for %%a in (4096 2048 1024 512 256 128 64 32 16)do if !$:~%%a!. NEQ . set/aN+=%%a&set $=!$:~%%a!
set $=!$!fedcba9876543210&set/aN+=0x!$:~16,1!
endlocal&If %2. neq . (set/a%2=%N%)else echo %N%

Example:
call strlen tmp len
echo 变量 tmp 的长度为 %len%
echo;&set test="This is a test"
call strlen test len
echo %test% 的长度为 %len%


Name: weeks
FileName: weeks.cmd
Notice: 日期转星期函数
FileDocument:
::::::::::::::::::::::::::::weeks 日期转星期函数:::::::::::::::::::::::::::::
:: 用法：                                                                  ::
::  call :weeks Date(YYYYMMDD) retvar[.]                                   ::
::        %1  Date(YYYYMMDD)   要计算的日期，不判断是否合法格式            ::
::        %2  retvar[.[eval]]  用于保存星期（1~7）的变量名，变量名不允许含 ::
::                             有=、/、"，否则出错。如要将周日的对应数值由 ::
::                             默认 7 变为 0，请在 retar 后加上一个点，最  ::
::                             后一个点前的内容为 retvar 变量名，该点之后  ::
::                             的内容即为算式。在算式中，? 代表原计算结果，::
::                             可使用任何合法算式，但若引用 f 与 m 变量可  ::
::                             能得出错误结果。                            ::
::                                                                         ::
:: 实例（外部调用）：                                                      ::
::  call weeks 20120108 w             求 20120101 的星期数，保存在 %w% 中  ::
::  call weeks 20120108 w.            将周日设为 0，求星期数，保存在 %w%   ::
::  call weeks 20111215 w.?+4         求 20111215 的星期数，将其加 4 保存  ::
::  call weeks 20111215 w.(?+5)%%%%7  求 20111215 5 天后的星期数           ::
::                                                                         ::
::        http:\\bbs.bathome.net  批处理之家  http:\\www.bathome.net       ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:weeks Date(YYYYMMDD) retvar   ###### 公式算法
setlocal disabledelayedexpansion&set "date=%~1"&if "%~n2"=="%~2" (set f=1)else set f=
for /f "tokens=2delims=." %%a in ("%~2") do set ?=,"?=%%a"
2>nul set /a m+=!((m=1%date:~4,2%-100)/3)*12,?=(7%date:~6,2%+2*m+3*(m+1)/5+(y=%date:~,4%-m/13)+y/4-y/100+y/400+!f)%%7+f%?%
endlocal&set "%~n2=%?%"2>nul||echo %?%&if /i %0==:weeks exit/b0

Call:
%1  Date(YYYYMMDD)   要计算的日期，不判断是否合法格式
%2  retvar[.[eval]]  用于保存星期（1~7）的变量名，变量名不允许含
有=、/、"，否则出错。如要将周日的对应数值由
默认 7 变为 0，请在 retar 后加上一个点，最
后一个点前的内容为 retvar 变量名，该点之后
的内容即为算式。在算式中，? 代表原计算结果
可使用任何合法算式，但若引用 f 与 m 变量可能得出错误结果

Example:
echo;
echo 函数说明中的例子：
call weeks 20120108 w
echo call weeks 20120108 w		设星期日=7（默认），20120108 的星期数为 %w%
call weeks 20120108 w.
echo call weeks 20120108 w.		设星期日=0，20120108 的星期数为 %w%
call weeks 20111215 w.?+4
echo call weeks 20111215 w.?+4	20111215 的星期数加 4 是 %w%
call weeks 20111215 w.(?+5)%%%%7
echo call weeks 20111215 w.(?+5)%%%%7	20111215 的五天后的星期数是 %w%

echo;
echo 也可以不设置返回变量，直接显示 20111215 的星期数：
call weeks 20111215
::不设置 retvar，直接显示结果

echo;
echo 将结果保存在指定变量 %%weeks%% 中，默认周日为0
call weeks 20111215 weeks
echo 20111215 是 星期%weeks%
::retvar，将结果保存在指定变量

echo;
echo 利用 tokens 实现数字星期数转对应单词缩写
call weeks 20111215 星期.
echo 20111215 是 星期%星期%
for /f "tokens=%星期%" %%a in ("Mon Tue Wed Thu Fri Sat Sun") do echo 20110109  is %%a
::周一~周六为 1~6，默认情况下周日对应值为 7，所以可以用作 tokens 参数

echo;&setlocal enabledelayedexpansion
echo 使用算式+变量偏移来截取对应星期数：
set var=SunMonTueWedThuFriSat
::若要使用算式对结果计算，%2 中必须带点，周日的对应值被重设为 0，所以周日排在周一之前
for %%a in (20111129 20111215 20120101) do (
	call weeks %%a w.?*3
	for %%b in (!w!) do echo %%a is !var:~%%b,3!
)
::由于 tokens 的值无法动态变化，所以这里将星期数乘三，再采用变量偏移的方法截取对应缩写。
pause>nul


Name: _colstr
FileName: _colstr.cmd
Notice: 输出彩色字符
FileDocument:
@if %1.==. if not %prompt:~-4%==$s$h (cmd /s/c"prompt %prompt%$s$h&%0/?")
@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 %%a:%%b.==%%a:"%%~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>nul
      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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: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
title %cmdcmdline%
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

Example:
cmd /c _colstr /?
cmd /c _colstr /1
cmd /c _colstr /2
cmd /c _colstr /4
cmd/c _colstr LYellow:"Hello World";\n


Name: downcase
FileName: downcase.cmd
Notice: 小写转大写
Example: set str=falfFDFvlSDFSDFckGmsSDFzlJf;ehmKsd call downcase "%str%" a echo downcase 小写转大写：%a%
FileDocument:
::大写转小写：downcase
::call downcase retvar str
::      %1 指定要处理的字符串
::      %2 指定用于保存返回值的变量名
setlocal enabledelayedexpansion&set $=&set "#=@%~1"
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z)do set #=!#:%%a=%%a!
endlocal&set "%~2=%#:~1%"&exit/b


Name: strlwr
FileName: strlwr.cmd
Notice: 大小写互换
Example: set str=falfFDFvlSDFSDFckGmsSDFzlJf;ehmKsd call strlwr "%str%" a echo strlwr 大小写互转：%a%
FileDocument:
::大小写互转：strlwr
::call strlwr retvar str
::      %1 指定要处理的字符串
::      %2 指定用于保存返回值的变量名
setlocal enabledelayedexpansion&set $=&set "@=@%~1"
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z)do set %%a=%%a
for /l %%a in (1 1 8189)do (
if !@:~%%a^,1!.==. for /f "delims=" %%b in (""!$!"")do endlocal&set "%~2=%%~b"&exit/b
set $=!$!!@:~%%a,1!&if !@:~%%a^,1! leq Z if !@:~%%a^,1! geq a (
for /f %%b in ("!@:~%%a,1!:")do if %%b neq %%~db (set #=%%~db)else set #=!%%b~0!
set $=!$:~,-1!!#:~,1!))


Name: upcase
FileName: upcase.cmd
Notice: 大写转小写
Example: set str=falfFDFvlSDFSDFckGmsSDFzlJf;ehmKsd call upcase "%str%" a echo upcase 大写转小写：%a%
FileDocument:
::小写转大写：upcase
::call upcase retvar str
::      %1 指定要处理的字符串
::      %2 指定用于保存返回值的变量名
setlocal enabledelayedexpansion&set $=&set "#=@%~1"
for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)do set #=!#:%%a=%%a!
endlocal&set "%~2=%#:~1%"&exit/b


Name: ABC
FileName: ABC.cmd
Notice: 大小写转换
FileDocument:
::大小写字母转换：ABC
::call ABC Function retvar str
::      %1 指定一个函数，可选的函数如下：
::             upcase    小写转大写函数
::             downcase  大写转小写函数
::             strlwr    大小写互转函数
::      %2 指定要处理的字符串
::      %3 指定用于保存返回值的变量名

setlocal enabledelayedexpansion&set $=&set "@=@%~2"
if /i "%~1"=="upcase" set $=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
if /i "%~1"=="downcase" set $=a b c d e f g h i j k l m n o p q r s t u v w x y z
if defined $ for %%a in (%$%)do set @=!@:%%a=%%a!
if defined $ endlocal&set "%~3=%@:~1%"&exit/b
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z)do set %%a=%%a
for /l %%a in (0 1 8189)do (
if !@:~%%a^,1!.==. for /f "delims=" %%b in (""!$!"")do endlocal&set "%~2=%%~b"&exit/b
set $=!$!!@:~%%a,1!&if !@:~%%a^,1! leq Z if !@:~%%a^,1! geq a (
for /f %%b in ("!@:~%%a,1!:")do if %%b neq %%~db (set #=%%~db)else set #=!%%b~0!
set $=!$:~,-1!!#:~,1!))

Example:
setlocal enabledelayedexpansion
set str=falfFDFvlSDFSDFckGmsSDFzlJf;ehmKsd
call ABC strlwr a %str%
echo strlwr   大小写互转：%a%
call ABC downcase a %str%
echo downcase 小写转大写：%a%
call ABC upcase a %str%
echo upcase   大写转小写：%a%


