函数实际上是在任何过程编码语言中重用代码的方法。然而DOS缺乏真正的功能关键字,但是你可以提供过CALL
关键字来实现。
有两个需要注意的问题:
- “函数”需要在脚本的底部通过标签来定义
- 脚本的主要逻辑(主函数)需要
EXIT /B [errorcode]
这样可以组织主逻辑进入函数。
定义一个函数
在本例中,我们将实现一个简单版的*nix tee[1]实用程序,以将消息写入到文件和stdout流中。我们将在整个脚本中使用一个全局变量,在函数中使用%log%
。
@ECHO OFF
SETLOCAL
:: script global variables
SET me=%~n0
SET log=%TEMP%\%me%.txt
:: The "main" logic of the script
IF EXIST "%log%" DEL /Q %log% >NUL
:: do something cool, then log it
CALL :tee "%me%: Hello, world!"
:: force execution to quit at the end of the "main" logic
EXIT /B %ERRORLEVEL%
:: a function to write to a log file and write to stdout
:tee
ECHO %* >> "%log%"
ECHO %*
EXIT /B 0
调用函数
使用CALL
关键字来调用函数。可以传递命令行参数,就像调用另一批处理文件一样。必须记住在结束时EXIT /B
关键字。遗憾的是,除了退出代码之外,什么都不能返回。
返回值
调用的返回值始终是函数的退出代码。与任何可执行文件的调用一样,调用者读取%ERRORLEVEL%
获得退出代码。除了整数返回代码以外,你必须用其他创造性的方式来输出。可以ECHO
标准输出,让调用者决定通过将输出连接到另一个可执行文件、重定向到文件或通过FOR
命令解析输出。
调用者也可以通过修改全局变量传递数据,不过,尽量避免这种方法。