off
call :%1 %2 %3 %4 %5 %6 %7 %8 %9
exit /B
rem 说明:所有函数名(method)及对应的标签名(inner+Method(函数名)+一位数字)和变量名__loc_Vari_Cache$_2012,_return_Value_0,returnValue已使用,调用环境最好不要定义这些标签名和变量名
rem 每次调用函数时,都会把操作结果存进变量returnValue中,打方括号的参数都是可选参数,其他为必填(其实传空值也可以,只是没有什么意义)
rem 调用语法:call :LTrim "str" ["char"]
rem 参数:str--被左trim操作的字符串
rem 参数:char 忽略的字符
rem 返回值:左trim后的字符串
rem 依赖函数:isEmpty
:LTrim
call :isEmpty "%~1" "%~2"
if %ERRORLEVEL%==1 exit /B 1
call :validateTmp
t2=~2
if not "%t2%"=="" set t2= delims=%t2%
for /F "tokens=*%t2%" %%1 in ("%~1") do set returnValue=%%1
goto done
rem 调用语法:call :RTrim "str" ["char"]
rem 参数:str--被右trim操作的字符串
rem 参数:char 忽略的字符
rem 返回值:右trim后的字符串
rem 依赖函数:reverse,isEmpty
:RTrim
call :isEmpty "%~1" "%~2"
if %ERRORLEVEL%==1 exit /B 1
call :validateTmp
set t1=%~1
set t2=%~2
if not "%t2%"=="" set t2= delims=%t2%
:innerRTrim1
if "%t1%"=="" goto done
set t4=%t1:~-4%
for /F "tokens=*%t2%" %%1 in ("%t4%") do set t1=%t1:~0,-4%&&set t8=%%1
if "%t8%"=="" goto innerRTrim1
call :reverse %t4%
for /F "tokens=*%t2%" %%1 in ("%returnValue%") do set t4=%%1
call :reverse %t4%
set returnValue=%t1%%t4%
goto done
rem 调用语法:call :reverse "str"
rem 参数:str--字符串
rem 返回值:顺序相反的字符串
rem 依赖函数:无
:reverse
if "%~1"=="" set _return_Value_0=%returnValue%&&set returnValue=&&exit /B 1
call :validateTmp
set t1=%~1
:innerReverse1
set t2=%t1:~-1%&&set t1=%t1:0,-1%
if not "%t1%"=="" goto innerReverse1
set returnValue=%t2%
goto done
rem 调用语法:call :isEmpty "str" ["char"] ["default"]
rem 参数:str--需要计算长度的字符串
rem 参数:char 把字符串str前端忽略的字符,
rem 参数:default 设置该方法的返回值,
rem 依赖函数:无
:isEmpty
if "%~1"=="" set _return_Value_0=%returnValue%&&set returnValue=%~3&&exit /B 1
for /F "tokens=1 delims=%~2" %%1 in ("%~1") do if "%%1"=="" set _return_Value_0=%returnValue%&&set returnValue=%~3&&exit /B 1
exit /B 0
rem 调用语法:call :getSize "str" ["char"]
rem 参数:str--需要计算长度的字符串
rem 参数:char 把字符串str分隔的字符,非空时返回分隔后的非空子字符串的个数
rem 返回值:数值
rem 依赖函数:isEmpty
:getSize
call :isEmpty "%~1" "%~2" "0"
if %ERRORLEVEL%==1 exit /B 1
call :validateTmp
set t1=%~1
set t2=%~2
set returnValue=0
if "%t2%"=="" goto innerGetSize2
:innerGetSize1
for /F "tokens=1-8,* delims=%t2%" %%1 in ("%t1%") do if not "%%9"=="" set t1=%%9&&set /A returnValue+=8&&goto innerGetSize1
for /F "tokens=1-8 delims=%t2%" %%1 in ("%t1%") do if not "%%5"=="" (set /A returnValue+=4&&set t8=%%8&&set t7=%%7&&set t6=%%6) else (set t8=%%4&&set t7=%%3&&set t6=%%2)
if not "%t7%"=="" set t6=%t8%&&set /A returnValue+=2
if not "%t6%"=="" (set /A returnValue+=2) else set /A returnValue+=1
goto done
:innerGetSize2
set t9=%t1:~32%
if not "%t9%"=="" set t1=%t9%&&set /A returnValue+=32&&goto innerGetSize2
set t9=%t1:~16%
if not "%t9%"=="" set t1=%t9%&&set /A returnValue+=16
set t9=%t1:~8%
if not "%t9%"=="" set t1=%t9%&&set /A returnValue+=8
set t9=%t1:~4%
if not "%t9%"=="" set t1=%t9%&&set /A returnValue+=4
set t9=%t1:~2%
if not "%t9%"=="" set t1=%t9%&&set /A returnValue+=2
if not "%t1:~1%"=="" (set /A returnValue+=2) else set /A returnValue+=1
goto done
rem 调用语法:call :startsWith "str" "prefix" ["char"]
rem 参数:str--检查前缀是否是prefix的字符串
rem 参数:prefix--检查的前缀
rem 参数:char 把字符串str分隔的字符,非空时忽略左端的这些字符进行比较
rem 返回值:Y/N
rem 依赖函数:getSize,LTrim,isEmpty
:startsWith
call :isEmpty "%~2" "%~3" "Y"
if %ERRORLEVEL%==1 exit /B 1
call :isEmpty "%~1" "%~3" "N"
if %ERRORLEVEL%==1 (for /F "tokens=1 delims=%~2" %%A in ("%~1") do if "%%A"=="" set returnValue=Y)&&exit /B 1
call :validateTmp
set t1=%~1
set t2=%~2
set t3=%~3
set returnValue=Y
LTrim "%t1%" "%t3%"
set t1=%returnValue%
LTrim "%t2%" "%t3%"
set t2=%returnValue%
call :getSize "%t2%"
set t8=%returnValue%
call :getSize "%t1%
set t7=%returnValue%
if %t8% GTR %t7% set returnValue=N&&goto done
set returnValue=Y
:innerStartsWith2
if not "%t4%"=="%t5%" set returnValue=N&&goto done
if "%t2%"=="" goto done
if "%t1%"=="" set returnValue=N&&goto done
set t4=%t1:~0,16%
set t1=%t1:~16%
set t5=%t2:~0,16%
set t2=%t2:~16%
set /A t9=%t8%-16
if %t9% GTR 0 set t8=%t9%&&goto innerStartsWith2
if not "%t4:~0,8%"=="%t5:~0,8%" set returnValue=N&&goto done
set t4=%t4:~8%&&set t5=%t4:~8%
if "%t5%"=="" goto done
if not "%t4:~0,4%"=="%t5:~0,4%" set returnValue=N&&goto done
set t4=%t4:~4%&&set t5=%t4:~4%
if "%t5%"=="" goto done
if not "%t4:~0,2%"=="%t5:~0,2%" set returnValue=N&&goto done
set t4=%t4:~2%&&set t5=%t4:~2%
if "%t5%"=="" goto done
set t4=%t4:~1%&&set t5=%t4:~1%
if "%t5%"=="" goto done
if not "%t4%"=="%t5%" set returnValue=N
goto done
rem 调用语法:call :removeFirst "str" ["num=1"] ["char"]
rem 参数:str--移除前缀的字符串
rem 参数:num--移除的个数
rem 参数:char 把字符串str分隔的字符,非空时按分隔后的非空子字符串为单位移除,否则按一个字符单位移除
rem 返回值:移除前缀后的字符串
rem 依赖函数:getSize,isEmpty
:removeFirst
call :isEmpty "%~1" "%~3" "%~1"
if %ERRORLEVEL%==1 exit /B 1
call :validateTmp
set t1=%~1
set t2=%~2
set t3=%~3
if "%t2%"=="" set t2=1
call :getSize "%t1%" "%t3%"
if %t2% GEQ %returnValue% set returnValue=&&goto done
if %t2% LSS 0 set /A t2+=%returnValue%
if %t2% LSS 1 set returnValue=%t1%&&goto done
if "%t3%"=="" goto innerRemoveFirst2
:innerRemoveFirst1
set /A t9=%t2%-9
if %t9% GTR 0 for /F "tokens=1-9,* delims=%t3%" %%0 in ("%t1%") do set t1=%%9&&set t2=%t9%&&goto innerRemoveFirst1
for /F "tokens=1-%t2%,* delims=%t3%" %%0 in ("%t1%") do set t1=%%%t2%
set returnValue=%t1%
goto done
:innerRemoveFirst2
set /A t9=%t2%-32
if %t9% GEQ 0 set t1=%t1:~32%&&set t2=%t9%&&goto innerRemoveFirst2
set returnValue=%t1%
if %t2% EQU 0 goto done
set /A t9=%t2%-16
if %t9% GEQ 0 set returnValue=%returnValue:~16%&&set t2=%t9%
if %t2% EQU 0 goto done
set /A t9=%t2%-8
if %t9% GEQ 0 set returnValue=%returnValue:~8%&&set t2=%t9%
if %t2% EQU 0 goto done
set /A t9=%t2%-4
if %t9% GEQ 0 set returnValue=%returnValue:~4%&&set t2=%t9%
if %t2% EQU 0 goto done
set /A t9=%t2%-2
if %t9% GEQ 0 set returnValue=%returnValue:~2%
if %t9% EQU 1 set returnValue=%returnValue:~1%
goto done
rem 调用语法:call :indexOf "str" "substr" ["index=0"] ["char"]
rem 参数:str--被查找的字符串
rem 参数:substr--查找的字符串
rem 参数:index--查找的开始位置
rem 参数:char 把字符串str分隔的字符,非空时忽略分隔符并按分隔后的非空子字符串为单位查找
rem 返回值:第一个的位置
rem 依赖函数:getSize,removeFirst,startsWith
:indexOf
call :validateTmp
set t1=%~1
set t2=%~2
set t4=%~4
call :getSize "%t1%" "%t4%"
set t6=%returnValue%
call :getSize "%t2%" "%t4%"
set t5=%returnValue%
set t3=%~3
if "%t3%"=="" set t3=0
if %t3% GTR %t6% set returnValue=-1&&goto done
if %t3% LSS 0 set /A t3+=%t6%
if %t3% LSS 0 set t3=0
call :removeFirst "%t1%" "%t3%" "%t4%"
set t1=%returnValue%
set returnValue=t3
if "%t1%"=="%t2%" goto done
if "%t2%"=="" goto done
if "%t4%"=="" goto innerIndexOf2
:innerIndexOf1
if "%t1%"=="" set returnValue=-1&&goto done
if %t6% LSS %t5% set returnValue=-1&&goto done
call :startsWith "%t1%" "%t2%" "%t4%"
set t9=%returnValue%
set returnValue=%_return_Value_0%
if "%t9%"=="Y" goto done
for /F "tokens=1,* delims=%t4%" %%A in ("%t1%") do set t1=%%B
set /A returnValue+=1
set /A t6-=1
goto innerIndexOf1
:innerIndexOf2
if "%t1%"=="" set returnValue=-1&&goto done
if %t6% LSS %t5% set returnValue=-1&&goto done
call :startsWith "%t1%" "%t2%"
set t9=%returnValue%
set returnValue=%_return_Value_0%
if "%t9%"=="Y" goto done
set t1=%t1:~1%
set /A returnValue+=1
set /A t6-=1
goto innerIndexOf2
rem 调用语法:call :substring "str" ["start"] ["end"] ["char"]
rem 参数:str--原字符串
rem 参数:start--截取范围的开始位置,可以大于end
rem 参数:end--截取范围的结束位置
rem 参数:char 把字符串str分隔的字符,非空时按分隔后的非空子字符串为单位获取,否则按一个字符单位获取
rem 返回值:截取的子字符串
rem 依赖函数:getSize,substr,isEmpty
:substring
call :isEmpty "%~1" "%~4"
if %ERRORLEVEL%==1 exit /B 1
call :validateTmp
set t1=%~1
set t2=%~2
set t3=%~3
set t4=%~4
if "%t2%"=="" set t2=0
set /A returnValue=t3
if "%t3%"=="" call :getSize "%t1%" "%t4%"
set t3=%returnValue%-%t2%
call :substr "%t1%" "%t2%" "%t3%" "%t4%"
goto done
rem 调用语法:call :substr "str" ["start"] ["len"] ["char"]
rem 参数:str--原字符串
rem 参数:start--截取的开始位置
rem 参数:len--截取的长度
rem 参数:char 把字符串str分隔的字符,非空时按分隔后的非空子字符串为单位截取
rem 返回值:截取的子字符串
rem 依赖函数:removeFirst,getFirst,isEmpty
:substr
call :isEmpty "%~1" "%~4" "%~1"
if %ERRORLEVEL%==1 exit /B 1
call :validateTmp
set t1=%~1
set t2=%~2
set t3=%~3
set t4=%~4
if "%t3%"=="" goto innerSubstr2
if %t3% LSS 0 set /A t2+=%t3%&&set t3=-%t3%
:innerSubstr2
call :removeFirst "%t1%" "%t2%" "%t4%"
set t1=%returnValue%
if "%t1%"=="" goto done
if not "%t3%"=="" goto innerSubstr1
if "%t4%"=="" set t4=\
for /F "tokens=1 delims=%t4%" %%1 in ("%t1%") do set returnValue=%%1&&goto done
:innerSubstr1
call :getFirst "%t1%" "%t3%" "%t4%"
goto done
rem 调用语法:call :endsWith "str" "suffix" ["char"]
rem 参数:str--检查后缀是否是suffix的字符串
rem 参数:suffix--检查的后缀
rem 参数:char 把字符串str分隔的字符,非空时忽略右端分隔符进行比较
rem 返回值:Y/N
rem 依赖函数:getSize,removeFirst,RTrim
:endsWith
call :isEmpty "%~2" "%~3" "Y"
if %ERRORLEVEL%==1 exit /B 1
call :isEmpty "%~1" "%~3" "N"
if %ERRORLEVEL%==1 (for /F "tokens=1 delims=%~2" %%A in ("%~1") do if "%%A"=="" set returnValue=Y)&&exit /B 1
call :validateTmp
set t1=%~1
set t2=%~2
set returnValue=Y
set t3=%~3
call :getSize "%t2%" "%t3%"
set t8=%returnValue%
call :removeFirst "%t1%" "-%t8%" "%t3%"
if "%t3%"=="" goto innerEndsWith2
call :RTrim "%returnValue%" "%t3%"
set t1=%returnValue%
call :RTrim "%t2%" "%t3%"
set t2=%returnValue%
:innerEndsWith2
if "%t1%"=="%t2%" (set returnValue=Y) else set returnValue=N
goto done
rem 调用语法:call :getFirst "str" ["num=1"] ["char"]
rem 参数:str--被获取前缀的字符串
rem 参数:num--获取的个数
rem 参数:char 把字符串str分隔的字符,非空时按分隔后的非空子字符串为单位获取,否则按一个字符单位获取
rem 返回值:获取前缀后的字符串
rem 依赖函数:getSize,removeFirst
:getFirst
call :validateTmp
set t1=%~1
if "%t1%"=="" goto done
set t2=%~2
set t3=%~3
call :getSize "%t1%"
set t8=%returnValue%
set returnValue=%_return_Value_0%
if not "%t3%"=="" goto innerGetFirst1
if "%t2%"=="" set t2=1
if %t2% GEQ %t8% set returnValue=%t1%&&goto done
if %t2% LEQ -%t8% goto done
goto innerGetFirst2
:innerGetFirst1
call :removeFirst "%t1%" "%t2%" "%t3%"
if "%t1%"=="%returnValue%" set returnValue=&&goto done
call :getSize "%returnValue%"
set /A t2=%t8%-%returnValue%
set returnValue=
:innerGetFirst2
set /A t9=%t2%-32
if %t9% GEQ 0 set returnValue=%returnValue%%t1:~0,32%&&set t1=%t1:~32%&&t2=%t9%&&goto innerGetFirst2
if %t2% EQU 0 goto done
set /A t9=%t2%-16
if %t9% GEQ 0 set returnValue=%returnValue%%t1:~0,16%&&set t1=%t1:~16%&&t2=%t9%
if %t2% EQU 0 goto done
set /A t9=%t2%-8
if %t9% GEQ 0 set returnValue=%returnValue%%t1:~0,8%&&set t1=%t1:~8%&&t2=%t9%
if %t2% EQU 0 goto done
set /A t9=%t2%-4
if %t9% GEQ 0 set returnValue=%returnValue%%t1:~0,4%&&set t1=%t1:~4%&&t2=%t9%
if %t2% EQU 0 goto done
set /A t9=%t2%-2
if %t9% GEQ 0 (set returnValue=%returnValue%%t1:~0,2%) else (set returnValue=%returnValue%%t1:~0,1%)
goto done
rem 模拟方法内部局部变量的栈,是所有的方法调用的基础!,
:validateTmp
set t1=A%t1%&&set t2=A%t2%&&set t3=A%t3%&&set t4=A%t4%&&set t5=A%t5%&&set t6=A%t6%&&set t7=A%t7%&&set t8=A%t8%&&set t9=A%t9%&&set returnValue=A%returnValue%
set __loc_Vari_Cache$_2012=%t1:#=+uG$3D%#%t2:#=+uG$3D%#%t3:#=+uG$3D%#%t4:#=+uG$3D%#%t5:#=+uG$3D%#%t6:#=+uG$3D%#%t7:#=+uG$3D%#%t8:#=+uG$3D%#%t9:#=+uG$3D%#%returnValue:#=+uG$3D%#%__loc_Vari_Cache$_2012%
set t1=&&set t2=&&set t3=&&set t4=&&set t5=&&set t6=&&set t7=&&set t8=&&set t9=&&set returnValue=
exit /B
:done
for /F "tokens=1-10,* delims=#" %%A in ("%__loc_Vari_Cache$_2012%") do set t1=%%A&&set t2=%%B&&set t3=%%C&&set t4=%%D&&set t5=%%E&&set t6=%%F&&set t7=%%G&&set t8=%%H&&set t9=%%I&&set _return_Value_0=%%J&&set __loc_Vari_Cache$_2012=%%K
set t1=%t1:+uG$3D=#%&&set t2=%t2:+uG$3D=#%&&set t3=%t3:+uG$3D=#%&&set t4=%t4:+uG$3D=#%&&set t5=%t5:+uG$3D=#%&&set t6=%t6:+uG$3D=#%&&set t7=%t7:+uG$3D=#%&&set t8=%t8:+uG$3D=#%&&set t9=%t9:+uG$3D=#%&&set _return_Value_0=%_return_Value_0:+uG$3D=#%
set t1=%t1:~1%&&set t2=%t2:~1%&&set t3=%t3:~1%&&set t4=%t4:~1%&&set t5=%t5:~1%&&set t6=%t6:~1%&&set t7=%t7:~1%&&set t8=%t8:~1%&&set t9=%t9:~1%&&set _return_Value_0=%_return_Value_0:~1%
:end