今天是Batch入门教程的最后一章内容:调用与传参。相信通过前面的学习,大家已经掌握了Windows Batch有关的基础知识和编程方法,以及利用Windows Batch建立初级的编程思维方式。今后我们还会学习到更多的脚本语言,从而更加顺利投入到以后的开发和探究中。

 前期回顾 

Batch入门教程丨部署与Hello World(上)

Batch入门教程丨部署与Hello World(下)

Batch入门教程丨进阶!认识变量相关概念

Batch入门教程丨第三章:逻辑判断

调用与传参

虽然按照原理来讲,把所有的功能都放入一个Batch文件中是可行的,但是却会出现冗杂的问题。因此,我们可以创建多个Batch文件,并互相调用。在Batch中,我们使用call来对Batch文件进行调用并传参。start也可以传参,但是并不具备调用的性质,而仅仅是新运行指定的对象。

call

call指令的用法与一般的指令用法相同,都只需要指定对象即可:

后面的参数可以无限叠加。

我们先举一个比较简单的调用例子:

我们得到的结果是:

这很明显代表着我们已经将b.cmd打开了。不过,这不叫作「打开」,而叫作调用(Transfer)。

我们可以看到在上面我们给出的用法里,对象后面还有一个参数,而在上面的例子里却没有参数。这是正确的,只是功能会少一点而已。一般地,我们使用 call 就是为了带上参数。接下来我们来了解怎样使用这些参数。

首先我们要明白什么叫作参数(Parameter)。参数是指一个功能的实现所需要的条件和因素,它们一般都以数据的形式呈现。通俗来讲,就是实现这个功能所需要的数据。例如,我们要实现一个做加法的功能,我们都知道:

加数 + 加数 = 和

那么在这个运算中,两个加数就是参数,和是结果(result)。在编程中,这个结果叫作返回值(return value),这个流程所象征的基本意义所代指的概念叫作函数(Function)。

那么,我们既然要给别的.bat文件传参,那么它必定会实现某一个功能,实现功能就需要参数。那么,我们如何输入这些参数和获取这些参数呢?

首先我们要分清楚调用方(Caller)和被调用方(Callee)。我们先假定两个文件:a.cmd和b.cmd,它们的代码分别如下:

您能分清楚这里谁是调用方,谁是被调用方吗?调用方是a.cmd,被调用方是b.cmd,那么a.cmd就要给b.cmd传参。a.cmd里用到了一行call指令:

对应上面我们所表述的用法,b.cmd是对象,Hello则是一个参数。那么这个参数就相当于是告诉b.cmd 了,接下来我们要在b.cmd里使用它。于是我们就有了这行输出指令:

您能猜出%1的含义吗?

它是一个变量,但不是一个标准的变量。它代表着第一个参数。在上述指令中,从Hello开始即为参数,若我们执行:

我们得到:

在a.cmd中,我们传参(pass)给了b.cmd。这些参数分别为:

Hello,This,is,a,sentence,.。这分别是独立的6个参数,按照从左往右的顺序排序。

因此在被调用方b.cmd里,%1就代表Hello,%2就代表This,%3就代表is,以此类推。在上面的例子中,b.cmd内,%5%6写在了一起,因为%6的值是一个 .,与%5连用,结果则是sentence.。如果依然隔开,那么就是sentence .,显示并不自然。

现在我们知道了如何传参,以及如何调用参数。那么,我们处理的结果该如何返回呢?

exit /b

在Batch中 ,exit /b后必须接上数字,我们称为exitCode即退出码。它的作用是,当被调用时,作为被调用方,将会对调用方返回这个exitCode。只要exit 指令加上了参数/b,无论有没有接exitCode,它所退出的都是程序而不是进程。

这句话怎么理解呢?在第一章里我们已经给出了图示。如果退出的是程序,如果当前程序是被调用方,那么它会直接返回到调用方继续执行指令(如果当前程序没有被调用,那么exit /b等价于exit),但是如果退出的是进程,那么什么都不会做了,会将整个进程退掉。

我们来看个例子:

上述指令中我们用到了%ERRORLEVEL%,因为exit /b [errorCode],作为调用方时返回的exitCode会直接充当调用方的%ERRORLEVEL%。

上述例子我们实际上贯彻了函数的基本思想,但是在此不作具体供述。我们先看看结果:

输出的是2,正好是1+1的和。为什么呢?请看流程图:

也就是说我们传递给add.cmd的两个参数1, 1经过add.cmd内的一行指令set /a a=%1+%2的操作,将它们两个加起来的值赋给了a,然后再用a当作exitCode 使用exit /b %a% 将a的值传回a.cmd的%ERRORLEVEL%里,最后a.cmd输出它的值。这就是1+1的结果。

如果您仍然无法理解,可以在评论区提问。

需要注意的是exit /b的[exitCode] 仅能为Batch可以识别的数字,因此这种传参方式仅能够传回数字类型的参数。

