如何用批处理文件实现类似下方的 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