在上次学完批处理文件之基础篇后我们已经能编写一些简单的东西了,但要组成一个好的"程序",读者们是不是觉得还缺少了一些东西呢?今天,我们就在原来的基础上继续深入一波,本篇文章较长,但在细心的学完这篇文章之后,你就可以发挥想象,写出基本的一些文字游戏了:
%0 “代表”当前批处理文件
![f645ebafa7b6cf08da533439b16993d7.gif](https://i-blog.csdnimg.cn/blog_migrate/9eb1421de48e0a6a9e1819e0ca13d2b8.gif)
![2978d5b4f74aea5eb908e2f7e2330f05.gif](https://i-blog.csdnimg.cn/blog_migrate/dbaaec496118fa37a0584803def34578.gif)
可以从图中总结出:%0代表当前批处理文件有两种含义:1、代表当前批处理文件的绝对路径,可以通过echo显示出来2、代表批处理文件自身,因此在以上第二张动图中的%0等同于又调用一次当前的批处理文件:call 0circulation.bat,所以可以造成无限循环。(到这里,读者可以回过头思考下怎么简化批处理基础篇的应用中那些例子的命令) 对于%0还可以在中间加参数去代表不同的含义,这里就不再介绍。
& 连接多个命令以按顺序运行
![54b9ca8b36db87005d6440a6febe3cab.gif](https://i-blog.csdnimg.cn/blog_migrate/55ed3fbed06a526450d4a759a41d1df8.gif)
这个命令不管其中的某个命令是对是错,都会把所有连接的命令运行一遍:
![683383ce9f4f31e8d00a829d38383116.gif](https://i-blog.csdnimg.cn/blog_migrate/c2a24e2fa1cc10682a3217e00a30a357.gif)
与这个命令相似的另一个命令:
&& 按顺序执行命令,当其中的一个命令执行失败,之后的命令将不再执行:
![9b9fe7f62d8e0274e60cd75195036357.gif](https://i-blog.csdnimg.cn/blog_migrate/a53a753dbbbd38afa99ed56186506ad8.gif)
![38e463850804d9e31dd69e5d7f80a3e7.gif](https://i-blog.csdnimg.cn/blog_migrate/cf31de2f042b50814037702df4be5cd1.gif)
按照物理学来说:单个&相当于物理中的串联电路,一个用电器短路,其他用电器正常运行,而&&就相当于物理串联电路中,一个用电器断路,全部都断路都不运行。
|| 按顺序执行命令,当其中一个命令执行成功,之后的命令将不再执行:
![4922d863fa3bebdacbb468a79b8c663b.gif](https://i-blog.csdnimg.cn/blog_migrate/56ce8a5b96a53d4d3cb87ba1995be779.gif)
![0108e98920ad038521f7eec0cb74f936.gif](https://i-blog.csdnimg.cn/blog_migrate/623690f078040142ed8add99029c4404.gif)
这时候读者们可能发现了一个规律,&&有一个&,那么||应该也有一个|才是。而且根据&中的规律,大概能知道|的作用了,但其实|和&,&&,||的作用是很有区别的,下面这个命令符将和find关键词一起讲解:
| 管道命令,将符号的前面的命令传给符号后的命令
find 后面跟一个字符串,表示在指定的内容下寻找指定的字符串并返回所在行的内容
这里准备了一个文本来帮助理解:
![156c6b8c99a9fffafd00bdbe92b1dd85.png](https://i-blog.csdnimg.cn/blog_migrate/b8445326123496e32fdefc0370ea1baa.png)
![eaf71866b41c5ca8c7d32a97342b4f92.gif](https://i-blog.csdnimg.cn/blog_migrate/c200d3f19e323f6e195fba0bbfe7075e.gif)
以上示例运行过程:当type Helloworld.java命令执行完后会返回Helloworld文本中的内容后;
这
时
候|命令将
type Helloworld
.java
命令的返回内容
传递给
find命令;
而find命令指定搜索"Hello"的字符串,找到后向控制台输出。反之不输出。而find作为一个搜索的关键词,通过/?可以发现加上不同的符号可以实现不同的功能:
![345dfac440bac45aa26707f1a966a38b.png](https://i-blog.csdnimg.cn/blog_migrate/668d7a357bdf60a97244409128dbb064.png)
这里一样用上面的例子进行改动说明:
find /v 显示指定字符串所在行之外的行内容。(乱码不用管)
![89e176f5aa67890ec3d7cfc9a37a596a.gif](https://i-blog.csdnimg.cn/blog_migrate/b44f18cbb284ca833402088ee69954f0.gif)
find /c 显示指定字符串在指定内容中出现的次数(c可以理解为count计数,方便记忆)
![36b9d23212455c2ad13b6ea1b378949d.gif](https://i-blog.csdnimg.cn/blog_migrate/6f898685ff679aa06cd9a8caca9eae09.gif)
find /n 在显示指定字符串所在行之外在行首还显示所在的行数
![44078aeee13c2b69131117fe9b5efafe.gif](https://i-blog.csdnimg.cn/blog_migrate/3763a5534421d602f4a5b61882bd4359.gif)
find /i 忽略指定字符串的大小写对结果的影响(i可以理解为ignore忽视,方便记忆)
![28518e9c13eab90f0903e95c162a5804.gif](https://i-blog.csdnimg.cn/blog_migrate/3ddf2e90226d3325627cf78c9bc710ec.gif)
可以看到,尽管我指定的是"hello",但还是把带有Hello的行都显示出来了。
if 作为判断语句的关键词,以下将好好讲解这个关键词的重要应用:
![e55cd1c3ab0ea0cc80904c5b729f7e8c.png](https://i-blog.csdnimg.cn/blog_migrate/f7891f2f46af49b8e3dd553b71fbf266.png)
从if /?中我们可以看到if主要有三种方式(本篇主要讲第二和三种方式):
IF [NOT] ERRORLEVEL number command []代表可省略,这个等下讲,我们要想搞清这种形式怎么用,我们就要先了解errorlevel这个关键词是什么:在我们批处理文件的命令中,每个命令行执行完后后会返回一个errorlevel值,而一般执行成功的命令行默认返回都是0
![bf71ead543495353e27e633b1d31d393.gif](https://i-blog.csdnimg.cn/blog_migrate/6b6138ce94efea1668393c3b003b5dc7.gif)
而这个不同命令对应的errorlevel的值需要读者自行实验或者上网查找。以下来个示例:
![f978c21b0c3338eb8a73c7858769fa40.gif](https://i-blog.csdnimg.cn/blog_migrate/7ae45e9f72be7a2cf3d71b05aa2169b7.gif)
这个方式就的用法就是在格式中的number中写一个数字,然后执行到这个命令行时,判断上一个命令行的errorlevel的值如果
大于等于我们写的数字,那么就执行后面的命令,反之不执行。以上的示例中因为type hello.txt命令中如果没找到hello.txt文件,那么返回就是1,又满足的判断条件>=1,所以执行了echo Can't find.
IF [NOT] string1==string2 command 这是判断两个字符串是否相等的语句:
![b899e0e2b13bedc7e2a9a27b63cbbf71.gif](https://i-blog.csdnimg.cn/blog_migrate/c8c0e0fdba102a0df75f59c8d4d45b2d.gif)
在这里,我们接入用户输入,其中补充下批处理文件之基础篇中的set /p设置变量的知识,我们可以像上图那样在等号后面写上提示信息,当要输入的时候可以提示用户,就像python一样。
这种判断方式最常用的就是接受用户输入后来判断字符串是什么以此来执行相应的命令,记住!判断字符串的时候要加上英文的"",否则会报错。而判断字符串就难免遇到大小写的问题,这里if可以和上面的find一样,用一个/i来忽略字符串的大小写问题:
![4fd693bc1c531f2b8e99539bb76afc00.gif](https://i-blog.csdnimg.cn/blog_migrate/81016fdb474808c1e7d6e3d6c97e046e.gif)
相对于字符串的比较,if还提供了数字间的比较方式,其中关键词有:
![ef1a82c8282541e31af657125aec1b5c.png](https://i-blog.csdnimg.cn/blog_migrate/87747ee98c03e11e8ff30e3e69608360.png)
其中:
EQU - 等于、
NEQ - 不等于、
LSS - 小于、
LEQ - 小于或等于、
GTR - 大于、
GEQ - 大于或等于
其实就是对应的英文缩写:equal等于,less小于,greater大于。
![689e16014a471b79a695f21c85771ef8.gif](https://i-blog.csdnimg.cn/blog_migrate/754ade583e37550aff8ea3c307abe3b7.gif)
这里以lss为例,判断用户输入的数字是否小于0,是的话执行命令。反之不执行。
这里讲一下
[]中的NOT的作用,顾名思义,当你加上这个词的时候相当于把判断的条件取反,以上面为例,上面我写的是if %a% lss 0,就是判断a的值小于0,而我改成if not %a% lss 0, 就是判断a的值不小于0的时候执行之后的命令,if中的判断语句都可以加not来取反!
IF [NOT] EXIST filename command 判断是否存在指定的文件
![e630f648bc4b619ee5927db95ffc9be8.gif](https://i-blog.csdnimg.cn/blog_migrate/b871b22eeff85effe3ec0b47ec12d7f6.gif)
在这里我们判断是否存在1.txt的文件,如果有,就执行删除此文件的功能。
当然,
if
语句
没有这么简单,它一般都和另一个关键词
else
一起用
:
![d6da17205c6eddf0ff2a392424286fd8.gif](https://i-blog.csdnimg.cn/blog_migrate/12c66f7e3bb7a92137596cb1c9223c2a.gif)
![e649f5e1826149599e0f4565b109144c.gif](https://i-blog.csdnimg.cn/blog_migrate/e3cb2ae839aee57229eb0e982063245a.gif)
以上的格式读者们可以不这么写,这只是作者敲代码遗留的习惯,因为在编程语言中,if判断语句的书写规范差不多是这样的。这样可以加强代码的可读性。其中,加括号不仅是为了声明界线,而且是为了可以在里面嵌套多个命令行。
![02daaac68ad26191d2ed4d618289e5f5.gif](https://i-blog.csdnimg.cn/blog_migrate/e329e6a57b8c69e85074137dd2ed1871.gif)
以上说了
if语句、
if...else语句,接下来还有
if...else if...else if
语句、
if...else if...else if...else语句总共4类语句,但因为都具有相似性,这里拿最后第三种格式来举例:
![dc67c927e8c9a21d1ecf5f363145bc6f.gif](https://i-blog.csdnimg.cn/blog_migrate/a3910450e7ecdb926599c8d2d1ea4324.gif)
在后两个语句中只要你不累,可以在if和else中嵌套多个else if语句。
for 循环语句的代表,这里只介绍其中一种:
![863a830bc3f41370d9ace6aca4c6ef42.png](https://i-blog.csdnimg.cn/blog_migrate/7fc96817d96ed2d5a16d24a74de02c6f.png)
![252e2c09b39c2116461f2dac8515d7dd.gif](https://i-blog.csdnimg.cn/blog_migrate/62c6e150e52f6b0bb3a517cd8f880866.gif)
以上图中的命令来讲,%%a就是设置一个变量(一定是要两个%%,否则会报错),而括号中的三个数分别代表参数的
初始取值,参数的
变化方式,参数的
变化界限,在(1,1,5)中就是代表参数初始取值为1,以+1的递增,直到参数变为5的时候停止。又比如(10,-1,5)就表示从10递减到5,循环6次!而do后面加括号和if讲的是一样的道理。注意:/L一定不能省,否则会变成依次取括号中的数值:
![4bf4a019e30451d8e3ce45998059ae34.gif](https://i-blog.csdnimg.cn/blog_migrate/b0cdaf995ace92d54991fc785ffe9fb8.gif)
以上就是今天作者要分享的内容了,读者如果想要自己动手用这些命令写一些属于自己的东西一定要把这里的东西弄懂!
看完之后要付诸实践的读者一定要知道的事:1、在/?中显示的一些命令用法的列举中,那些大写的字母都是不可以改变的,是固定死的。2、在批处理中,和python相似,一样有着严格的缩进要求,一不小心多打或少打一个空格,就会导致批处理不能用,比如下图:
![ca163a8e042e70d9a3073b8a5a9e612c.png](https://i-blog.csdnimg.cn/blog_migrate/781ef9a616c0d7d15d905618d457286b.png)
红色点就是代表需要空格的地方。一旦少了一个,都会报错。