之前项目用到了MySQL、Redis、MongoDB和其他一些独立的jar包程序,测试的时候需要用脚本配置java环境变量,并运行各个程序。结果打开有四五个cmd黑框,领导又要求不显示cmd黑框。经过网上查阅资料,学习了一下批处理的一些知识,写下这篇文章整理一下。
一、批处理介绍
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展名为bat。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本,而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行。批处理的编程能力远不如C语言等编程语言,也十分不规范,大小写不敏感(命令符忽略大小写)。每个编写好的批处理文件都相当于一个DOS的外部命令,把它所在的目录放到DOS搜索路径(path)中,即可在任意位置运行。
批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。
二、创建批处理文件
批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序。
一般情况下,每条命令占据一行。当然也可以将多条命令用特定符号(如:、、
、
等)分隔后写入同一行中,还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出。
三、常用DOS命令
1、文件夹管理:
cd显示当前目录名或改变当前目录。
cd#显示当前目录
cd/dd:sdk#可以同时更改盘符和目录
md创建目录。
rd删除一个目录。
rdabc#删除当前目录里的abc子目录,要求为空目录
rd/s/qd:temp#删除d:temp文件夹及其子文件夹和文件,/q安静模式
dir显示目录中的文件和子目录列表。
tree以图形显示驱动器或路径的文件夹结构。
treed:#显示D盘的文件目录结构
path为可执行文件显示或设置一个搜索路径。
xcopy复制文件和目录树。
2、文件管理:
type显示文本文件的内容。
copy将一份或多份文件复制到另一个位置。
Sample:
copyc:test.txtd:test.bak复制c:test.txt文件到d:,并重命名为test.bak
copycontest.txt从屏幕上等待输入,按Ctrl+Z结束输入,输入内容存为test.txt文件,con代表屏幕,prn代表打印机,nul代表空设备
copy1.txt+2.txt3.txt合并1.txt和2.txt的内容,保存为3.txt文件,如果不指定3.txt,则保存到1.txt
copytest.txt+复制文件到自己,实际上是修改了文件日期
del删除一个或数个文件。
Sample:
deld:test.txt#删除指定文件,不能是隐藏、系统、只读文件
del/q/a/fd:temp*.*#删除d:temp文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del/q/a/f/sd:temp*.*#删除d:temp及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
move移动文件并重命名文件和目录。(WindowsXPHomeEdition中没有)
ren重命名文件。
replace替换文件。
attrib显示或更改文件属性。
find搜索字符串。
Sample:
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的行的行数
fc比较两个文件或两个文件集并显示它们之间的不同
3、网络命令:
ping进行网络连接测试、名称解析
ftp文件传输
net网络命令集及用户管理
Sample:
netview..10.8
netshare查看你机器的共享资源
netshare共享资源名称$/d手工删除共享,注意$后有空格
netsharemymovie=e:\downloads\movie/users:3mymovie共享成功。同时限制链接用户数为3人
telnet远程登陆
ipconfig显示、修改TCP/IP设置
msg给用户发送消息
arp显示、修改局域网的IP地址-物理地址映射列表
4、系统管理:
title新标题#可以看到cmd窗口的标题栏变了
ver#显示系统版本
vol#显示卷标
label#显示卷标,同时提示输入新卷标
Sample:
labelc:system#设置C盘的卷标为system
date#显示当前日期,并提示输入新日期,按"回车"略过输入
date/t#只显示当前日期,不提示输入新日期
time#显示当前时间,并提示输入新时间,按"回车"略过输入
time/t#只显示当前时间,不提示输入新时间
morec:test.txt#逐屏显示c:test.txt的文件内容
at安排在特定日期和时间运行命令和程序
cls清屏
shutdown立即或定时关机或重启
tskill结束进程
taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
tasklist显示进程列表(WindowsXPHomeEdition中没有)
sc系统服务设置与控制
reg注册表控制台工具
powercfg控制系统上的电源设置
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find/?
四、批处理符号简介
回显屏蔽
重定向1与,清除文件中原有的内容后再写入,追加内容到文件末尾,而不会清除原有的内容,主要将本来显示在屏幕上的内容输出到指定文件中,指定文件如果不存在,则自动生成该文件。
typec:test.txtprn屏幕上不显示文件内容,转向输出到打印机
echohelloworldcon在屏幕上显示helloworld,实际上所有输出都是默认con的
copyc:test.txtf:nul拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
copyc:test.txtf:nul2nul#不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
echo^^W^^Wc:test.txt#生成的文件内容为^WW,^和是控制命令,要把它们输出到文件,必须在前面加个^符号
重定向2,#从文件中获得输入信息,而不是从屏幕上,一般用于datetimelabel等需要等待输入的命令。
Sample:
echooff
echo-05-01temp.txt
datetemp.txt
deltemp.txt
这样就可以不等待输入直接修改当前日期
管道符号
Sample:
dir*.*/s/a
find/c".exe"#管道命令表示先执行dir命令,对其输出的结果执行后面的find命令,该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
typec:test.txt
more#这个和morec:test.txt的效果是一样的
转义符^
逻辑命令符包括:、、
顺序执行多条命令,而不管命令是否执行成功
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
Sample:
find"ok"c:test.txtecho成功#如果找到了"ok"字样,就显示"成功",找不到就不显示
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
Sample:
find"ok"c:test.txt
echo不成功#如果找不到"ok"字样,就显示"不成功",找到了就不显示
五、系统参数
1、系统参数
%SystemRoot%===C:\WINDOWS(%windir%同样)
%ProgramFiles%===C:\ProgramFiles
%USERPROFILE%===C:\DocumentsandSettings\Administrator(子目录有“桌面”,“开始菜单”,“收藏夹”等)
%APPDATA%===C:\DocumentsandSettings\Administrator\ApplicationData
%TEMP%===C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp(%TEM%同样)
%APPDATA%===C:\DocumentsandSettings\Administrator\ApplicationData
%OS%===Windows_NT(系统)
%Path%===%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem(原本的设置)
%HOMEDRIVE%===C:(系统盘)
%HOMEPATH%===\DocumentsandSettings\Administrator
2、传递参数给批处理文件
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。
变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示,%*从第一个参数开始的所有参数
Sample:
calltest2.bat"hello""haha"(执行同目录下的“test2.bat”文件,并输入两个参数)
在“test2.bat”文件里写:
echo%1(打印:"hello")
echo%2(打印:"haha")
echo%0(打印:test2.bat)
echo%19(打印:"hello"9)
六、WindowsBatch常用命令
1、Echo
语法:echo[{on
off}][message]
ECHO[ON
OFF]打开回显或关闭回显功能
ECHO[message]显示信息。
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用^)结合来实现输入一些命令到特定格式的文件中。
echooff#从下一行开始关闭回显
echooff#从本行开始关闭回显。一般批处理第一行都是这个
echoon#从下一行开始打开回显
echo#显示当前是echooff状态还是echoon状态
echo.#输出一个”回车换行”,空白行
echo%errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码
默认值为0,一般命令执行出错会设errorlevel为1
2、
命令表示不显示
后面的命令,与echooff相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。3、Pause命令
会暂停批处理的执行并在屏幕上显示Pressanykeytocontinue...的提示,等待用户按任意键后继续
4、Rem命令
语法:RemMessage..(小技巧:用::代替rem)
注释命令,在C语言中相当与/*...*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和自己日后修改。
5、Goto命令
语法:gotolabel(label是参数,指定所要转向的批处理程序中的行。)
指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。label标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号“:”来表示这个字母是标签。
goto命令就是根据这个冒号来寻找下一步跳到到那里。经常与if配合使用,根据不同的条件来执行不同的命令组。
Sample:
echooff
:begin
copya:*.*d:\back
echoPleaseputanewdiskintodriverA
pause
gotobegin
6、If命令
if表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:
(1)、IF
语法:if[not]"参数"=="字符串"待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
(2)、ifexist
语法:if[not]exist[路径\]文件名待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
(3)、iferrorlevelnumber
语法:if[not]errorlevel数字待执行的命令
如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。(返回值必须按照从大到小的顺序排列)
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),称为错误码errorlevel或称返回码。
常见的返回码为0、1。通过iferrorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。
Sample:
echooff
XCOPYF:\test.batD:\
IFERRORLEVEL1(ECHO文件拷贝失败
)ElseIFERRORLEVEL0ECHO成功拷贝文件
pause
(4)、else
语法:if条件(成立时执行的命令)else(不成立时执行的命令)
如果是多个条件,建议适当使用括号把各条件包起来,以免出错。注:如果else的语句需要换行,if执行的行尾需用“^”连接,并且if执行的动作需用(括起来),否则报错
(5)、比较运算符:
EQU-等于(一般使用双等号)
NEQ-不等于(没有“!=”,改用“ifnot1==1”的写法)
LSS-小于
LEQ-小于或等于
GTR-大于
GEQ-大于或等于
7、Start命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
8、Call命令
语法:call[[Drive:][Path]FileName[BatchParameters]][:label[arguments]]
参数:[Drive:][Path]FileName指定要调用的批处理程序的位置和名称。filename参数必须具有.bat或.cmd扩展名。
调用另一个批处理程序,并且不终止父批处理程序。如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。
call命令接受用作调用目标的标签。如果在脚本或批处理文件外使用Call,它将不会在命令行起作用。
注:可以调用自身(死循环、递归)
9、Choice命令
choice使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,
然后配合iferrorlevel选择运行不同的命令。
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice/?查看用法。
choice使用此命令可以让用户输入一个字符,从而运行不同的命令。
使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为…
10、For命令
for命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
(1)、for{%variable
%%variable}in(set)do