call [bin] [param...]

这种用法与先前的用法并没有什么出入,仍然是后面跟上一个对象,以及要传给它的参数。这一点在于它所调用的对象并不是Batch文件,而是Windows的系统文件。利用这个功能,我们几乎可以完成任何操作。

例如,我们可以让电脑休眠:

其中,对于不同的对象,我们能够传入的参数是不一样的。如果要调用rundll32,我们就必须了解它的参数,在本教程中不加以供述。对于上面一行指令powercfg,它是用来改变休眠/睡眠状态的。如果powercfg -hibernate 设置为off,那么下面那行call 的结果就是睡眠,如果是on则是休眠。二者有一定的区别,各位可以通过搜索查看。

以上就是Batch入门教程的基础内容,后续我们还会持续更新,希望对大家的学习有所帮助,如果您还想了解其他的技能或工具,可以点击菜单栏中的入门锦囊查看相关内容,或者留言给我们,我们会尽量满足大家的要求,愿小伙伴们在网安路上越走越好!

脚本语言丨Batch入门教程第四章:调用与传参的更多相关文章

  1. 脚本语言丨Batch入门教程第三章:逻辑判断

    通过学习Batch入门教程的前两章内容,我们已经大致掌握了基本概念和认识变量的相关内容,今天我们要跟大家继续分享第三章内容:Batch入门教程之逻辑判断.  前期回顾  ◀Batch入门教程丨部署与H ...

  2. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

  3. storm入门教程 第四章 消息的可靠处理【转】

    4.1 简介 storm可以确保spout发送出来的每个消息都会被完整的处理.本章将会描述storm体系是如何达到这个目标的,并将会详述开发者应该如何使用storm的这些机制来实现数据的可靠处理. 4 ...

  4. 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...

  5. Batch入门教程丨第二章:认识变量相关概念

    在前两期的学习内容中,我们已经了解了Batch入门教程有关的知识和编程方法,如何编写和运行Windows Batch程序,脚本语言的入门方式等,今天我们将继续深入学习Batch入门教程之认识变量相关概 ...

  6. Batch入门教程丨第一章:部署与Hello World!(下)

    在上期分享的内容中,我们已经掌握了基础理论知识,今天我们将继续了解和学习与Windows Batch有关的知识和编程方法,如何编写和运行Windows Batch程序,脚本语言的入门方式等,从而能够更 ...

  7. Batch入门教程丨第一章:部署与Hello World!(上)

    Batch入门教程 在本教程中,您将了解并学习与Windows Batch有关的知识和编程方法,用以解决在日常生活中所遇到的简单问题,或者利用Windows Batch建立一个最初级的编程思维方式. ...

  8. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  9. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

随机推荐

  1. Lesson 2-2(列表,元组)

    2.3 列表 2.3.1 列表的创建方法 --- 使用方括号 [] ,括号中的元素之间使用逗号隔开. >>> [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] > ...

  2. zigbee 信道

      以zigbee  nxp5169 信道是:11-26    15d0f1-170923    15 ----- 信道 d0f1--- 是zigbee 物理地址 170923---时间2017年9月 ...

  3. Bootstrap-datepicker3官方文档中文翻译---Keyboard support/键盘支持(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)

    本日期控件包含了键盘导航.  “focused date” 在键盘导航期间一直会被保持追踪并且高亮显示(就想鼠标悬停的时候一样),当一个日期被切换(译者注:选中状态的切换)时或者控件隐藏时清除. up ...

  4. bzoj 2599

    还是点对之间的问题,果断上点分治 同样,把一条路径拆分成经过根节点的两条路径,对不经过根节点的路径递归处理 然后,我们逐个枚举根节点的子树,计算出子树中某一点到根节点的距离,然后在之前已经处理过的点中 ...

  5. linux 大杂烩

    1.linux mysql输错命令 mysql命令行中执行多行命令时,如果前边输入的命令发生错误,是很令人头疼的事情,可以通过输入\c来取消前边的输入,重新进入“mysql->”提示符. 2.l ...

  6. 合并多个对象并且去重的2种写法(es6)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. Python学习(四十三)—— Djago-admin管理工具

    一.admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...

  8. 理解WindowManagerService

    --摘自<Android进阶解密> *WMS的职责* 1)窗口管理 WMS负责窗口的启动.添加和删除,另外窗口的大小和层级也是由WMS进行管理的 2)窗口动画 WMS的动画子系统Windo ...

  9. 百度地图Web引用

    上海中心二楼 示例 http://api.map.baidu.com/geocoder?address=北京市海淀区上地信息路9号奎科科技大厦&output=html&src=weba ...

  10. FlashFXP用到的功能

    FlashFXP目前用到的个人理解就是: 一个公共空间  大家同时连接进来可以共享文件进去(该软件支持从屏幕上直接拖拽文件进来) 这里面页面之类的可以用手机进行访问(有利于调试) 第一步接收师哥给的软 ...