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

前期回顾 

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

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

进阶

我们在之前所接触到的三个指令仅仅是Batch中的冰山一角,一些比较重点的指令都会放在本节中进行讲述。在进阶内容中,您将会了解到变量、逻辑判断、调用与传参和函数这几大概念。

在本次发布内容中,我们来了解第一大概念:变量。

变量

变量(Variable),在初中对函数的学习中我们可能接触到了这个名词,当然,如果您还没有接触到也没有关系,您只需要将它理解为“一种可以改变的值”即可。在计算机中,变量的含义会更加清晰,因为它的确是可以变的。

我们如果提到变量,就必定会谈到赋值(Assignment)。这个赋值并不是代数中的赋值(名词),而是一个动宾短语。赋,即赋予,给予,这个词的意思很明显了,就是给予一个值。给予谁值呢?我们就要谈到变量名(Name)了。变量名一般是可以随便取的,但是如果我们想要更好地去分辨,我们最好取一些有意义的名字。

set

set是变量操作最基本的指令,它能够指定一个变量名并给它赋值。下面是一个常见的变量赋值表达式:

set a=1

其中,set为变量操作指令,它是不可缺少的。a是变量名,它的值则是=后的1。那么,=是等号吗?不是。在计算机领域,=从来没有等号的意思,它被称为赋值运算符(Assignment Operator),只要看到它,就代表着左侧与右侧相等,但是它并不表示相等关系。

也就是说,如果我们要表达“a 与 1 相等”,那么我们需要的是a==1而不是 a=1。假设此时a的值为hello,那么我们若执行:

set a=1

 

此时a的值会被彻底改变,变成1。也就是说,a=x任何时候都成立,因为它是用来改变左侧变量名所对应的值的,而a==x仅在a真正与x相等时成立。

经过一系列的纠结和解释,我们最终得到了一个名为a的变量,它的值为1。那么这个时候我们就要想办法来使用它。能不能与之前的echo结合起来呢?

set a=1

echo %a%

得到1。是可以的。在Batch中,您可以用%变量名%的形式来表示一个变量,并且在任何地方都可以用,比如:

set a=set

set b=a

set c=^=

set d=1

set e=%a% %b%%c%%d%

%e%

echo %a%

pause

exit

这个突如其来的奇怪程序也许非常难懂。接下来我们慢慢分析。

首先我们可以看到,我们定义了5个变量,分别叫做a, b, c, d, e。那么您能说出它们的值是多少吗?我相信答案是肯定的,除了c和e。

a的值为set,b的值为a,c的值为=,d的值为1。那么,如果我们一个一个地echo它们呢?

echo %a%

echo %b%

echo %c%

echo %d%

pause

exit

我们得到的结果将是这样的:

这看起来就像是一个指令:

set a=1

这样您也许可以猜到e的值是什么了。没错,e的值就是a, b, c, d的组合。可以注意到,%a%右边有一个空格,其它的都是相连的,这样组合起来也是不会变的。那么把

%a% %b%%c%%d%

 

组合起来,我们就得到了:

set a=1

 

然后下面有一个单行,写着:

%e%

 

这样,在e的值被赋为set a=1后,再把%e% 当作指令执行,我们就相当于是执行了指令:

set a=1

 

随后再echo出a的值,我们得到的是1。

转义字符

为什么%c%的值是=而不是^=?

首先我们观察:

set c=^=

在这里,如果我们去掉了中间的^,那么这就是一个错误的指令,因为==会被识别成判断是否相等的运算符,而右边又是空的,更何况set没有这种用法。

set c==

所以我们需要让cmd知道我们是想让c等于=(等于等于)。于是^的用处有了。它叫做转义符(Escape Character),用来把原本有特殊含义的符号给转义成一般的字符。

转义符的作用很多,您能想到吗?

如果我们想要输出一句话,这句话里包含%a%,但是我们并不想要输出a的值,而仅仅是输出两个百分号和一个a,怎么办?转义符的用处有了。我们可以这样写:

echo %%a%%

这里我们又用到了一个转义符,它叫做“双百分号”,但它只能在使用变量转义的时候起作用。因而:

set c=^=

set c=%%=%%

 

不相等。

^转义符的效用是它后面的1个字符,%%转义符用来代表一个正常没有特殊含义的%。使用%%a%%,我们得到的结果就不是a的值了。我们看一个示例:

set a=1

echo %a%

echo %%a%%

这样,我们得到的结果是:

set /p

set指令有非常多的参数。在本教程中介绍/p和/a两种。首先,set /p属于暂留性指令中的一种,也是用户输入的第二种途径。如果您想要让用户自己来定义变量的值,您将需要用到/p。

set /p a=

含/p参数的set指令,赋值运算符右侧无论是什么,都不会影响到它的值。若我们单单执行set /p a=,我们将得到:

这是一个输入空框,我们可以随意在这里输入东西。例如,我们输入 123456,那么什么也不会发生:

