Windows bat脚本学习五(函数)

news2024/9/24 17:16:57

一、简介

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

二、函数

1.函数调用

        :函数名

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

        见如下代码:

@echo off
chcp 65001

echo 首行执行代码

:end
echo 结束
pause

        结果:

 

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

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

        如果把代码改成这个样子

@echo off
chcp 65001

:end
echo 函数-结束
pause


echo 首行执行代码

        结果:

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

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

        call

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

@echo off
chcp 65001

echo 首行执行代码
echo 准备执行end函数
call :end
echo end函数执行完成
pause


:end
echo 函数-结束

        结果如下:

 

        exit /b

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

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

@echo off
chcp 65001

call :func
call :end
pause


:end
echo 函数-结束

:func
echo 函数-func

        结果:

 

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

        见如下代码:

@echo off
chcp 65001

call :func1
call :func2
call :func3

echo 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 65001

call :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 65001

goto 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 65001

echo 参数0=%0

set a=1
set b=2
set c=3

call :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 65001

setlocal enabledelayedexpansion

echo 参数0=%0

set /a a=6
set /a b=2

call :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
pause


endlocal

        结果:

 

        参数返回

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

@echo off
chcp 65001
 
set /a a=6
set /a b=2
 
call :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
pause
 
 
endlocal

         结果:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装KataGo+Sabaki围棋引擎

1.由于我的用户名是中文名,修改TMP和TEMP为SystemRoot(后续修改回来) 2.加入xx.bin文件后,cmd输入katago.exe genconfig -model model.bin -output gtp_custom.cfg 3.KataGo下载完成 4.配置GUI界面

ubuntu录屏解决ubuntu下无法播放MP4格式文件的方法

参考 gnome gnome是系统自带的录屏,通过ctrlshiftaltr触发 保存到了视频目录下,webm格式文件。 screencastify 这是一个chrome扩展,,一般不推荐使用 recapp 比gnome自由一些,可以自由屏幕录制。但是无法修改录制…

利用流水线实现版本一键发布

目录 1. 背景2. 实现步骤3.1 前置条件3.2 更新版本号和拉出发布分支3.3 生成 diffCommit3.4 自动触发联动编译3.5 让通知更友好 3. 总结 1. 背景 通常我们发布版本时会有这样几个步骤,更改版本号,拉出 release 分支,生成发布包。但是博主所在…

关于ThinkPHP 5 框架开启自动搜索控制器 无法访问的问题坑

假如当前有一个登陆接口功能 因为后续会有不同版本的 登陆接口 这时候 我们可以在控制器中 新建文件夹 做区分 方便管理即 新建了一个 api 模块 文件路径是 api/controller/V1/Login 正常情况下 controller 目录下 是 控制器文件 login.php 文件,由于我们有多个…

地下车库电车这样充电,必须改

文 | AUTO芯球 作者 | 响铃 我是真的害怕啊 你们看,我住的小区, 都是这样子啊 一个这样子的塑料盒,最多一个铝板盒子,就给车充电了 你看看 这样的塑料电槽 就这样裸露在外面了 有些摸一下 电线都在发烫 现在我们小区内这…

【NCom】:通用负压退火方法构建超高负载单原子催化剂库

摘要:由高密度单原子填充的催化剂系统对于提高催化活性和选择性至关重要,这可以最大限度地发挥异质单原子催化剂 (SAC) 的工业前景。然而,实现金属含量超过 10 wt% 的高负载 SAC 仍然具有挑战性。在这里,我们描述了一种通用的负压…

【UCB CS61C】Lecture 4 - C Memory Management Usage

