bat脚本学习.docx
《bat脚本学习.docx》由会员分享,可在线阅读,更多相关《bat脚本学习.docx(46页珍藏版)》请在冰豆网上搜索。
bat脚本学习
★Bat脚本学习
2015-01-0514:
13 1652人阅读 评论(0) 收藏 举报
版权声明:
本文为博主原创文章,未经博主允许不得转载。
基础部分:
======================================================================
一、基础语法:
1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令。
可以使用任何文本文件编辑工具创建和修改。
2.批处理是一种简单的程序,可以用if和goto来控制流程,也可以使用for循环。
3.批处理的编程能力远不如C语言等编程语言,也十分不规范。
4.每个编写好的批处理文件都相当于一个DOS的外部命令,把它所在的目录放到DOS搜索路径(path)中,即可在任意位置运行。
5.C:
\AUTOEXEC.BAT是每次系统启动时都会自动运行的,可以将每次启动时都要运行的命令放入该文件中。
6.大小写不敏感(命令符忽略大小写)
7.批处理的文件扩展名为.bat或.cmd。
8.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe来运行该文件。
二、参数:
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
:
:
枚举当前的环境变量
setlocalenabledelayedexpansion
FOR/F"usebackqdelims=="%%iIN(`set`)DO@echo%%i!
%%i!
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)
三、批处理基本命令
0.help命令
/?
命令
语法:
命令/?
可显示此命令的帮助信息
Sample:
type/?
>>tmp.txt(把type命令的帮助信息写入到tmp.txt文件里)
Sample:
helptype(显示跟“type/?
”一样)
1.Echo命令
语法:
echo[{on|off}][message]
ECHO[ON|OFF]打开回显或关闭回显功能。
ECHO显示当前回显设置。
ECHO[message]显示信息。
echooff表示在此语句后所有运行的命令都不显示命令行本身;默认是on,on时会显示如:
C:
\文件夹路径>命令行。
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用>>>^)结合来实现输入一些命令到特定格式的文件中。
Sample:
echooff
Sample:
echohelloworld(显示出“helloworld”)
Sample:
echoWindowsRegistryEditorVersion5.00>c:
\setupreg.reg(此前还没有setupreg.reg这个文件)
Sample:
echo"SourcePath"="D:
\\Win2003\\">>c:
\setupreg.reg(追加内容进setupreg.reg这个文件)
2.@命令
表示不显示@后面的命令,(在入侵过程中自然不能让对方看到你使用的命令啦)
@与echooff相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
Sample:
@echooff(此语句常用于开头,表示不显示所有的命令行信息,包括此句)
Sample:
@echopleasewaitaminite...
Sample:
@formatX:
/q/u/autoset
(format这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。
)
3.Goto命令
语法:
gotolabel(label是参数,指定所要转向的批处理程序中的行。
)
指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。
label标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号“:
”来表示这个字母是标签。
goto命令就是根据这个冒号来寻找下一步跳到到那里。
经常与if配合使用,根据不同的条件来执行不同的命令组。
例题见“5.Pause命令”
4.Rem命令
语法:
RemMessage...
(小技巧:
用:
:
代替rem)
注释命令,在C语言中相当与/*...*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和自己日后修改。
Sample:
@RemHereisthedescription.
5.Pause命令
会暂停批处理的执行并在屏幕上显示Pressanykeytocontinue...的提示,等待用户按任意键后继续
Sample:
@echooff
:
begin
copya:
*.*d:
\back
echoPleaseputanewdiskintodriverA
pause
gotobegin
在这个例子中,驱动器A中磁盘上的所有文件均复制到d:
\back中。
显示的信息提示您将另一张磁盘放入驱动器A时,pause命令会使程序挂起,以便您更换磁盘,然后按任意键再次复制。
6.Call命令
语法:
call[[Drive:
][Path]FileName[BatchParameters]][:
label[arguments]]
参数:
[Drive:
][Path]FileName指定要调用的批处理程序的位置和名称。
filename参数必须具有.bat或.cmd扩展名。
调用另一个批处理程序,并且不终止父批处理程序。
如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。
call命令接受用作调用目标的标签。
如果在脚本或批处理文件外使用Call,它将不会在命令行起作用。
Sample:
call="%cd%\test2.bat"hahakkkaaa(调用指定目录下的test2.bat,且输入3个参数给他)
Sample:
calltest2.batarg1arg2(调用同目录下的test2.bat,且输入2个参数给他)
注:
可以调用自身(死循环、递归)
7.start命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
入侵常用参数:
MIN开始时窗口最小化
SEPARATE在分开的空间内开始16位Windows程序
HIGH在HIGH优先级类别开始应用程序
REALTIME在REALTIME优先级类别开始应用程序
WAIT启动应用程序并等候它结束
parameters这些为传送到命令/程序的参数
Sample:
start/MINtest2.batarg1arg2(调用同目录下的test2.bat,且输入2个参数给他,且本窗口最小化)
Sample:
e:
\"programfiles"\极品列车时刻表\jpskb.exe(文件路径名有空格时)
8.If命令
if表示将判断是否符合规定的条件,从而决定执行不同的命令。
有三种格式:
1)IF
语法:
if[not]"参数"=="字符串"待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。
(注意是两个等号)
Sample:
if"%1"=="a"formata:
Sample:
if{%1}=={}gotonoparms
2)ifexist
语法:
if[not]exist[路径\]文件名待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
Sample:
ifexistconfig.syseditconfig.sys(表示如果存在这文件,则编辑它,用很难看的系统编辑器)
Sample:
ifexistconfig.systypeconfig.sys(表示如果存在这文件,则显示它的内容)
3)iferrorlevelnumber
语法:
if[not]errorlevel<数字>待执行的命令
如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。
(返回值必须按照从大到小的顺序排列)
Sample:
@echooff
XCOPYF:
\test.batD:
\
IFERRORLEVEL1(ECHO文件拷贝失败
)ElseIFERRORLEVEL0ECHO成功拷贝文件
pause
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),称为错误码errorlevel或称返回码。
常见的返回码为0、1。
通过iferrorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。
4)else
语法:
if条件(成立时执行的命令)else(不成立时执行的命令)
如果是多个条件,建议适当使用括号把各条件包起来,以免出错。
Sample:
if1==0(echocomment1)elseif1==0(echocomment2)else(echocomment3)
注:
如果else的语句需要换行,if执行的行尾需用“^”连接,并且if执行的动作需用(括起来),否则报错
Sample:
if1==0(echocomment1)elseif1==0(echocomment2)^
else(echocomment3)
5)比较运算符:
EQU-等于(一般使用“==”)
NEQ-不等于(没有“!
=”,改用“ifnot1==1”的写法)
LSS-小于
LEQ-小于或等于
GTR-大于
GEQ-大于或等于
9.choice命令
choice使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,
然后配合iferrorlevel选择运行不同的命令。
注意:
choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice/?
查看用法。
choice使用此命令可以让用户输入一个字符,从而运行不同的命令。
使用时应该加/c:
参数,c:
后应写提示可输入的字符,之间无空格。
它的返回码为1234……
Sample:
choice/c:
dmedefrag,mem,end
将显示:
defrag,mem,end[D,M,E]?
Sample:
choice/c:
dmedefrag,mem,end
iferrorlevel3gotodefrag(应先判断数值最高的错误码)
iferrorlevel2gotomem
iferrotlevel1gotoend
10.for命令
for命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
1)for{%variable|%%variable}in(set)docommand[command-parameters]
%variable指定一个单一字母可替换的参数。
变量名称是区分大小写的,所以%i不同于%I
在批处理文件中使用FOR命令时,指定变量建议用%%variable而不要用%variable。
(set)指定一个或一组文件。
可以使用通配符。
command指定对每个文件执行的命令。
command-parameters为特定命令指定参数或命令行开关。
2)如果命令扩展名被启用,下列额外的FOR命令格式会受到支持:
a.FOR/D%variableIN(set)DOcommand[command-parameters]
如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配。
b.FOR/R[[drive:
]path]%variableIN(set)DOcommand[command-parameters]
检查以[drive:
]path为根的目录树,指向每个目录中的FOR语句。
如果在/R后没有指定目录,则使用当前目录。
如果集仅为一个单点(.)字符,则枚举该目录树。
c.FOR/L%variableIN(start,step,end)DOcommand[command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
如:
(1,1,5)将产生序列12345;而(5,-1,1)将产生序列(54321)。
d.有或者没有usebackq选项:
FOR/F["options"]%variableIN(file-set)DOcommand
FOR/F["options"]%variableIN("string")DOcommand
FOR/F["options"]%variableIN(command)DOcommand
参数"options"为:
eol=c-指一个行注释字符的结尾(就一个,如“;”)
skip=n-指在文件开始时忽略的行数。
delims=xxx-指分隔符集。
这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n-指每行的哪一个符号被传递到每个迭代的for本身。
这会导致额外变量名称的分配。
m-n格式为一个范围。
通过nth符号指定mth。
如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq-指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在filenameset中使用双引号扩起文件名称。
3)Sample:
1.如下命令行会显示当前目录下所有以bat或者txt为扩展名的文件名。
for%%cin(*.bat*.txt)do(echo%%c)
a.如下命令行会显示当前目录下所有包含有e或者i的目录名。
for/D%%ain(*e**i*)doecho%%a
b.如下命令行会显示E盘test目录下所有以bat或者txt为扩展名的文件名。
for/RE:
\test%%bin(*.txt*.bat)doecho%%b
for/r%%cin(*)do(echo%%c):
:
遍历当前目录下所有文件
c.如下命令行将产生序列12345
for/L%%cin(1,1,5)doecho%%c
d.以下两句,显示当前的年月日和时间
For/f"tokens=1-3delims=-/."%%jIn('Date/T')doecho%%j年%%k月%%l日
For/f"tokens=1,2delims=:
"%%jIn('TIME/T')doecho%%j时%%k分
e.把记事本中的内容每一行前面去掉8个字符
setlocalenabledelayedexpansion
for/f%%iin(zhidian.txt)do(
setatmp=%%i
setatmp=!
atmp:
~8!
if{!
atmp!
}=={}(echo.)elseecho!
atmp!
)
:
:
读取记事本里的内容(使用delims是为了把一行显示全,否则会以空格为分隔符)
for/f"delims="%%ain(zhidian.txt)doecho.%%a
4)continue和break
利用goto实现程序中常用的continue和break命令,其实非常简单
continue:
在for循环的最后一行写上一个标签,跳转到这位置即可
break:
在for循环的外面的下一句写上一个标签,跳转到这位置即可
Sample:
(伪代码)
for/F["options"]%variableIN(command)DO(
...docommand...
if...gotocontinue
if...gotobreak
...docommand...
:
continue
)
:
break
四、其它命令
1.ping命令
测试网络联接状况以及信息包发送和接收状况。
但是不能够测试端口。
语法:
pingIP地址或主机名[-t][-a][-ncount][-lsize]
参数含义:
-t不停地向目标主机发送数据;
-a以IP地址格式来显示目标主机的网络地址;
-ncount指定要Ping多少次,具体次数由count来指定;
-lsize指定发送到目标主机的数据包的大小。
Sample:
ping192.168.0.1-t(不停的测试192.168.0.1,按ctrl+c停止)
Sample:
for/L%%ain(0,1,255)doping192.168.0.%%a-n1>>tmp.txt(ping一下所有的局域网电脑)
2.telnet命令
测试端口使用telnetIP地址或主机名端口,使用tcp协议的
Sample:
telnet192.168.0.180(测试192.168.0.1的80端口)
3.color命令
设置背景及字体颜色
语法:
colorbf
b是指定背景色的十六进制数字;f指定前景颜色(即字体颜色)。
颜色值:
0:
黑色1:
蓝色2:
绿色3:
湖蓝4:
红色5:
紫色6:
黄色7:
白色
8:
灰色9:
淡蓝A:
淡绿B:
浅绿C:
淡红D:
淡紫E:
淡黄F:
亮白
如果没有给定任何参数,该命令会将颜色还原到CMD.EXE启动时的颜色。
如果两参数一样,视为无效输入。
只有一个参数时,设置字体。
4.random命令
产生随机数(正整数0~)
5.exit命令
结束程序。
即时是被调用的程序,结束后也不会返回原程序
6.shutdown命令
shutdown-s关机
10.所有内置命令的帮助信息
ver/?
cmd/?
set/?
rem/?
if/?
echo/?
goto/?
for/?
shift/?
call/?
其他需要的常用命令
type/?
find/?
findstr/?
copy/?
五、时间、字符串
1)分割字符串,以查看时间为例
%源字符串:
~起始值,截取长度%(起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;
截取长度如果是负数,表示截取到倒数第几个。
)
"%time%"显示如:
"11:
04:
23.03"(完整的时间"hh:
mm:
ss.tt")
"%time:
~0,5%"显示"hh:
mm"(即"11:
04"),其中0表示从右向左移位操作的个数,5表示从左向右移位操作的个数
"%time:
~0,8%"显示标准时间格式"hh:
mm:
ss"(即"11:
04:
23",前8个字符串)
"%time:
~3,-3%"显示"mm:
ss"(即从第4个开始,截去最后3个的字符串)
"%time:
~3%"显示"04:
23.03"(即去掉前4个字符串)
"%time:
~-3%"显示".tt"(即最后3个字符串)
上面的字串分割格式,也可以用于其它地方,如目录路径:
"%cd:
~0,10%"
2)替换字符串
seta="abcd1234"
echo%a%显示:
"abcd1234"
seta=%a:
1=kk%替换“1”为“kk”
echo%a%显示:
"abcdkk234"
3)字符串合并
由于没有直接的字符串合并函数,只能用笨方法了。
setstr1=%str1%%str2%(合并str1和str2)
4)计算字符串长度
没有现成的函数。
如下程序利用goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度。
settestStr=Thisisateststring
:
:
将testStr复制到str,str是个临时字符串
setstr=%testStr%
:
:
标签,用于goto跳转
:
next1
:
:
判