但是如果此时我们调出%a%的值,效果就出现了:

也就是说,我们输入的任何东西都已经被赋入了变量a里。/p参数的用处就在如此。

但是,每一次都是这个输入空框,用户根本不知道输入什么。这样,我们就可以再赋值运算符右侧加上提示文字,来提示用户这是在输入什么。运行如下程序:

其中,this is my passwd是笔者手动输入的部分。

那么,我们结合先前将变量直接当作指令执行的方式,来制造一个假的cmd控制台:

这时,我们输入的值会直接被赋入%command%内,紧接下一行就是直接把变量的值当作指令来处理。也就是说,我们输入一条指令,就会被直接当作指令来处理,从而实现假控制台的效果。

利用这条思路,我们就可以自定义我们自己的控制台了。当然这是后续的内容。

set /p <

多了一个<,意义就完全不一样了。准确来说,这种用法是建立在文件重定向运算符<上的。它的具体用法:

set /p a=<1.txt

左侧没有多大的区别,仍然是变量名,但是右侧则是一个<加上一个文件。严格来讲,这个文件只能是纯文本文件(扩展名随意,只要不是二进制即可)。这条指令的意思是从1.txt读取第一行的所有内容并赋值到%a% 中。

我们不妨直接做个实验:

这样,从文件读取内容也成功了。但是如果有多行文本呢?出于局限性,这个方法只能读取第一行的内容。在后面的学习中,我们会介绍如何读取全部内容,以及如何选择性地读取指定行的内容。

set /a

指定/a参数可以进行数学运算操作。如果set指令拥有/a参数,那么它的赋值运算符后面的变量不需要带上百分号。

例如:

但是前提是赋值运算符后的变量必须为数字。因为/a是专为数学运算而设计的,所以这样能够让计算写作时更加快速。

一个简单的加减乘除程序就可以通过参数/a来实现:

这代表着在/a参数的前提下,赋值运算符后将可以直接写四则运算符号。但是这远远不够。因为批处理的局限性,目前是无法计算超过32位的数字以及任何浮点数的(所以不建议用批处理计算除法)。不过,这样就相当于是实现了计算器的核心功能。

至此,set介绍得就差不多了。接下来我们了解一下环境变量。

环境变量

环境变量(Environment Variable),是指系统已经预先配置好的父进程环境默认设置。简要来讲,就是一些包含您计算机的基本信息的变量,虽然说叫做“变量”,但是实际上如果您的系统没有从底层上发生改变,这些变量的值是不会改变的。

环境变量在批处理的作用非常巨大,可以节省我们编写代码的时间,也能让我们的代码更加适配其它人的电脑。

我们举个例子,众所周知很多人的Windows系统是安装在盘符为C:的存储空间的,因此如果我们在批处理内要对系统盘内的项进行操作,我们必定需要写路径。例如,我们要用上文中提到的set /p指令来读取位于系统盘根目录的1.txt,那么怎么做?(忽略权限)

set /p content=<C:\1.txt

一般我们的思路当然就会是这样的了,但是,您有没有思考过,万一真的有人系统盘不在C盘呢?(实际上这种情况非常普遍)这条指令岂不是失去意义了?这个时候,环境变量就发挥作用了。环境变量可以根据不同的电脑而改变,这就是它“变”的地方。

例如,在Windows中有一个环境变量,叫作%SYSTEMDRIVE%(环境变量不区分大小写),它的字面意思是系统盘符(System Drive Volume),这也是它所代表的。那么我们可以直接在echo指令中输出它,因为它在系统安装的时候就被定义了。

我们得到的是C:,这正是我们系统盘的盘符。

而如果某人的电脑系统盘是E:,那么这个变量的值就会等于E:。利用这个原理,我们就可以适配所有的电脑了,于是把我们的指令修改成:

set /p content=<%SYSTEMDRIVE%\1.txt

这样,这条指令就有了万能性。

环境变量的使用方法基本上就是这样,接下来我们列出一些常用的环境变量:

变量截取与替换

如果我们希望将一个变量分段,只取其中一部分内容,在Batch中是有方法的。

set a=1234567890

echo %a:~0,1%

 

上面的执行结果是1。看吧,这是一个您不认识的变量写法。:~0,1就是变量控制符。一般地,在Batch中,我们对变量截取有以下原则:

%操作变量名:~始, 终%

 

其中,操作变量名很好理解,这是我们要采取截取工作的变量。例如,我们要截取变量a,那么操作变量名就是a。始(from Index),指定从哪一(Index)开始截取,(to Index)指定截取到的位。

在计算机中,位是从0开始的。也就是说,我们日常生活中所表示的1,在这里就是0。观察以下数据:

 

1234567890

请问这组数据中的第一个数字是什么?是1。但是,如果我们要在计算机内表示的话,我们要说它在第0位。以此类推,如果我们要截取变量的前8位,那么我们应当写成:

