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. 说明:

  1. bat中的函数也是可以递归的
  2. 通常有两种方法返回一定的值
    1. 更改全局环境变量,如errorlevel
    2. 更改参数

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的输出行。