批处理脚本讲解思路
一. 批处理介绍
1、批处理的概述:
批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式,只要遵守以下这条就ok了:
(1)每一行可视为一个命令,
(2)每个命令里可以含多条子命令,
(3)从第一行开始执行,直到最后一行结束,它运行的平台是DOS。
批处理有一个很鲜明的特点:
使用方便、灵活,功能强大,自动化程度高。
批处理文件的扩展名是BAT或者CMD,把任何一批命令放在有该扩展名的文件里,执行的时候都会按顺序逐条的执行, 在以后学习内容中, 还可以在其中加入一些逻辑判断的语句,即让里面的命令在满足一定条件时执行指定的命令。
2、举例说明:
第一步:建立批处理文件
新建一个文本文档,将名字改为 第一个实例.bat
创建批处理文件 第一个实例.bat
重命名
第二步:写代码
右键"第一个实例.bat"文件,选中“编辑”,然后写代码。代码如下:
@echo off
echo 非常感谢所有条友的关注与支持!
echo 感激不已, 惟有认真, 毫无保留的分享.
pause
编辑批处理脚本
第三步:保存后,双击“第一个实例.bat”运行。
执行批处理脚本
简单了解代码意思:
@echo off 这一句是关闭回显(缺省回显是打开的),如果没有这一句的话会显示一些比较碍眼的信息。
echo 非常感谢所有条友的关注与支持!
echo 感激不已, 惟有认真, 毫无保留的分享.
上面两条指令的结果是在屏幕上打印echo后面的内容(如上图例脚本执行的结果)
pause 这个pause,英文是暂停的意思,让脚本执行完上面的命令后等用户确认退出
详细解释:
(1)、echo off 关闭回显(即批处理中的命令语句不会显示)
(2)、echo on 打开回显
编辑中去除关闭回显的指令行
开启回显执行的结果
在CMD中解释一下回显是咋个意思
(3)、符号“@”的意思是不显示它后面的命令语句,只显示命令执行的结果!
把首行命令中的小老鼠符号去掉看看
(4)、echo 用于显示
echo命令的作用有两个,一个时在CMD上显示一行内容,
如:echo 非常感谢所有条友的关注与支持!!
还有一个是显示关闭命令的回显:echo off
我们在echo off命令前加一个“@”符号是为了不让echo off这条命令本身显示出来,可以让批处理达到整体的美观!
如测试以下代码:
@echo off
echo 你好
echo 你好
pause
第二个实例
再次解释一下:pause命令就是暂停的意思,防止批处理执行完毕后直接退出,执行到pause命令时CMD就会显示
“请按任意键继续”这一行!
3、基础知识补充
前面几篇基础知识的链接:
DOS基础命令汇总(一)
DOS基础命令汇总(二,三,四,五)
Dos命令进阶(一)---Net, Netstat
Dos 命令进阶(二)---FTP命令
如果大家对那个DOS命令不明白,可以通过输入“命令”/? 或 执行 "help 命令名"
4、具体实例分析
@echo off
echo 正在清除系统垃圾文件,请稍后。。。
del /s /f /q %systemdrive%\*.tmp >nul 2>nul
del /s /f /q %systemdrive%\*.gid >nul 2>nul
del /s /f /q %systemdrive%\*.chk >nul 2>nul
del /s /f /q %systemdrive%\*.old >nul 2>nul
del /s /f /q "%userprofile%\localsettings\temp\*.*" >nul 2>nul
del /s /f /q"%userprofile%\recent\*.*" >nul 2>nul
del /s /f /q"%userprofile%\cookies\*.*" >nul 2>nul
del /s /f /q "%userprofile%\localsettings\history\*.*" >nul 2>nul
del /s /f /q "%windir%\temp\*.*">nul 2>nul
del /s /f /q"%windir%\prefetch\*.*" >nul 2>nul
echo 垃圾文件清理完毕!
echo. & pause
分析实例代码:
有了前面几篇基础命令的学习, 想必条友已经知道这个 del 命令是怎么个意思了吧, 它就是删除文件的命令.
del /s /f /q %systemdrive%\*.tmp >nul 2>nul 取这一行代码来说明一下
/s 参数是删除当前目录及其子目录下的指定文件
/f 表示删除没商量,强制删除
/q 表示静默执行, 不提示确认信息.
%systemdrive% 这个是系统环境变量, 你在CMD窗口执行 echo %systemdrive% 看是什么结果
echo 查看系统环境变更
>nul 2>nul 这个呢? 它的意思是将命令执行时的信息或者错误, 还是图解一下吧.
>nul 和 2>nul 的功能演示(后面的特殊符号中还会提到)
注:这是一个用来清除系统垃圾文件的批处理程序。命令其实也是很简单的,主要是用到“del”命令和相关的参数来实现, 有关“del”命令的参数大家可以参考“del /?”来得到详细的帮助。
另外还有“%systemdrive%、%userprofile%”。那么它们是什么呢,这些其实是系统变量,也就是系统目录的另一种表示形式而已。我们可以通过输入“echo %userprofile%”来看看它代表的是系统中的那个目录。那么其它的也是一样
*.tmp的意思是,这个*号是一个通配符号,它表示的是所有以 .tmp 为扩展名的文件。不知道大家是否能理解?
有关系统变量和通配符后面还会详细说明
二. 特殊字符详解
1、@
隐藏执行的命令,只显示结果。
例子:
echo 条友们好
@echo 条友们辛苦了
pause
屏蔽回显命令的演示
2、&
命令连接符号,就是将两个命令连续执行,不用分行
例子:
dir c:\ & dir d:\ & dir e:\
多命令同行执行连接符 &
3、&&
连接两个命令,当&&前的命令成功时,才执行&&后的命令
说白点儿就是, &&前面的命令先执行成功才能执行 &&后面的命令, 如果前面命令执行失败, 后面就不执行了.
高一学的逻辑运算知识在这里用上了, 这叫一假则假, 两个条件有一个为假, 整个都为假了, 则就没必要执行下去了, &&前面那条指令失败了, &&后面的指令就不会再执行了.
例子:
dir x:\ && dir d:\
一假则假
4、||
命令连接符号,表示上一条命令执行失败后,才执行||符号后的内容
这个命令跟上一个相反, 如果 || 前的执行成功, 则 || 后面的命令就不执行了. 逻辑上的叫一真则真
例子:
dir x: || dir c:\
|| 前面的失败了才执行 || 后的指令
如果执行: dir c:\ || dir d:\ 呢, 则只执行 dir c:\ , dir d:\ 这条指令就不会执行, 这一条希望条友能亲自尝试一下看.
5、|
管道符号,就是将上一个命令的输出的内容,作为下一个命令的输入内容
管道是一种很形象的说法, 就是将 | 前面的指令执行后的输出结果暂存在内存中, 作为 | 后面指令执行的输入内容.
这个符号 "|" 就好似一条管理, 将前的送到后面去, 发挥你屌炸天的想象力吧, 嘿嘿嘿
例子:
netstat -an | find "135"
为了具体我先分别执行 netstat -an 和 find "135" , 而后的 find "135" 意思是在某文件中查找字符串135, 在哪个文件中呢, 这里没有给, 所以单独执行 find "135" 铁定会执行失败的, 看下图:
单独执行 netstat
find命令, 在某文件中查看指定的字符串
netstat 与 find 通过管道命令配合执行
6、>
重定向符号,将命令的输出结果重定向到其后面的设备中去,后面的设备中的内容被覆盖
例子:
dir c:\ > cdir.txt
dir c:\ > d:\cdir.txt
重定义符号 > 的使用
7、>>
重定向符号,将命令的输出结果重定向到其后面的设备中去,后面的设备中的内容会被增加在后面
该符号的作用与前面那个 > 符号的区别是: 这个 >> 符号的作用是向一个文件中追加内容, 如果该文件不存在则创建, 如果存在, 则在文件已有内容的后面追加要输出的内容.
而 > 符号的作用是, 新建一个文件, 并向该文件中添加要输出的内容, 如果指定的文件已存在, 则先清空文件内容再添加要输出的内容.
例子:
echo 第一行内容 >>
echo 第二行内容 >>
echo 第三行内容 >
两个重定向符号的对比
8、^
转义字符, ^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
转义字符的作用演示
9、% 批处理变量引导符
这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使用的情况除外)。
引用变量用%var%,调用程序外部参数用%1至%9等等
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 为命令行传递给批处理的参数
%0 指批处理文件本身,包括完整的路径和扩展名
参数 %0的用处演示
%0 参数在批处理中的演示效果
%1 第一个参数
%9 第九个参数
%1--%9这是9个外部参数, 多于9个时就使用%*
计算几个数字的和并打印
%* 从第一个参数开始的所有参数
匹配所有外部参数%*
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
例:最简单的复制文件自身的方法
代码d:\第五个实例.bat:
copy %0
这段代码的意思就是 复制脚本自身到当前目录下. 这里省略一个点, 完整的写是:
copy %0 .
如果条友看了我前面讲的那CD 命令应该知道 . 代表当前目录, .. 代表父级目录, 所以就有 cd .. 就是返回上级目录.
先切换到与脚本文件所在目录不同的目录中,比如C盘下, 再执行:
d:\第五个实例.bat
小技巧:添加行内注释
%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用(等于没说)。
10、*
通配符号,表示任意个任意字符
例子:
dir c:\windows\*.log
del /s /q /f c:\windows\*.log 强制删除当前目录及其子目录下所有以 .log 结尾的文件.
通配符 * 号的应用实例
11、?
通配符号,表示任意一个字符
例子:
dir c:\?indows 列出C:\ 目录下所有任意以单个字符开头并以 indows 结尾名称的文件列表
如果 C:\ 下有Aindows , Bindows, HEindows 三个文件夹, 那么 ?indows 匹配 Aindows , Bindows 两个文件, 但HEindows却不匹配, 因为它是以 HE两个字符开头的文件.
通配符 ? 的操作实例
12、.
表示当前目录
例子:
dir .\ , dir . , dir 三条指令是同样的执行结果, 如果是当前目录, 点这个符号可以省略
点符号在CMD中的应用
点符号在CMD中的应用
13、..
表示上一级目录(也称父级目录)
例子:
dir ..\ 查看父级目录下的文件列表
两点表示上一级目录或父级目录
14、" "
界定符号,通常用来引用有空格的目录
例子:
dir "c:\Documents and settings" 这个界定符在WIN7中可以不用, 但在XP系统中还是会要用到的. 当你要切换的目录名中有空格时, 请使用 双引号 括起来, 否则会报错. 建议需要不需要都使用这个界定符, 应该更保险一些.
目录名中带空格须使用双引号进行包括
15、:
标签定位符号,表示后面的内容是一个标签名
例子:
@echo off
:again
echo 诚心感谢条码们对小编的关注与支持!
pause
goto again
标签跳转操作
16、,
某些时候可以当空格来使用
例子:
echo,
dir,c:\ 这个例子的意思太白了, 小编就不演示截图了.
17、;
分号,当命令相同时,可以将不同目标用来隔离
例子:
dir c:\;d:\ 如果你想同时查看 C:\, D:\ 两个目录下的文件列表, 就可以一个DIR 命令, 后跟多个要查看的目录路径, 相互之间以分号隔开就可以了.
18、::
表示后面的语句是注释。相当于c++中的"//"
例子:
@echo off
::显示c盘根目录文件. (注释就是说明性的文字内容, 不作为指令执行)
dir c:\*.txt
pause
注释符的使用
19. < 输入重定向
将要执行的代码存在一个文本 中:
d:
cd D:\我的头条20171127
dir
pause
执行命令:
cmd.exe <
输入重定向符号的使用
20. 逻辑运算符
EQU(Equ-al) - 等于
NEQ(N-OT Equ-al) - 不等于
LSS(LESS) - 小于
LEQ(L-ESS Equ-al)- 小于或等于
GTR(GREATER) - 大于
GEQ(G-REATER Equ-al) - 大于或等于
例如下面这段代码:
dir aaaa
if %ERRORLEVEL% EQU 0 (echo success) else (echo fail) [如果等于0说明执行成功, 否则执行失败]
先执行 dir aaaa 这个命令, 下面 if 命令语句(后面会细讲)是用来判断上一条命令是否执行成功, 如果成功就打印 success, 否则打印 fail.
逻辑运算符的使用
综合实例:
@echo off
ping /n www.qq.com || shutdown /r /t 180 /c 命令执行失败了,180秒后重启! && exit
%0
这条批处理文件主要是用ping命令来判断网络的连通性,当我们的ping命令执行成功后就不会执行它后面的内容。那假如没有ping通的话就执行它后面的相关命令了。
%0它表示的就是无限循环的执行我们的批处理程序。
注意: 如果不小心进入倒计时关机状态, 请执行 shutdown -a 指令来取消哦.
开启执行实例
我关闭了执行窗口或CTRL+C, 然后就...
取消关机状态
来看一下shutdown命令的帮助
shutdown /? 帮助文档查看
如何判断一条指令是否执行成功
根据我自己编写的脑图结构, 这才说了1/3的内容, 篇幅感觉有点儿过长了, 怕些许条友们都没有耐心读下去了. 先到这里吧, 小编发誓绝不是为了揍文章篇数的, 俺向来知无不言, 言无不尽, 诚心满满, 还请条友们明察!