Windows bat脚本学习五(函数)

ops/2024/10/22 16:32:37/

一、简介

        使用bat脚本时,经常要使用函数,而函数的传参和返回值也是非常重要的,今天就总结一下bat函数相关的使用方法。

二、函数

1.函数调用

        :函数

        在Bat中,使用“:函数”来定义一个函数

        见如下代码:

@echo off
chcp 65001echo 首行执行代码:end
echo 结束
pause

        结果:

 

       这里定义了一个名叫“end”的函数

        可以看到,虽然程序中并没有调用,但是还是执行了end函数相关的内容。这是因为bat代码是顺序执行的,就算没有调用,程序也会继续往下执行

        如果把代码改成这个样子

@echo off
chcp 65001:end
echo 函数-结束
pauseecho 首行执行代码

        结果:

        可以看到,程序只执行了end函数,而没有执行我们希望执行的“首行执行代码”。

        所以,代码要把先执行的代码放在开头位置。 

        call

        使用call关键字来对函数进行调用。见如下代码:

@echo off
chcp 65001echo 首行执行代码
echo 准备执行end函数
call :end
echo end函数执行完成
pause:end
echo 函数-结束

        结果如下:

 

        exit /b

       /b表示结束当前的批处理脚本或子例程

        那为什么要调用这个呢?看如下代码

@echo off
chcp 65001call :func
call :end
pause:end
echo 函数-结束:func
echo 函数-func

        结果:

 

        可以看到,func函数执行了两遍。为什么会这样呢?因为bat是顺序执行,执行完end函数后,继续往下执行,就执行了func函数,没有可执行的指令后才会返回。所以我们要加入exit /b的代码,让程序在函数执行完后就返回

        见如下代码:

@echo off
chcp 65001call :func1
call :func2
call :func3echo main
call :end:func1
echo 函数 func1
exit /b:func2
echo 函数 func2
exit /b:func3
echo 函数 func3
exit /b:end
pause

        结果如下:

 

        可以看到,这次,每个函数就只调用了一遍。

        此外,exit /b还可以有返回值。见如下代码:

@echo off
chcp 65001call :func
echo 0 errorlevel:%errorlevel%
call :func1
echo 1 errorlevel:%errorlevel%
call :func2
echo 2 errorlevel:%errorlevel%
call :func3
echo 3 errorlevel:%errorlevel%echo main
call :end:func
echo 函数 func
exit /b:func1
echo 函数 func1
exit /b 1:func2
echo 函数 func2
exit /b 2:func3
echo 函数 func3
exit /b 3:end
pause

        结果:

 

        可见,errorlevel的默认值是0,如果设置了返回值,则返回对应数值。

        goto

        goto指令是让程序跳转到特定位置去执行,理论上也能实现调用函数的功能,那为什么还要用call呢?看如下代码:

@echo off
chcp 65001goto func
call :end
pause:end
echo 函数-结束:func
echo 函数-func

         执行结果直接报错。

        看似程序的逻辑是先调用func函数,然后再调用end函数,实际上,程序执行完func后,就直接结束了。并没有执行end函数

        这里解释一下,call语句是函数的调用,结束后会返回到调用的地方。而goto是跳转指令,程序会直接跳转到指定的位置,执行后并不会再返回到跳转的地方

        goto语句一般在循环或者结束时使用。

        goto:eof

        该语句和exit /b有点像,但是不完全一样goto:eof是直接跳转到脚本的末尾,即不再执行接下来的语句。因为脚本末尾没有任何语句,自然也就返回到函数调用的地方。而exit /b是直接返回,其实效果是一样的

        goto:eof与eixt /b 最大的区别就是,后者是可以有返回值的,而前者没有

2.函数传参

        %0、%1、%2

        %0指批处理文件的本身。如果是函数,%0为函数

        %1、%2......为第一个参数、第二个参数........

        见如下代码:

