函数实际上是在任何过程编码语言中重用代码的方法。然而DOS缺乏真正的功能关键字,但是你可以提供过CALL 关键字来实现。

有两个需要注意的问题:

  1. “函数”需要在脚本的底部通过标签来定义
  2. 脚本的主要逻辑(主函数)需要 EXIT /B [errorcode] 这样可以组织主逻辑进入函数。

定义一个函数


在本例中,我们将实现一个简单版的*nix tee1实用程序,以将消息写入到文件和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命令解析输出。

调用者也可以通过修改全局变量传递数据,不过,尽量避免这种方法。

参考资料


  1. tee是一个常见的指令,它能够将某个指令的标准输出,导向、存入某个档案中