批处理文件的总结

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

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

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

第四,在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 

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

AUTOEXEC.BAT为DOS系统的自动运行批处理文件,由COMMAND.COM启动时解释执行; 

2.批处理文件常用的管道命令
===========================
1、| 
===========================
|命令的作用,就是让前一命令的输出当做后一命令的输入。
help | more 等价于
help > a.txt 
more a.txt 
del a.txt

===========================
2、>,>> 
===========================
这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容。

===========================
3、<,>&,<& 
===========================
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。 
>&,将一个句柄的输出写入到另一个句柄的输入中。 
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。 

组合命令:组合命令前后都必须都有其他命令

===========================
1、&
===========================
连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败


===========================
2、&&
===========================
它前后两个命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。


===========================
3、||
===========================
这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。
@echo off 
dir s*.exe || echo Didn’t exist file s*.exe & pause & exit


3.批处理文件常用命令集
============================
1.Echo 命令
============================
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法
echo [{on|off}] [message]
Sample: echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用>,>>,^)结合来实现输入一些命令到特定格式的文件中echo nbtstat -A 192.168.0.1 > a.bat 
echo nbtstat -A 192.168.0.2 >> a.bat
---------------
这里>的意思,是把前面命令得到的东西放到后面所给的地方,>>的作用,和>的相同,区别是把结果追加到前一行得出的结果的后面,具体的说是下一行,而前面一行命令得出的结果将保留,这样可以使这个a.txt文件越来越大(想到如何搞破坏了??)。
ping sz.tencent.com > a.txt 
ping sz1.tencent.com >> a.txt
---------------


============================
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命令就是根据这个':'来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

goto命令的另一种用法一:提前结束程序。在程序中间使用goto命令跳转到某一标签,而这一标签的内容却定义为退出


============================
4.Rem 命令
============================
注释命令。(也可以使用::)
Rem Message
Sample:@Rem Here is the description.


============================
5.Pause 命令
============================
运行 Pause 命令时,将显示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:*.* d: ack
echo Please put a new disk into driver A
pause
goto begin
在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d: ack中。显示的注释提示您将另一张磁盘放入驱动器 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: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,文件结束。


==============================
9.If 命令
==============================
if 表示将判断是否符合规定的条件,从而决定执行不同的命令(可以和else配对使用)。有三种格式:

(1)、if "参数" == "字符串" 待执行的命令(""不是必须的)
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
如if "%1"=="a" format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms

(2)、if (not) exist 文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如if exist config.sys edit config.sys

(3)、if errorlevel / if not errorlevel 数字 待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1(0表示正确返回)。
以下就是几个常用命令的返回值及其代表的意义: 

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 用户


===============================
10.for 命令
===============================
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
语法
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令

参数:FOR有4个参数 /d   /l   /r   /f   他们的作用我在下面用例子解释
%%variable:这个变量名可以是小写a-z或者大写A-Z,他们区分大小写。FOR会把每个读取到的值给它。
IN:命令的格式,照写
(相关文件或命令) :指定一个或一组文件。可以使用通配符。FOR要把什么东西读取然后赋值给变量
do:命令的格式,照写
执行的命令:对每个变量的值要执行什么操作就写在这


参数含义:
/d 遍历整个目录树的所有目录
如果 Set 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。主要用于目录搜索,对文件不进行任何操作。

for /d %%i in (*) do @echo %%i --------  当前目录下的全部目录名字打印出来
for /d %%i in (???) do @echo %%i ------  当前目录下目录名字是3个字的目录名字打出来

-----------------------------------------------
/R 递归 遍历整个目录树的所有目录和文件
FOR /R [[drive:]path] %%variable IN (set) DO command
如果在 /R 后没有指定目录,则认为是当前目录。
如果 Set 只是一个句点 (.),则只枚举目录树。
如果 Set 是(*),则枚举所有文件,不枚举目录。

for /r c:/ %%i in (*.exe) do @echo %%i ------- 列举C盘根目录,和每个目录的子目录下面全部的EXE文件

------------------------------------------------
/L 迭代数值范围
for /L %% Variable in (Start#,Step#,End#) do Command
使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。

for /l %%i in (1,1,5) do @echo %%i --------- 打印从1 2 3 4 5

------------------------------------------------
/f 迭代及文件解析
for /F "ParsingKeywords" %%Variable in (FileNameSet) do Command
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种 ParsingKeywords(令牌) 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。

"ParsingKeywords" 表示参数:
eol=c                --------- 指一个行注释字符的结尾(就一个),字符型。
skip=n              --------- 指在文件开始时忽略的行数,整数。
delims=xxx        --------- 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n  --------- 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq           --------- 指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。(系统自动加载)

文件内容作为循环范围:
for /f "skip=5 tokens=5" %%a in (todel.txt) do @if exist %%a DEL %%a
skip=5表示跳过前5行,tokens=5表示将每行的第5列作为循环值放入%%a,

命令操作结果作为循环范围:
FOR /F "delims==" %%i IN ('set') DO @echo %%i
目前的环境变量有哪些名字(我们只要名字,不要值)。SET命令的输出是“名字=值”的格式。delims==表示用=作为分隔符

for /f "tokens=3 delims=/ " %%a in ('date /t') do @echo %%a
date /t 打印当前时间 Fri 10/24/2008
for语句可以提出当前日期24。注意delims=/后面还有个空格,表示/和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项。

for /f "tokens=2,3,4 delims=/ " %%a in ('date /t') do @echo %%c-%%a-%%b
按照2008-10-24格式输出但前日期。当tokens后跟多个值时,将分别映射到%a, %b, %c等。实际上跟你指定的变量有关,如果你指定的是 %i, 它们就会用%i, %j, %k等

FOR /F "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i
读取在当前目录下名为test.txt文件中的内容,将每一行的内容赋值给变量%%i,忽略掉以;号开头的行,并且以空格做为分隔符号,打印每行以空格做分隔符号的第一列。

对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种方式来使用双引号,您还需要使用 usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值