%a:~0,8%


这行代码代表截取变量a的第一位至第八位。如果我们仿照上例执行:

set a=1234567890

echo %a:~0,8%

我们将得到12345678。这种截取也适用于非0开头。需要注意的是,开头的位必须与我们现实生活中所数的位数少1。例如:

set a=你好啊

echo %a:~1,1%

 

输出的结果是好。这行代码代表从第2位开始,截取1个字符。那么我们就直接截取了第2位本身。如果我们将终改为2,我们得到的结果是 好啊,即从第2位开始,截取了2位。

请您参考如下例子来好好了解一下变量截取:

我们同样可以反过来,从相反方向截取。例如:

set a=3.14

echo %a:~-1%

这种用法里没有始和终的区分。以上例子代表截取a的倒数第一位,我们得到的结果是4。如果我们使用echo %a:~-2%,那么我们截取的是倒数的两位,结果是14。以此类推,当我们使用echo %a:~-n% 的时候,实际上是截取了这个数据的倒数n位(即从倒数第1位一直截取到倒数第n位)。

此外我们还可以结合起来用:

set a=3.14

echo %a:~0,-1%

我们得到的结果是3.1。这行指令代表截取从正数第一位一直到倒数第一位之前的那一位的数据。以此类推,当我们使用echo %a:~b,-c%的时候,实际上是截取了这个变量从正数第a+1位到倒数第|c|+1位的数据。

至于变量替换,相对于变量截取,比较简单。

set a=我好!

echo %a:我=你%

我们得到的结果是你好!。也就是说,%a:A=B即将变量内任何与A完全匹配的内容全部替换成B。

以上是今天与大家分享的内容,如果对你有帮助,记得收藏啊,下期内容我们将继续探讨Batch入门教程中的进阶知识,记得关注哦!

Batch入门教程丨第二章:认识变量相关概念的更多相关文章

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

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

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

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

  3. 脚本语言丨Batch入门教程第四章:调用与传参

    今天是Batch入门教程的最后一章内容:调用与传参.相信通过前面的学习,大家已经掌握了Windows Batch有关的基础知识和编程方法,以及利用Windows Batch建立初级的编程思维方式.今后 ...

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

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

  5. ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...

  6. ActiveMQ 快速入门教程系列 第二章 发布-订阅者模式实现

    第二章我们会介绍怎样实现一个发布者对多个订阅者的消息传递 Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息:而queue则 ...

  7. Node入门教程(3)第二章: Node 安装

    Node 安装 官网下载地址: https://nodejs.org/en/download/ 安装方式 windows 下安装 建议直接选择:Windows Installer (.msi)下载进行 ...

  8. ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...

  9. 【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

    [军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的   之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们, ...

随机推荐

  1. 【Java】「深入理解Java虚拟机」学习笔记(5)- 类加载

    C/C++在编译时需要进行连接,而Java的类加载.连接和初始化是在运行时完成的. 图  类的生命周期 图中解析的过程不一定在准备和初始化之间,也可以在初始化之后再开始,以支持Java的运行时动态绑定 ...

  2. P1250 种树

    P1250 种树 题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定 ...

  3. linux 大杂烩

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

  4. 提取Jar2Exe源代码,JavaAgent监控法

    最近遇见一个麻烦,明明知道是java写的小软件,但是打包成了exe,木得办法,之前打包的都有缓存能在TEMP文件夹找到.这次可不一样了,特此记录一下. 为此特地搜集了一些java打包成exe的软件. ...

  5. org.json.JSONObject的getString和optString使用注意事项

    结论:org.json.JSONObject的getString如果取不到对应的key会抛出异常,optString则不会 /** * Returns the value mapped by {@co ...

  6. Ubuntu16.04安装编译caffe以及一些问题记录

    前期准备: 最好是python虚拟环境 [anaconda的创建虚拟环境] 创建 conda create -n caffeEnv(虚拟环境名字) python=3.6 激活环境 source act ...

  7. C++11 带来的新特性 (3)—— 关键字noexcept

    1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...

  8. SLogViewer下载及使用说明

    SLogViewer 1.0使用说明 SLogViewer是一个基本开源界面库SOUI开发的开源的通用的高性能LOG分析工具, 轻松支持上百万行级别的LOG过滤.  支持LOG格式配置. 只要是固定格 ...

  9. 2.DNN-神经网络推导

    DNN就是我们常常说的深度神经网络,可以说由其衍生出来的各种深度算法都在AI界大行其道,今天就好好理一下这个算法.参考的是刘建平老师的博客:http://www.cnblogs.com/pinard/ ...

  10. Codeforces 1153D Serval and Rooted Tree (简单树形DP)

    <题目链接> 题目大意: Serval拥有的有根树有n个节点,节点1是根. Serval会将一些数字写入树的所有节点.但是,有一些限制.除叶子之外的每个节点都有一个写入操作的最大值或最小值 ...