本帖最后由 深蓝 于 2016-4-24 14:01 编辑
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展名为bat。
一、概述
批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序。
一般情况下,每条命令占据一行;当然也可以将多条命令用特定符号(如:&、&&、|、|| 等)分隔后写入同一行中;还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。
最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。
系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出。
二、批处理命令简介
首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显。
1.echo
echo 表示显示此命令后的字符 ;
echo off 表示在此语句后所有运行的命令都不显示命令行本身 ;
@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
(不理解的自行操作一遍,马上就能理解了!)
例:
@echo off
echo hello world
2.rem
注释命令,类似于在C语言中的//,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。
例:
@rem 我是一个注释
3.pause
暂停命令。运行 Pause 命令时,将显示下面的消息:Press any key to continue. . .(或:请按任意键继续. . .)
以上3个命令为例:
@echo off
echo hello world
@rem 我是一个注释
pause
4.call
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
例:
5.start
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
例:
start calc.exe
即可打开Windows的计算器。
6.goto
跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。
如果对不同的情况,需要执行不同的既定操作,若还是按照常规的执行流程的话,是无法完成任务的,这个时候,就需要引入流程跳转的概念,动用流程跳转语句 goto 了。流程跳转的含义是:改变默认的执行顺序,强制跳转到指定的位置执行特定的程序块。
例:假设需要判断用户输入的是A还是B,代码可以写成这样:
@echo off
set /p input=请输入字母A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
pause
exit
:A
echo 您输入的字母是A
pause
exit
:B
echo 您输入的字母是B
pause
exit
按照一般的执行流程,所有的代码都会自上而下逐行执行一次,结果将显示"您输入的字母是A"和"您输入的字母是B"这两行内容,很显然,这是达不到我们的要求的。
但是,实际的结果是:如果您输入的字母非A即B,则结果只会显示"您输入的字母是A"或者"您输入的字母是B";也就是说,代码的执行顺序发生了改变,不再一成不变地自上而下逐行执行了。
当输入字母A后,将执行第一条if语句,此条语句执行后,将跳转到标签段:A,从而绕过了第一条if语句和:A之间的所有代码行;当输入字母B后,将执行头两条if语句,当执行完第二条if语句后,将跳转到标签段:B,从而绕过了第二条if语句和:B之间的所有代码行。
从上面的例子可以看到,要让goto语句起作用,还需要:A或:B之类的标签段的配合。所谓的标签段,就是这样的一些代码块:
在首行上以单个冒号打头,其后紧跟一串字符,第二行及其之后的所有行为代码语句行。在这里,第一行的冒号是标签标志,紧跟它之后的字符串是标签名,两者合称标签。goto语句后面的部分为标签名,指引着该语句执行完之后该跳到转何方,标签则接收goto语句的跳转指令,引导着goto语句的后续操作。goto语句和标签互相呼应,在实现流程跳转时相辅相成,缺一不可。
三、批处理符号简介
1.重定向1 >与>>
将输出信息重定向到指定的设备或文件。系统默认输出到显示器。如:
echo aaaaa>a.txt
即可将aaaaa输出到文件a.txt中,屏幕上没有任何显示。如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息aaaaa;若a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息aaaaa。
echo aaaaa>>a.txt 类似于echo aaaaa>a.txt
区别在于:如果a.txt本已存在,>a.txt会擦除a.txt中的原有内容,而>>a.txt并不擦除原有内容,仅在a.txt文件的末尾添加信息aaaaa。a.txt不存在时,二者没有差别。
2.重定向2 <
将输入信息来源重定向为指定的设备或文件。系统默认从显示器读取输入信息。
重定向使用举例:
@echo off
echo 古黑论 >a.txt
echo 请任意输入字符,以回车结束:
set /p ifo=
echo 【 从屏幕获得的输入信息 】
echo %ifo%
set /p ifo=<a.txt
echo 【 从文件a.txt获得的输入信息 】
echo %ifo%
pause >nul
同学们观察命令与输出即可体会到重定向的功能和效果。
3.管道符号 |
将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。使用格为:command_1|command_2
管道符号使用举例:
@echo off
echo aaaa>a.txt
del /p a.txt
pause
@echo off
echo aaaa>a.txt
echo y|del /p a.txt
pause
对比以上两个批处理执行结果,即可明白管道符的用法和效果。需要说明的是,上面del命令添加开关/p只是为了让同学们明白管道符号的使用方法,实际删除文件时不加/p开关即可实现无提示直接删除。
4.转义符 ^
将特殊符号转化为一般符号,即剥离特殊符号的特殊地位。特殊符号指:| & > <
比如,如果我们想输出符号“>”,直接用命令 echo > 是不行的,必须修改为 echo ^> 。其余几个特殊符号类似需要有同样的处理。
转义字符使用举例:
@echo off
echo aaaa>a.txt
echo 第一句echo执行完毕
echo aaaa^>a.txt
echo 第二句echo执行完毕
pause
比较上面的两句echo,第一句echo将信息aaaa输出到了文件a.txt,而第二句echo则在直接屏幕上显示出aaaa>a.txt
5.逻辑命令符包括:&、&&、||
& 无条件执行&符号后面的命令;
&& 当&&前面的命令成功执行时,执行&&后面的命令,否则不执行;
|| 当||前面的命令失败时,执行||后面的命令,否则不执行。
例:
@echo off
echo ^|^|
reg add HKCU /v try /f||echo **成功**
reg add HKCU1 /v try /f||echo **失败**
echo ^&^&
reg delete HKCU /v try /f&&echo **成功**
reg delete HKCU /v try /f&&echo **失败**
echo ^&
reg delete HKCU /v try /f&echo **成功**
reg delete HKCU /v try /f&echo **失败**
pause
执行reg add或reg delete后,系统会给出执行结果;我们通过echo命令也给出了“执行结果”。对比系统和我们自己给出的结果,既可以验证逻辑命令的判断机理。
四、常用DOS命令
1.echo 和 @
回显命令
@ #关闭单行回显
echo off #从下一行开始关闭回显
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
echo on #从下一行开始打开回显
echo #显示当前是 echo off 状态还是 echo on 状态
echo. #输出一个”回车换行”,空白行
2.errorlevel
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码。默认值为0,一般命令执行出错会设 errorlevel 为1
3.dir
显示文件夹内容
dir #显示当前目录中的文件和子目录
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
dir c: /a:d #显示 C 盘当前目录中的目录
dir c: /a:-d #显示 C 盘根目录中的文件
dir c: /b/p #/b只显示文件名,/p分页显示
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
4.cd
切换目录
cd c:\ #进入c盘
cd abc #进入当前目录下的abc目录
cd .. #返回上一层目录
5.md
创建目录
md d:abc #在d盘中创建abc目录
6.rd
删除目录
rd abc #删除当前目录里的 abc 子目录,要求为空目录
rd /s/q d:temp #删除d盘temp文件夹及其子文件夹和文件,/q安静模式
7.del
删除文件
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
del /q/a/f d:temp*.* #删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del /q/a/f/s d:temp*.* #删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
8.ren
重命名命令
ren d:temp tmp #支持对文件夹的重命名
9.cls
清屏
10.type
显示文件内容
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
type *.txt #显示当前目录里所有.txt文件的内容
11.copy
拷贝文件
copy c:test.txt d:test.bak #复制 c:test.txt 文件到 d: ,并重命名为 test.bak
copy con test.txt #从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
con代表屏幕,prn代表打印机,nul代表空设备
copy 1.txt + 2.txt 3.txt #合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
#如果不指定 3.txt ,则保存到 1.txt
copy test.txt + #复制文件到自己,实际上是修改了文件日期
12.title
设置cmd窗口的标题
title 新标题 #可以看到cmd窗口的标题栏变了
13.ver
显示系统版本
14.label 和 vol
设置卷标
vol #显示卷标
label #显示卷标,同时提示输入新卷标
label c:system #设置C盘的卷标为 system
15.pause
暂停命令
16.rem 和 ::
注释命令
17.date 和 time
日期和时间
date #显示当前日期,并提示输入新日期,按"回车"略过输入
date/t #只显示当前日期,不提示输入新日期
time #显示当前时间,并提示输入新时间,按"回车"略过输入
time/t #只显示当前时间,不提示输入新时间
18.goto 和 :
跳转命令
:label #行首为:表示该行是标签行,标签行不执行操作
goto label #跳转到指定的标签那一行
19.find (外部命令)
查找命令
find "abc" c:test.txt #在 c:test.txt 文件里查找含 abc 字符串的行,如果找不到,将设 errorlevel 返回码为1
find /i “abc” c:test.txt #查找含 abc 的行,忽略大小写
find /c "abc" c:test.txt #显示含 abc 的行的行数
20.more (外部命令)
逐屏显示
more c:test.txt #逐屏显示 c:test.txt 的文件内容
21.tree
显示目录结构
tree d: #显示D盘的文件目录结构
22.&
顺序执行多条命令,而不管命令是否执行成功
23.&&
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
find "ok" c:test.txt && echo 成功 #如果找到了"ok"字样,就显示"成功",找不到就不显示
24.||
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
find "ok" c:test.txt || echo 不成功 #如果找不到"ok"字样,就显示"不成功",找到了就不显示
25.|
管道命令
dir *.* /s/a | find /c ".exe" #管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
#该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
type c:test.txt|more #这个和 more c:test.txt 的效果是一样的
26.> 和 >>
输出重定向命令
> #清除文件中原有的内容后再写入
>> #追加内容到文件末尾,而不会清除原有的内容
type c:test.txt >prn #屏幕上不显示文件内容,转向输出到打印机
echo hello world >con #在屏幕上显示hello world,实际上所有输出都是默认 >con 的
copy c:test.txt f: >nul #拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
copy c:test.txt f: >nul 2>nul #不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
echo ^^W ^> ^W>c:test.txt #生成的文件内容为 ^W > W
#^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
27.<
从文件中获得输入信息,而不是从屏幕上
一般用于 date time label 等需要等待输入的命令
@echo off
echo 2005-05-01>temp.txt
date <temp.txt
del temp.txt
#这样就可以不等待输入直接修改当前日期
(这几个前面都说过了、)
28.%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
命令行传递给批处理的参数
%0 #批处理文件本身
%1 # 第一个参数
%9 #第九个参数
%* #从第一个参数开始的所有参数
29.if
判断命令
if "%1"=="/a" echo 第一个参数是/a
if /i "%1" equ "/a" echo 第一个参数是/a
#/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
if exist c:test.bat echo 存在c:test.bat文件
if not exist c:windows (
echo 不存在c:windows文件夹
)
if exist c:test.bat (
echo 存在c:test.bat
)
else (
echo 不存在c:test.bat
)
二楼续↓↓↓
|