目录 C 的内存布局(Memory Layout)栈(Stack)静态数据(Static Data)代码(Code) 寻址(Addressing)地址(Address)字节序(Endi…

电脑缺少dll文件怎么解决?Dll文件修复工具使用教程(方法合集)

众所周知,dll文件是计算器中的一类文件。占据了Windows操作系统的重要地位,主要作用就是可以让多个程序在运行时加以使用。dll文件包含了数字、文本、界面的等内容。 电脑缺少dll文件怎么解决?如果你启动某个程序时,发现电脑提示缺…

如何共享EC2 AMI给其他AWS账户

在本篇文章中,我们将详细介绍如何通过Amazon Web Services (AWS) 的Elastic Compute Cloud (EC2) 平台,将自定义AMI(Amazon Machine Image)共享给其他AWS账户。接下来,我们九河云将一步步引导您完成整个过程&#xff0…

数据驱动,智领办公!陀螺匠·企业助手 v1.7公测版发布

在数字化转型浪潮中,企业对办公自动化系统的需求愈加强烈,追求高效、灵活、智能的办公管理解决方案成为行业共识,我们深知,只有不断创新和完善,才能满足企业日益增长的需求。此次,我们带来陀螺匠企业助手 v…

【GeoScenePro】知识图谱

视频教程: ArcGIS/GeoScene知识图谱入门篇_哔哩哔哩_bilibili 所需软件: GeoScene Pro桌面端产品 Geoscene Enterprise四大组件(GeoScene_Server、GeoScene_DataStore、GeoScene_Portal、GeoScene_Web_Adaptor) 安装 【GeoScenePortal】安装和部署-CSDN博客

2024年下半年软考备考前的注意细节点

一、备考教材信息——选择官方正版(电子、纸质都可以) 中项 书名:《系统集成项目管理工程师教程》(第三版) 出版社:清华大学出版社 书籍类型:全国计算机技术与软件专业技术资格(…

centos安装docker并配置加速器

docker安装与卸载: 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容,逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…

少走弯路,ESP32 读取Micro SD(TF)播放mp3的坑路历程。

这个坑采的非常冤枉和巨大,非常大的冤枉路,只能一声叹息 说一下我是如何踩坑的,原本是打算用esp32 读取SD卡播放mp3,在esp32 读取自己打的SD卡已经踩了无数坑了,详情见: 少走弯路,ESP32 使用Micro SD(TF)…

Java学习第五天

数组 数组适合做一批同类型数据的存储。 静态初始化数组: 注意:数组变量名中存储的是数组在内存中的地址,数组是引用类型。 数组的访问 动态初始化数组: 数组的遍历: 注意左边和右边的区别,一个是改变数组…

日元升值,日股遇冷:出口商的烦恼

最近,日元汇率的走强让不少日本企业感到头疼。日元升值就像一把双刃剑,既能带来好处,也能带来坏处。 为什么日元升值会让日本企业头疼? 出口受阻: 当日元升值时,日本商品在国际市场上的价格就会变得相对较…

Access OpenAI (json) API from R

题意:“从 R 访问 OpenAI (JSON) API” 问题背景: I want to access the OpenAI API with the following curl command from R: “我想从 R 中使用以下 curl 命令访问 OpenAI API:” curl https://api.openai.com/v1/engines/davinci/comp…

centos换源安装升级gcc

使用devtools升级安装的时候,由于此库已经停止更新 了,因此需要切换阿里源 SCLDevtoolset 安装与使用笔记-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1889181 1 yum 安装 yum install centos-release-scl c…

一文说清JMeter如何用于用于性能测试(超长请耐心看完)

JMeter是纯Java语言开发。开源、免费是其重要的特点。 起初就是用于性能测试,主要Web端的性能。 后来扩展到接口测试、回归测试等功能测试领域。 拥有界面,支持多语种。界面还比较完善,适合初学者掌握和使用。 JMeter无需安装,…

Django中的第一个自动化测试编写

跟着Django官网中的投票应用学习,其中有官方说明的一个bug:如果 Question 是在一天之内发布的,那么这个Question 应该显示“published_recently”,返回值为True ,然而现在如果问题发布时间为30天之后(未来时间),也会返…