参考:
https://www.dostips.com/DtTutoFunctions.php#FunctionTutorial.RecursiveFunctions
最近做svn工具发现批处理能用递归很好奇的研究了一下,网上找了几个实例,但自己一写就总是不对,记录一下,主要是对批处理理解不深入
批处理递归主要用setlocal命令来缓存原来的变量 使用endlocal 后再还原原来的变量 达到不相互影响的效果
关键句是
结束当前的块,这样程序恢复上次的变量
set /a %~1=%NextLen% 相当于把当前结果往上传
最近做svn工具发现批处理能用递归很好奇的研究了一下,网上找了几个实例,但自己一写就总是不对,记录一下,主要是对批处理理解不深入
批处理递归主要用setlocal命令来缓存原来的变量 使用endlocal 后再还原原来的变量 达到不相互影响的效果
@echo on
prompt $G
setlocal enabledelayedexpansion
set mystring=1xxxx
set /a sLength=0
call :strLen sLength %mystring%
echo mystring=%mystring% sLength=%sLength%
pause
:strLen
if "%~2" equ "" set lenName=0 & goto :eof rem empty string process
setlocal
set /a lenName=%~1
set str=%~2
if "!str:~%lenName%!" neq "" set /a NextLen=lenName+1 &call :strLen NextLen,%str%
(endlocal &set /a %~1=%NextLen%)
goto :eof
pause
递归完成后再返回来的值 是通过一个专门的变量名来层层传递的
关键句是
(endlocal &set /a %~1=%NextLen%)
&这个运算符不能省 意思是在一行执行
结束当前的块,这样程序恢复上次的变量
set /a %~1=%NextLen% 相当于把当前结果往上传
这样一层一层往上返回 达到了目的