[BATCH] 用.bat文件写函数

如何用批处理文件实现类似下方的 java 代码的效果呢?

public class Demo{
    public static int add(int... num){
        int rsl = 0;
        for(int i : num){
            rsl+=i;
        }
    return rsl;
    }
    public static void main(String[] args){
        System.out.println(add(1,2,3));
    }
}

先直接给出代码:

add.bat

@echo off
set /a rsl=0
:do
  if {%1}=={} exit /b %rsl%
  set /a rsl=%rsl%+%1
  shift
  goto :do
goto :EOF

demo.bat

@echo off
call add.bat 1 2 3
echo.%errorlevel%
pause

运行 demo.bat 即可得到结果6。

下面讲一下部分指令的作用。

一、exit /b %rsl%

我们直接引用

exit /?

所得到的的信息:

退出 CMD.EXE 程序(命令解释器)或当前批处理脚本。
EXIT [/B] [exitCode]
/B 指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个
批处理脚本外执行,则会退出 CMD.EXE
exitCode 指定一个数字号码。如果指定了 /B,将 ERRORLEVEL
设成那个数字。如果退出 CMD.EXE,则用那个数字设置
过程退出代码。

可以看到,当我们执行

call add.bat 1 2 3

的时候,变量 errorlevel 会被设为 rsl 的值。我们可以通过这种方法获得函数所处理出来的值(仅限整型)。

二、shift

继续通过 shift /? 获取帮助:

更改批处理文件中可替换参数的位置。
SHIFT [/n]
如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

原本我们调用 add.bat 时,%1、%2、%3会分别设为1、2、3。每当我们将 %1 的值加进 rsl 时,便可用 shift 指令令参数位移,这样便能实现类似 java 的可变参数的效果。

可惜这种方法只能返回整型,若要返回其他种类的数据,可以通过在函数内部定义变量(比如在该例子中,定义 add_rsl),函数执行完后直接在外部调用该变量即可。

以下是例子:

@echo off
call :add 1 2 3
echo.%add_rsl%
pause
goto :EOF

:add
 set /a add_rsl=0
:add_do
  if {%1}=={} goto :EOF
  set /a add_rsl=%add_rsl%+%1
  shift
  goto :add_do
goto :EOF

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据