Archive for July, 2010

批处理的“函数调用”

2010-7-18 00:39 | by 2ndboy

  今天看 Visual Studio 2008 里环境设置批处理的时候学到一招,就是在批处理里面可以模拟出函数调用的效果,可以传参数也可以从“函数”里返回值,示例如下:

  1. @echo off
  2. call :foo 2ndboy
  3. call :foo World
  4.  
  5. goto :EOF
  6.  
  7. :foo
  8. echo Hello %1 !
  9. exit /b

说白了就是 call 现在直接支持调用本批处理里面的一个标签,而不是我们以前熟知的调用另外一个批处理。但是其实内部的原理还是把批处理自身当作另外一个批处理来调用(创建新的上下文),只不过是直接调用到了标签这个级别罢了。所以在被调用标签的最后的 exit /b 就相当于是函数调用里面的 return,跟 return 一样,exit 也可以把特定的值返回给调用方,比如用 exit /b 0 返回 0。这样一来调用方还可以根据返回值做不同的处理(if %ERRORLEVEL%==0 echo ok)。

exit /b 还可以用 goto :EOF 来代替,两者都可以从被调用标签内部返回到 call 命令的下一行继续执行,区别是 goto :EOF 不带返回值。

最近在断续实战 Hudson 的时候补了不少批处理命令的课,发现 Windows 命令行已经增强了很多,远非 DOS 时代我熟悉的那些有限功能。当然,离 *nix shell 或者 PowerShell 还是有差距的,不过它对环境的依赖也最少,有时候信手拈来用用还是不错滴。