在前两期的学习内容中,我了解了Batch入门教程的相关知识和编程方法、Windows Batch程序的编写和运行方法、脚本语言的入门方法等,但是今天我们将继续深入学习Batch入门教程的认识变量的相关概念。
回顾前期
Batch入门教程引入和Hello World上
Batch入门教程引入与Hello World下
高级
我们迄今为止提到的三个命令只是Batch冰山的一角,一些重要的命令将在这一节中说明。 详细内容包括变量、逻辑判断、调用和传递、函数的几个概念。
在这次的发表中,我理解了变量这一第一个概念。
变量
变量(Variable ),在中学函数的学习中我们可能接触到了这个名词。 当然,还没碰也没关系。 请理解为“可以改变的值”。 在计算机中,变量的含义更加明确。 因为那个确实可以改变。
我们一提到变量,就一定会提到赋值(Assignment )。 这个赋值不是代数中的赋值(名词),而是动宾句。 赋,即给,给,这句话的含义很明显,就是给值。 赋予谁价值? 谈谈变量名(Name )吧。 变量名可以自由命名,但如果想更好地识别,最好命名有意义的名字。
设定
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%
帕斯
退出
这个突然的奇怪的步骤可能非常难懂。 接下来慢慢分析吧。
首先,我们可以看到定义了五个变量: a、b、c、d和e。 那么,那些值多少钱? 我认为答案是肯定的。 除了c和e之外。
的值为set,b的值为a,c的值为=,d的值为1。 那么,我们一个一个地echo怎么样?
echo %a%
echo %b%
echo %c%
echo %d%
帕斯
退出
我们的结果如下。
这看起来像命令:
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入门教程中的进阶知识,记得关注哦!