一、 批处理
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。目前比较常见的批处理包含两类:
- PS批处理
- DOS批处理
PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;
DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。
这里要讲的就是DOS批处理。
二、 DOS批处理
DOS批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是command.com
或者cmd.exe
)解释运行。类似于Unix中的Shell脚本。
批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if
,for
,goto
等命令控制程序的运行过程,如同C
,Basic
等高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。
批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或DOS命令创建,也可以用DOS下的文本编辑器Edit.exe
来编辑。在“命令提示”下键入批处理文件的名称,或双击该批处理文件,系统会调用cmd.exe
运行该批处理程序。
一般情况下,每条命令占据一行;当然也可以将多条命令用特定符号(如:&,&&,|,||等)分割后写入同一行中;还有的情况就是像if
、 for
等较高级的命令,则需要占据几行,几十行,几百行的空间。
系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行开始向下逐句执行所有的命令,直至程序结尾或遇见exit
命令或出错,意外退出。
注意
问题描述
批处理文件执行的过程中打印出来的中文乱码原因
文件可能是 utf-8 编码,cmd 支持 ANSI 编码解决方法
用【记事本】打开>【另存为】>【修改编码为: ANSI 】
三、 简单批处理命令
1. echo命令
**功能概述:**打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo【批处理与联机处理】
语法:
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称管道符号,一般为 > 或者 >> 或者 ^)结合来实现输入一个命令到特定的文件中。
举例:
第一步:建立批处理文件
第二步:写代码
@echo off
echo hello world!
pause
第三步:保存
解释说明
@echo off//关闭回显,如果没有这一句将会显示一些不必要的信息,比较碍眼echo hello world!//屏幕上显示hello world!pause
echo off 关闭回显(即批处理中的命令语句不会显示)
echo on 打开回显
@ 符号的意思是不显示它后面的命令语句,只显示命令执行的结果!
例如:
echo 你好@echo 你好
显示结果为:echo 你好你好
总结:
echo命令的作用有两个,一个是在CMD上显示一行内容,如:echo 你好。还有一个作用是关闭命令的回显:echo off
我们在echo off命令前加一个“@”符号是为了不让echo off这条命令本身显示出来。
pause命令是暂停的意思,防止批处理执行完之后直接退出。
遇到不明白的命令,可以使用 命令/?来获取帮助。 例如:echo/?
2. Del命令
功能概述:删除文件
例如:del d:\lalala.txt
操作结果:删除d:\lalala.txt
del命令有几个重要的参数:
/p 删除文件之前进行确认
/F 强制删除文件
/S 从所有子目录删除指定文件
/Q 安静模式。删除全局通配符时,不要求确认
例如删除C盘下所有名为:lalala.txt的文件,且文件是只读的,改怎么办?
del /f /s c:\lalala.txt
综合应用:
@echo off
echo 正在清除系统垃圾,请稍后......
del /s /f /q %systemdrive%*.tmp >nu1 2>nul
del /s /f /q %systemdrive%*.gid >nu1 2>nul
del /s /f /q %systemdrive%*.chk >nu1 2>nul
del /s /f /q %systemdrive%*.old >nu1 2>nul
del /s /f /q "%systemdrive%local settings\temp\*.*" >nu1 2>nul
del /s /f /q "%systemdrive%recent\*.*" >nu1 2>nul
del /s /f /q "%systemdrive%cookies\*.*" >nu1 2>nul
echo 垃圾清理完毕!
echo. & pause
这是一个用来清除系统垃圾文件的批处理程序。%systemdrive%
这些是系统变量,也就是系统目录的另一种表示形式而已。我们可以通过输入echo %systemdrive%
来看看它代表的是系统中的哪个目录。*.tmp
中 * 是一个通配符,它表示所有后缀名为.tmp为扩展名的文件。>nu1 2>nu1
的意思是将命令执行时的信息或者错误全部给屏蔽掉。
3. cls命令
**功能概述:**执行该命令后,屏幕上所有信息都被清除,光标重新定位到屏幕左上角。
4. 注释
块注释:
REM为注释命令,一般用来给程序加上注解,该命令后的命令不被执行,但能回显。
::也可以起到rem的注释作用,且简洁高效,但有两点需要注意:
- 任何以冒号:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容
- 有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别
- 无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto语句无法识别的标号,可以起到注释作用。
所以::常常被用作注释符号,其实 :+ 也可以起到注释作用。
- 与rem不同的是,::后的字符行在执行时不会回显,无论是否用echo on打开命令行回显状态。因为命令解释器不认为他是一个有效的命令行,就此点来看,rem在某些场合下将比::更为适用;另外,rem可以用于 config.sys 文件中。
行内注释:
格式:%注释内容%
举例:
@Rem here is the 注释
::Rem here is the 注释
5. pause命令
功能概述:暂停命令,运行后,将显示下面的消息。
举例:
@echo off
:begin
copy d:\*.* c:\
echo 请插入另一张光盘...
pause
goto begin//将d盘下的所有文件复制到c盘
6. call命令
**功能概述:**call命令可以在批处理执行的过程中,调用另一个批处理,当另一个批处理执行完毕之后,再继续执行原来的批处理。
call command
调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用,比如变量的多级嵌套。在批处理编程中,可以根据一定条件生成命令字符串,用call可以执行改字符串。
call [drive:] [path] filename [batch-parameters]
调用的其他批处理程序。filename
参数必须具有.bat
或.cmd
扩展名。
call :label arguments
调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头,以命令 goto:eof 结尾
另外,批处理文本参数按照(%0,%1,%2…等等)有如下改变:
批处理脚本里的 %* 指出所有的参数如(%1,%2,%3…)
批处理参数(%n)的替代已被增强:
%~1 -删除引号(``),扩充%1
%~f1 -将%1扩充到一个完全版合格的路径名
%~d1 -仅将%1扩充到一个驱动器号
%~p1 -仅将%1扩充到一个路径
%~n1 -仅将%1扩充到一个文件名
%~x1 -仅将%1扩充到一个文件扩展名
%~s1 -扩充的路径只含有短名
%~a1 -将%1扩充到文件属性
%~t1 -将%1扩充到文件的日期/时间
%~z1 -将%1扩充到文件的大小
%~$PATH:1 -查找列在PATH环境变量的目录,并将%1扩充到找到的第一个完全合格的名称,如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串可以组合修订符来取得多重结果
%~dp1 -仅将%1扩展到驱动器号和路径
%~nx1 -仅将%1扩展到文件名和扩展名
%~dp$PATH:1 -在列在PATH环境变量中的目录里查找%1,并扩展到找到的第一个文件的驱动器号和路径。
在上面的例子中,%1和PATH可以被其他有效值替换。%语法被一个有效参数号码终止。%修订符不能跟%*使用。
注意:
参数扩充时不理会参数所代表的文件是否真的真实存在,均以当前目录进行扩展要理解上面的知识,下面的例子很关键。
@echo off
echo 产生一个临时文件 > tmp.txt
rem 下一行先保存当前目录,再讲c:\windows设为当前目录
pushd c:\windows
call :sub tmp.txt
rem 下一行恢复前次的当前目录
popd
call :sub tmp.txt
pause
del tmp.txt
exit
:sub
echo 删除引号:%~1
echo 扩充到路径:%~f1
echo 扩充到一个驱动器号:%~d1
echo 扩充到一个路径:%~p1
echo 扩充到一个文件名:%~n1
echo 扩充到一个文件扩展名:%~x1
echo 扩充的路径只含有短名:%~s1
echo 扩充到文件属性:%~a1
echo 扩充到文件的日期/时间:%~t1
echo 扩充到文件的大小:%~z1
echo 扩充到驱动器号和路径:%~dp1
echo 扩充到文件名和扩展名:%~nx1
echo.
goto :eof
例2:
set aa=123456
set cmdstr=echo %aa%
call %cmdstr%
pause
本例中如果不用call,则直接运行%cmdstr%,将显示结果%aa%,而不是123456.
7. start命令
**功能概述:**调用外部程序,所有的dds命令和命令行程序都可以由start命令来调用。
如:start calc.exe 既可打开Windows的计算器
常用参数:
MIN -开始时窗口最小化
SEPARATE -在分开的空间内开始16位Windows程序
HIGH -在High优先级类别中开始应用程序
REAL TIME -在REAL TIME优先级类别开始应用程序
WAIT -启动应用程序并等待他的结束
执行的应用程序是32位GUI应用程序时,cmd.exe不等应用程序终止就返回命令提示。如果在命令脚本内执行,该行为不会发生。
例:
start explorer d:\
pause
调用图形界面打开D盘
8. goto命令
**功能概述:**跳转
在批处理中以“:XXX
"来构建一个标号,然后用goto xxx来跳转到标号:XXX
处,然后执行标号后的命令。
标签的名字可以随意起名,但是最好是有意义的字符串。goto命令就是根据这个冒号 :来寻找下一步跳转的位置。
例如:
@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 goto startpause
leq:作用相当于小于<号
输出:
1
2
3
4
按任意键退出
9. set命令
功能概述:
显示,设置或删除变量
-
显示变量:set或set s前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。
-
设置变量:set aa=abcd 此句命令即可定义新的变量aa,同时为变量aa赋予初始值abcd。
-
删除变量:set aa= 此句命令即可删除变量aa。若变量aa已经被定义,则删除变量aa;若aa尚未定义,则此句命令无实际意义。
用法:set[环境变量]=[字符串]
例子:
C:\>set blaster=a220 i5 d1 //设置声卡的参数
a:\>set path=c:\dos //path c:\dos含义相同
需要说明的是,批处理中的变量是不分类型的,不需要像c语言的变量中还有很多变量类型。
set命令具有拓展功能,如用作交互输入,字符串处理,数值计算等,属于高级命令范畴。
10. 批处理符号
@
该字符在批处理中的意思是关闭当前行的回显。我们已经知道echo off能够关闭整个批处理命令的回显,但不能关掉echo off这个命令,现在我们在echo off这个命令前加个@,就可以达到所有命令均不回显的要求。
echo off
dir d:\
pause
@echo off
dir d:\
pause
>
该字符的意思是传递并覆盖,它所起的作用是将所运行的回显结果传递到后面的范围(后边可以是文件,也可以是系统控制台)
比如
文件1.txt的文件内容是:1+1
使用命令:dir *.txt > 1.txt //寻找该盘下的所有.txt结尾文件信息并将相关信息放在1.txt中
这时候1.txt的内容如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogKBNISX-1654856769236)(C:\Users\GW00293587\AppData\Roaming\Typora\typora-user-images\image-20220610112104873.png)]
>>
功能概述:该符号是将内容追加到文件末尾的意思。(>是从头开始覆盖)
|
功能概述:管道传输,将上一个命令执行的结果传到下一个命令去处理
例如:
dir c:\|find "txt"
pause
以上命令是:查找C盘所有文件,并检索格式为.txt的文件。find的功能可以使用find /?去查看。
在不使用format的自动格式化参数时,如何自动格式化c盘:
echo y|format c: /s /q /v:system
使用过format再格式化时,要输入y来确认是否格式化硬盘,这个命令前加上echo y并用|字符来将echo y的结果传给format命令,从而达到自动输入y的目的。
^
功能概述:该符号是对特殊符号 “<” ,“>”,“&”的前导符号,在命令中他将以上3个字符的特殊功能去掉,仅仅只把他们当成符号而不使用。
比如:
echo test ^>1.txt
运行结果为:
他没有追加在1.txt里,只是显示了出来。
&
该符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后面的命令执行。
比如:
dir z:\ & dir y:\ & dir c:\
以上命令会连续显示在Z,Y,C盘的内容,不理会该盘是否存在
&&
该命令和上面的类似,但区别是,第一个命令失败时,后面的命令也不会执行。
dir z:\ && dir y:\ && dir c:\
“”
双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
cd "program files"
cd progra~1
cd pro*
以上三种方法都可以进入 program file 这个目录
,
**功能概述:**逗号相当于空格,在某些情况下","可以用来做空格使用。
比如
dir,c:\
;
**功能概述:**当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序还会执行。
比如:
dir c:\;d:\;e:\;f:\
以上命令相当于
dir c:\
dir d:\
dir e:\
dir f:\
四、复杂批处理命令
1. 文件夹管理
cd: 显示当前目录名或者改变当前目录
md: 创建目录
rd: 删除一个命令
dir: 显示目录中的文件和子目录列表
tree: 以图形显示目录结构
path: 为可执行文件显示或设置一个搜索路径
xcopy: 复制文件和目录树
cd
进入某目录: cd name
一次性进入: cd name1\name2\name
返回上一层: cd … //两个点表示上一级,一个点表示当前目录
直接返回根目录: cd \ // \就代表根目录
md
格式:md name1 name2
rd
- 删除的目录不能有子目录
- 删除的目录不能有文件
- 不能删除当前目录
- 根目录不能删除
tree
**功能概述:**显示命令树结构
格式:tree 路径
tree /f 路径名 :显示目录时显示文件名
tree /a 以 ascll 码显示目录树
path
在DOS下,如果我们要执行某exe文件,电脑会在磁盘上寻找这个文件,如果不经过特殊处理,它只在当前目录下寻找,如果没有找到则提示出错。换句话说,在执行某文件之前,都要先转换到该目录下,显然:此举有点浪费时间。
path命令则可以解决此问题。如果在path命令中定义了某个目录,那么在任何目录下,都可以直接执行path中指定目录的文件。
格式:path 路径名1;路径名2;路径名3
例如:
path=c:\dos;c:\windows;c:\
执行结果:当我们执行一个文件时,电脑会现在当前目录下查找这个文件,找到则执行,如果没有找到,则电脑按照path命令所指定的目录顺序去查找,现在c盘的dos目录下,然后在windows目录下,最后在c盘根目录下寻找这个文件。
xcopy
功能概述: 拷贝目录和文件
适用场合:在进行连同子目录一起拷贝时很有用,在拷贝大量文件时比copy命令快
用法:
xcopy 文件名 目录 将指定文件拷贝到指定目录
xcopy 源目录 目的目录 将源目录连同子目录一同拷贝到目的目录下
Xcopy *.* 目的目录 /s 将文件与非空子目录拷贝到指定目录
Xcopy *.* 目的目录 /e 将文件与子目录拷贝到指定目录(包含空目录)
2. 文件管理
type 显示文本文件的内容
copy 将一份或多份文件复制到另一个位置
del 删除一个或数个文件
move 移动文件并重命名文件和目录。(Windows xp Home Edition中没有)
ren 重命名文件
type
格式:type name
type a.txt
copy
例:现有一叫做a.txt的文件,copy a.txt a.exe之后就会又生成一个叫做 a.exe 的文件
copy c:\.bat d:\zhang
结果:复制c盘下所有后缀名为.bat的文件到d盘zhang文件夹下。
del
**功能概述:**删除文件
del a.bat
del *.tmp
move
**功能概述:**移动文件
格式:move 原文件名 目的目录
ren
**功能概述:**修改文件名
格式:ren 源文件名 目的文件名
3.网络命令
ping 进行网络连接测试,名称解析
ftp 文件传输
net 网络命令集及用户管理
telnet 远程登录
ipconfig 显示,修改网络设置
msg 给用户发送消息
arp 显示,修改局域网的IP地址
ping
**功能概述:**进行网络连接测试,名称解析
ftp
功能概述: 文件传输
格式:
ftp-v-d-i-n-g 主机名,其中
-v 显示远程服务器的所有响应信息;
ftp -n -s:路径名 filename
net
**功能概述:**网络命令集及用户管理
net share -查看共享命令
net share ipc$ -设置ipc$共享
net share c$=c: -设置c盘为共享
net user -查看本地的用户列表
net user 用户名 密码 /add 增加一个用户
net user 用户名 /增加一个用户,密码为空
telnet
**功能概述:**远程登录
telnet 主机名/ip //ip为要连接的远程机的主机名或ip地址。
一旦telnet成功地连接到远程系统上,就显示登录信息并提示用户输入用户名和口令。如果用户名和命令输入正确,就能成功登录并在远程系统上工作。在telnet提示符后面可以输入很多命令,用来控制telnet会话过程,在telnet联机帮助手册中对这些命令有详细的说明。
ipconfig
**功能概述:**显示,修改网络设置
msg
**功能概述:**将消息发送给用户
MSG {username | sessionname | sessionid | @filename | *} [/SERVER:servername] [/TIME:seconds] [/V] [/W] [message]
username 标识指定的用户名。
sessionname 会话名。
sessionid 会话 ID。
@filename 识别这样一个文件,该文件含有将所发消息发送到的用户名、会话名和会话标识号的列表。
-
给指定服务器上的所有会话发送信息。/SERVER:servername 要联系的服务器(默认值是当前值)。/TIME:seconds 等待接收器确认消息的时间延迟。/V 显示有关执行的操作的信息。/W 等待用户的响应,跟 /V 一起有用。message 要发送的消息。如果没有指定,发出提示,或者从 stdin读取。
4. 系统管理
at -安排在特定日期和时间运行命令和程序
shutdown -立即或定时关机或重启
taskkill -结束进程
tasklist -显示进程列表
reg -注册表控制台工具