Windows批处理之函数传参和跳转

本文介绍了DOS批处理中函数的使用,包括函数标识、参数传递(%与%~的区别)、返回值处理(全局变量与参数引用)、以及局部变量保护(setlocal)。同时讲解了goto指令的跳转功能和标签的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


批处理系列: 初步💎 set指令,设置变量

函数

函数封装是编程语言必不可少的环节,而函数在创建时,至少需要有一个函数标识,同时需要一块区域,来组成函数体。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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值