@echo off
chcp 65001echo 参数0=%0set a=1
set b=2
set c=3call :func1 %a% %b%
call :func2	%a% %c%
call :func3	%b% %c%echo main
call :end:func1
echo.
echo 参数0=%0
echo 参数1=%1,参数2=%2
set /a r=%1 + %2
echo 函数 func1,sum=%r%
exit /b:func2
echo.
echo 参数0=%0
echo 参数1=%1,参数2=%2
set /a r=%1 + %2
echo 函数 func2,sum=%r%
goto :eof:func3
echo.
echo 参数0=%0
echo 参数1=%1,参数2=%2
set /a r=%1 + %2
echo 函数 func3,sum=%r%
goto :eof:end
pause

        结果:

3.函数返回值 

        直接返回

        可以通过 %errorlevel%将结果返回,见如下代码:

@echo off
chcp 65001setlocal enabledelayedexpansionecho 参数0=%0set /a a=6
set /a b=2call :func1 %a% %b%
echo 函数计算结果:%errorlevel%echo main
call :end:func1
echo.
echo %0
echo 参数1=%1,参数2=%2
set /a sum=%1 + %2
echo sum=%sum%
exit /b %sum%:end
pauseendlocal

        结果:

 

        参数返回

        除了直接返回,可以通过参数将结果返回,见如下代码:

@echo off
chcp 65001set /a a=6
set /a b=2call :func1 %a% %b% sum
echo 函数计算结果:%sum%echo main
call :end:func1
echo.
echo %0
echo 参数1=%1,参数2=%2
set /a %3=%1 + %2
set /a t=%3
echo sum=%t%
exit /b:end
pauseendlocal

         结果:

        可以看到,将sum作为一个参数传入进去,函数执行结束后,再打印sum的值,已经变为计算结果。


http://www.ppmy.cn/ops/103003.html

相关文章

生信圆桌:专业生信服务器与平台服务的提供者

生信圆桌是一个专注于提供生物信息学(生信)服务器和平台服务的领先企业,致力于为全球科研机构、企业和独立研究者提供高性能的生信分析解决方案。随着生物信息学研究对计算资源的需求日益增加,生信圆桌凭借其先进的服务器技术和专…

Clickhouse集群化(六)clickhosue-operator学习

1. Custom Resource元素 apiVersion: "clickhouse.altinity.com/v1" kind: "ClickHouseInstallation" metadata:name: "clickhouse-installation-test" 这是clickhouse operator自定义的资源ClickHouseInstallation 1.1. .spec.defaults spe…

GPU服务器与CPU服务器的不同之处

在服务器市场当中,GPU服务器与CPU服务器是属于比较常见的两种服务器类型,那么,这两种服务器之间有着哪些区别呢?接下来就让小编带领大家一起来了解一下吧! GPU服务器与CPU服务器两者在硬件结构上就是不同的&#xff0c…

关于java中Excel的导入导出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、配置pom依赖二、搭建utils工具类1.Excel表头设置表2.Excel导入导出工具类3.Excel导出配置4.Excel导入配置 三、添加user表和工具类使用方法1.user表设置2.工…

安泰功率放大器应用领域:MEMS传感器的应用有哪些

功率放大器的应用领域很广泛,从超声测试、材料测试、水声测试再到压电驱动、电磁驱动生物医疗,它都能为整个系统提供强劲的激励,同样功率放大器在MEMS传感器系统的激励中也有着良好应用,今天Aigtek安泰电子就带大家走进MEMS传感器…

数字芯片设计验证经验分享(第三部分):将ASIC IP核移植到FPGA上——如何确保性能与时序以完成充满挑战的任务!

作者:Philipp Jacobsohn,SmartDV首席应用工程师 Sunil Kumar,SmartDV FPGA设计总监 本系列文章从数字芯片设计项目技术总监的角度出发,介绍了如何将芯片的产品定义与设计和验证规划进行结合,详细讲述了在FPGA上使用I…

Bootstrap 滚动监听(Scrollspy)插件

滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标。其基本的实现是随着您的滚动,基于滚动条的位置向导航栏添加 .active class。 如果您想要单独引用该插件的功能,那…

介绍一下最近很火的一款游戏黑神话悟空,已经国产游戏面临的挑战

《黑神话:悟空》是一款由杭州游科互动科技有限公司开发的单机动作角色扮演游戏,以中国古典名著《西游记》为背景。游戏在2024年8月20日上线,支持PC(Steam、Epic、Wegame)和PlayStation 5平台,未来还将登陆X…