1. 实例:
@echo off
set x=Outer
set y=Outer
echo before function_1 x=%x% , y=%y%
CALL :function_1 x y
echo after function_1 x=%x% , y=%y%
CALL :function_2 x y
echo after function_2 x=%x% , y=%y%
::在主程序中用exit /b %errorlevel%来结束程序,防止直接进入子程序
EXIT /B %ERRORLEVEL%
:function_1
set x=Inner1
set %2=Inner1
:: 当没有SETLOCAL时,以上两种set方式都能改变函数外的变量的值
EXIT /B 0
:function_2
SETLOCAL
set x=Inner2
set %2=Inner2
:: 当有SETLOCAL时,函数内部对变量的修改不影响函数外部的变量的值
ENDLOCAL
EXIT /B 0输出为
before function_1 x=Outer , y=Outer
after function_1 x=Inner1 , y=Inner1
after function_2 x=Inner1 , y=Inner1
2. 说明:
- bat中的函数也是可以递归的
- 通常有两种方法返回一定的值
- 更改全局环境变量,如errorlevel
- 更改参数
2.1. 形式参数
2.1.1.1. 通用形参:
%0表示函数本身,即标签名
%1表示第一个位置的实参
%2表示第二个位置的实参
…
%9表示第九个位置的实参
%*表示所有实参
2.1.1.2. 针对文件名和目录的形参:
- %~1 删除%1的引号(”)
- %~f1 %1 的绝对路径
- %~d1 %1 的驱动器号
- %~p1 不包含文件和盘符的%1绝对路径
- %~n1 %1 的单独文件名(不包含拓展名)
- %~x1 %1 的文件扩展名
- %~s1 只含有短名的%1绝对路径
- %~a1 %1 的文件属性
- %~t1 %1 文件的日期/时间
- %~z1 %1 文件的大小
- %~$PATH:1 查找列在 PATH 环境变量的目录,值为找到的第一个完全匹配%1的名称。如果环境量名未被定义,或者没有找到文件,此值为空字符串
可以将增强符组合起来,可取得多重结果:
- %~dp1 不包含文件的%1绝对路径
- %~nx1 %1 的文件名和扩展名
- %~dp$PATH:1 查找列在 PATH 环境变量的目录,值为找到的第一个完全匹配%1的盘符和路径。如果环境量名未被定义,或者没有找到文件,此值为空字符串
- %~ftza1 类似 DIR %1的输出行。