批处理命令之函数传参和跳转详解
作者:微小冷
函数
函数封装是编程语言必不可少的环节,而函数在创建时,至少需要有一个函数标识,同时需要一块区域,来组成函数体。Dos中的函数用标签来标识,以goto:eof结束,比如现在新建一个脚本func.bat
@echo off call:func echo end of call goto:eof :func echo call me goto:eof
上面4行类似于主函数,@echo off关闭回显,然后调用func,调用结束之后打印end of call,最后使用goto:eof,结束命令行。
下面三行可以理解为自定义函数,内容是打印call me。
运行结果如下
>test.bat
call me
end of call
即命令行先打印了call me,后打印end of call,说明其运行过程的确是先调用了func,然后再执行的echo end of call。
参数传递
对于一个脚本来说,如果想在调用bat文件时进行参数传递,则可用%或者%~来标识传进来的参数,二者的区别是,后者会自动删除参数中的引号,而前者不会。例如下面一个名为para.bat的脚本
:: para.bat @echo you've given me %1 or %~1
在命令行中调用的结果如下
>para "123"
you've given me "123" or 123
函数传参也采用了这种逻辑,下面修改test.bat脚本如下
@echo off call:func 100 echo end of call goto:eof :func echo you've given me %1 goto:eof
运行结果如下
>test.bat
you've given me 100
end of call
返回值
DOS函数没有返回值,若想保留函数中的计算结果,要么将其设为全局变量,要么采用“参数引用”,即直接更改传入参数的值。先来看第一种
:: func1.bat @echo off call :sum 10 20 echo sum(10,20)=%result% goto :eof :sum set /a result=%1 + %2 goto :eof
其中采用set指令,将result设为传入两个参数的和,随后在主程序中直接调用%result%,并得到了正确的结果,如下所示
>func1
sum(10,20)=30
另一种方法u是直接把想要返回的变量作为参数传入函数中,示例如下
:: func2.bat @echo off call :sum 10 20 result echo sum(10, 20)=%result% goto :eof :sum set /a %3=%1 + %2 goto :eof
这里面把result作为参数传入了sum函数中,而sum函数的逻辑是,让传入的第三个参数等于前两个参数之和,这样就在不创建“全局变量”的情况下,对result赋值了。
局部变量保护
通过set命令创建的变量,默认就是全局的,这一点已经在func1.bat中得到了认证。但全局变量太多容易导致程序变得混乱,虽然不太可能用批处理语句去写什么大工程,但就算用了两次for循环,都会引起全局变量变化的风险,所以局部变量保护还是有存在的意义的。
在批处理语句中,setlocal和endlocal中间的函数段,set所设置的参数便是局部的。为此可对func1的sum函数稍作修改
:: func3.bat :: 主程序与func1.bat相同 :sum setlocal set /a result=%1 + %2 endlocal goto :eof
这样运行结果就会变成
>func3.bat
sum(10,20)=
也就是说,result并没有被赋值。
goto
goto是鼎鼎大名的跳转指令,曾在历史上引起过严重灾难,但对于命令行这种临时使用的代码很短的脚本来说,则算是无伤大雅。其作用是跳转到某个标签所在的区块,而标签则以冒号开头。
由此观之,:eof就是一个默认的局部标签,表示当前程序的结尾。下面做一个简单的示例,用goto跳转来打印BAT这三个字母。
:: BAT.bat @echo off goto:B goto:eof :A echo A goto :T :B echo B goto :A :T echo T
效果如下
>bat
B
A
T
到此这篇关于批处理命令之函数传参和跳转详解的文章就介绍到这了,更多相关批处理命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!