写在前面:
提起批处理,或者.bat/.cmd为后缀名的文件,大家可能都见过,也许会比较陌生,这并不是一种新的编程语言或者一种很前沿的技术,在早期的windows系统下的计算机,其实只有一个黑框框 — DOS窗口,就像下面的一样,当时还没有鼠标。所以只能用键盘来进行输入,就是在这个DOS窗口输入命令,来与计算机进行交互。
批处理文件简介:
1.所谓的处理文件其实就是以.bat/.cmd为后缀的文本文件,是可以拿文本编辑器进行打开的,这个文件的每一行都是一条DOS命令,因此其可以依次处理多条DOS命令,其效果和在DOS下依次执行各条命令相同发,这也是其名字批处理的由来。批处理文件一般使用文本编辑工具就可以编写。
2.处理文件可以双击执行也可以在DOS窗口下输入批处理文件的名称,其本质还是系统调用Cmd.exe来运行该文件。
3.批处理文件是一种简单的程序,并没有很严格的编程规范。
4. .cmd文件可以使用的命令比.bat多,但是.cmd文件只可以在windows2000以后使用。
5.批处理文件是不区分大小写命令的,shell脚本则不然。
6.批处理文件可以放在任意的路径下运行。
一、写出第一个属于自己的批处理文件
1.1 新建一个文本文档
1.2 编辑并保存
1.3 修改文件后缀名为.bat/.cmd (当然先修改文件名再编辑也是可以的,并无先后顺序之分)
1.4 双击运行(或者在命令窗口输入文件名运行)
1.4.1 双击运行效果:
可以看到,咱们的 helloworld 也是成功的打印出来了,当然咱们也翻车了,不要慌,咱们看看这种问题怎么解决
1.4.2 解决编码问题
只需要在notepad++将其转为ANSI编码即可
或者在使用文本文档保存时选择编码为ANSI即可:
可以看到已经显示正常了,至于为什么要设置为ANSI编码格式,可以看看我们DOS窗口其原本的编码格式:
打开DOS窗口快捷键:Windows + R
每天学会一个小技巧:当你想复制这个DOS窗口里的内容,却发现 CTRL + C 窗口就退出关闭了,这时候可以在空白处 :全选 --> 右键 – > 编辑 --> 复制
可以看到这个DOS窗口的编码格式是ANSI
这里的 936 是微软为中国区设置的编码格式,当然,我们也可以对编码格式进行修改
修改命令如下:
chcp 编码格式代码
常见编码格式代码
注意:这种只是临时的进行修改当前文件的编码格式,当这个DOS窗口关闭后又将恢复到原来的编码格式。
1.4.3 DOS窗口下输入 批处理文件名 运行效果
可以看到两者的运行效果是一样的,不过大家要注意路径的问题
例如:批处理文件在D盘,而DOS窗口的当前路径是在C盘下,那这样会存在找不到文件的情况 因此大家可以写上批处理文件的完整路径,不过感觉这样好麻烦,还不如我咔咔双击一下呢。
二、常见的批处理命令
2.1 echo 显示消息;打开回显或者关闭回显功能
一般用于打印一些日志或说明,将结果或者批处理过程中的异常或者错误打印出来便于分析
echo [message]
示例:
echo helloworld ::打印helloworld
效果:
echo [on/off] 打开或关闭回显功能
示例:
echo offecho helloworldrem echo [message] 在DOS窗口打印message 就像我们C++ 里的 cout<<"helloworld"<<endl;rem rem 这个命令是注释的意思,方便DOS命令的可读性,当然也可以用"::" 来替代::第一个例子肯定是helloworld啦!pause::pause 命令是为了让那个DOS黑框框可以停下来,不然他一闪而过,啥也看不清
运行效果:
echo onecho helloworldrem echo [message] 在DOS窗口打印message 就像我们C++ 里的 cout<<"helloworld"<<endl;rem rem 这个命令是注释的意思,方便DOS命令的可读性,当然也可以用"::" 来替代::第一个例子肯定是helloworld啦!pause::pause 命令是为了让那个DOS黑框框可以停下来,不然他一闪而过,啥也看不清
运行效果:
可以看到on / off 这个参数就是是否显示 DOS命令的一个作用。
2.2 @ 表示不显示后面的命令
@ 与 echo off 相似,但是其只能不显示后面的这一行命令,作用域之后这一行
示例:
@echo offecho helloworldrem echo [message] 在DOS窗口打印message 就像我们C++ 里的 cout<<"helloworld"<<endl;rem rem 这个命令是注释的意思,方便DOS命令的可读性,当然也可以用"::" 来替代::第一个例子肯定是helloworld啦!pause::pause 命令是为了让那个DOS黑框框可以停下来,不然他一闪而过,啥也看不清
运行结果:
2.3 rem 相当于注释作用
也可以使用" :: "双冒号,表示注释,同样作用域也只是这一行,同理这一样是不被执行的,和代码规范一样,加上合理的注释可以让你的代码或者语句更加的有可读性。
示例:
rem echo [message] 在DOS窗口打印message 就像我们C++ 里的 cout<<"helloworld"<<endl;rem rem 这个命令是注释的意思,方便DOS命令的可读性,当然也可以用"::" 来替代
2.4 pause 暂停
有时候我们需要看到批处理文件的一些信息,但是打印出来之后机会一闪而过,什么也看不到,因此可以在需要暂停的地方使用 pause 命令,使其停下来。停下来之后按任意键就可以继续执行。
示例:
@echo helloworldpause
2.5 ren 重命名文件
ren first.txt first.bat ::将first文件重命名为first.bat
2.6 if 判断
和咱们的编程语言,用于判断条件是否成立,成立则执行相应的程序
除了 常见的
2.6.1 if else
if 条件(成立时执行的命令) else (不成立时执行的命令)::执行的语句建议都写在 "()" 里。
注:如果else 要换行需要在 if 语句的末尾使用 " ^ " 符号将语句进行连接,否则会报错
例如:
if 条件一 (执行的语句)^else (执行的语句)
2.6.2 if [ not] exist XXX表示 如果存在XXX的意思 一般用来判断文件是否存在
例如:
first.bat :
@echo offif exist second.bat (second.bat) else (echo "the file not exist")::当存在second.bat 时就执行这个批处理文件 否则打印"the file not exist"pause
文件不存在时:
当文件存在时:
second.bat :
@echo offecho "I am second.bat"pause
注:这里如果两个文件在相同目录下不用写路径,但是如果不在同一目录下,需要写上文件的绝对路径,否则会出现错误。
2.6.3 if not exist如果不存在 …
DOS命令里并没有 != 这种写法,但是提供了 not 关键词,也是条件取反的意思。
2.6.4 if errorlevel number如果返回数字为 number …
一般DOS程序会在执行结束后返回一个数字来代表程序运行的结果,称为错误码 errorlevel 或者返回码,有点返回值那味了是不
常见的返回码为 : 0 1。这样就可以根据返回值来进行判断下一步要执行的指令了。
示例:
@echo offxcopy second.bat D:::xcopy [xxx路径下的文件] [拷贝的目标目录]::call [文件路径] [filename] 调用另一个批处理文件,但是当前的怕批处理文件并不会结束if errorlevel 1 (echo 拷贝失败) else if errorlevel 0 (echo 拷贝成功)pause
运行结果:
2.7 call调用另一个批处理文件或可执行程序,并不终止原来的文件,虽然说不使用call 也可以调用别的批处理文件,但是这样调用的批处理文件执行结束后不会回到原来的批处理文件
注意:不要调用自身可能会陷入死循环。
示例:
fisrt.bat :
@echo offif exist second.bat (call second.bat)^else echo 文件不存在::call [文件路径] [filename] [parameters]调用另一个批处理文件,但是当前的怕批处理文件并不会结束::并且在调用批处理文件时可以传入参数echo second.bat 已经执行完毕pause
second.bat :
@echo offecho "I am second.bat"pause
运行结果:
2.8 goto label:跳转到指定标签行,然后从": label" 的下一行开始处理命令 ,goto 语句经常和 if 连起来用
label 的名字可以随意取,goto 是根据 " : " 找到该标签的,不要忘记了 冒号。
示例:
@echo offif exist second.bat (goto case1):case2echo i am case2:case1echo i am case1call second.batpause
运行结果:
2.9 start:调用外部程序
例如我这里写了一个 VBS 程序
打开它.vbs :
con =MsgBox ("你说打工人是不是人上人?",vbYesNo + vbInformation)if con = vbyes thenmsgbox "人上人YYDS"end ifif con=vbNo thenmsgbox "不是也得是!"end if
批处理文件:
first.bat
@echo offstart 打开它.vbspause
运行结果:
选择是:
选择否:
这样的功能 call 命令也可以做到,但是这两者又有什么不同呢?
1.call 命令主要来进行批处理的内部调用,当然也可以调用可执行程序,而start 不能进行内部调用,但是其可以执行几乎所有的外部程序。
2.call 是在当前窗体进行调用一个子进程,变量可以互通,但是start 调用外部程序是相当于是新开一个进程。
3.call 可以将参数传入子进程,子进程也可以将值返回,但是start 只能进行传参,但是不能返回参数或者变量
批处理相关的命令秩序更新中…