批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。
那么,批处理文件有什么特点吗?
首先批处理文件是一个文本文件,这个文件的每一行都是一条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 |
批处理的作用:简单的说,批处理的作用就是自动的连续执行多条命令。
下面,我将以编写一个简单的CTFMON修复批处理文件来讲解一下。
㈠,首先,我们要对基本的命令有一定的理解。如果没有一定的相关知识恐怕不容易看懂和理解批处理文件,也就更谈不上自己动手编写了。其次,我们要对CTFMON出现的常见的问题,有一定的了解,否则,将会无从下手。
CTFMON简单修复的批处理文件下载地址:
http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=3522651
批处理示例01:
@echo off title 本程序仅用于 Windows XP Pro SP2 输入法的修复寒夜孤星【初学者】 color 2f echo. echo. date /t echo. echo. echo ************************************************************* echo * 本程序仅用于 Windows XP Pro SP2 输入法的修复 * echo * 寒夜孤星【初学者】 * echo ************************************************************* echo. echo. pause |
效果:
以上是这个批处理文件的第一部分,也是本节的重点部分。
1,第一行的“@echo off”是做什么的呢?
简单的说,echo off,表示在此语句后所有运行的命令都不显示命令行本身。我们在批处理中将这一行去掉,对比一下显示,很快就会他们之间的效果区别。是的,这就是echo off的作用。有时候,我不需要了解太多,只要知道,使用这个命令以后,就会有这样的效果就可以了。
这里还有一个问题,虽然使用了echo off,不显示以后的命令行本身,但还显示echo off自己,那么怎么不使用echo off显示出来呢?这就需要用到在命令之前包含 at 符号 (@),如所示:@ echo off
@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。所以,当我们使用@echo off以后,就会不显示包括echo在内的所有命令行本身,同时,这样也有助于运行后的批处理文件界面美观整洁。
下面,对echo 进行详细的介绍:
打开或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法
echo [{on|off}] [message]
参数
- {on | off
- 指定是否打开命令回显功能。
- message
- 指定要在屏幕上显示的文本。
- /?
- 在命令提示符显示帮助。
注释
- 当回显关闭时可以使用 echo message 命令。要显示几行长的消息而不显示其他命令,可以在批处理程序的 echo off 命令后包含几个 echo message 命令。
- 如果使用 echo off,屏幕上就不会出现命令提示符。要显示命令提示符,请键入 echo on。
- 要避免回显某行,请在批处理程序中的命令前面插入 at 符号 (@)。
- 要在屏幕上回显空白行,请键入: echo
- 当使用 echo 命令时,要显示管道 (|) 或重定向字符(< 或 >),请在管道 (|) 或重定向字符(例如,^>、^< 或 ^|)的前面使用脱字符 (^)。如果需要使用脱字符 (^),请键入两个脱字符 (^^)。
范例
以下范例显示的批处理程序包含前后各有一个空行的四行消息:
批处理示例02:
echo off echo. echo ************************************************************* echo * 本程序仅用于 Windows XP Pro SP2 输入法的修复 * echo * 寒夜孤星【初学者】 * echo ************************************************************* echo. |
在相同命令行上可以使用 if 和 echo 命令,如下所示:例如:
if not exist %systemroot%\system32\CTFMON.EXE echo CTFMON文件不存在.
到这里,我们明白了echo的几种常见的固定用法:
echo off 关闭回显,即不显示以后的命令行本身 echo. 空行
echo 要显示的内容 显示某个内容
echo on 打开回显,这个命令需要在使用了echo off才能使用。有关echo on的详细使用示例,将在以后的章节中介绍。
2,第二行中的“title 本程序仅用于……”是做什么的呢?
title,在实际使用中,是一个很简单的命令,为命令提示符窗口创建标题。其语法也很简单,就是在title 后面写要显示提示符窗口标题。
3,第三行中的“color 2f”是做什么的呢?
颜色 color
对于当前会话,更改命令提示窗口的前景和背景色。如果在不含参数的情况下使用,则 color 会将命令提示窗口的前景和背景色恢复成默认颜色。
语法
color [fb]
参数
- fb
- 设置前景 f 和背景 g 颜色。下表列出了可以用作 f 和 g 的值的十六进制数字。
-
值 |
颜色 |
0 |
黑色 |
1 |
蓝色 |
2 |
绿色 |
3 |
湖蓝色 |
4 |
红色 |
5 |
紫色 |
6 |
黄色 |
7 |
白色 |
8 |
灰色 |
9 |
浅蓝色 |
A |
浅绿色 |
B |
浅水绿 |
C |
浅红色 |
D |
浅紫色 |
E |
浅黄色 |
F |
浅白色 |
- /?
- 在命令提示符显示帮助。
注释
- 要设置默认的命令提示窗口颜色,请单击命令提示窗口的左上角,单击“默认”,单击“颜色”选项卡,然后单击要用于“屏幕文字”和“屏幕背景”的颜色。
- 对于当前会话,可以使用 cmd /t:fb 来更改命令提示窗口的颜色。
- 如果前景和背景色相同,color 命令会将 ERRORLEVEL 设置为 1。
范例
要将命令提示窗口的前景色设为亮白色,将其背景色设为绿色,请键入:
color 2f
所以,通过以上的表格,我们可以很容易明白,color 2f定义了这个批处理文件运行时窗口的背景为绿色,文字为亮白色。
4,第六行中的“date /t”是做什么的呢?
Date
显示当前系统日期设置。如果在不含参数的情况下使用,则 date 将显示当前系统日期设置并提示您键入新日期。
语法
date [mm-dd-yy] [/t]
参数
- mm-dd-yy
- 设置指定日期,此处 mm 指月,dd 指天,yy 指年。
- /t
- 显示当前日期,但不提示您键入新日期。
- /?
- 在命令提示符显示帮助。
注释
- 必须用句点 (.)、连字符 (-) 或斜线标记 (/) 将 mm、dd 以及 yy 分隔。
- mm 的有效值范围是从 1 到12。
- dd 有效值范围是从 1 到 31。
- yy 的有效值范围是从 80 到 99 或从 1980 到 2099。
- 不论一个月有 28 天、29 天、30 天还是 31 天,Windows XP 都能自动更改月份和年份。
范例
要将日期更改成 2000 年 8 月 3 日,请键入下述命令之一:
08.03.00
08-03-00
08/03/00
要显示当前系统日期,请键入:
date /t
所以,对于一般的批处理文件,我们只使用date /t来显示当前的系统时间。
5,第十五行中的“pause”是做什么的呢?
pause,暂停批处理程序的处理并显示消息,提示用户按任意键继续。
语法
pause
参数
- /?
- 在命令提示符显示帮助。
注释
- 运行 prompt 命令时,将显示下面的消息:
(英文版) Press any key to continue . . . . .
(中文版)请按任意键继续 . . . .
- 如果按 CTRL+C 停止批处理程序,则将显示下面的消息:
(英文版)Terminate batch job (Y/N)?
(中文版)终止批处理操作吗 (Y/N)?
按“Y”(代表“是”)响应这一消息,批处理程序将结束,控制返回到操作系统。因此,可以在不需要处理的批处理文件分段前插入 pause 命令。pause 暂停批处理程序的处理,您可以按 CTRL+C,然后键入 Y 停止批处理程序。
范例
要创建批处理程序,该批处理程序可提示用户更改某个驱动器中的磁盘,请键入:
批处理示例03:
@echo off :begin copy a:*.* echo Please put a new disk into drive A pause goto begin |
在此范例中,驱动器 A 中磁盘上的所有文件均复制到当前的目录中。显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。这种特殊的批程序在死循环中运行。goto BEGIN 命令将命令解释程序发送到批处理文件的开始标签。要停止该批处理程序,按下 CTRL+C 键然后按 Y 键。
以上是微软给出的范例,这个是pause的一个主要用途。在我们初学批处理文件的过程中,他还有一个重要的作用,我们可以在批处理中加入多个pause,在每次挂起程序后,方便我们观察每个pause前的程序运行状况。例如:
批处理示例04:
@echo off copy C:\TDDOWNLOAD\1.txt D:\TDDOWNLOAD
rem 复制文件夹C:\TDDOWNLOAD中的1.txt到文件夹D:\TDDOWNLOAD里
pause
copy C:\WINDOWS\2.txt
rem 复制文件夹C:\WINDOWS中的2.txt到本批处理文件同一文件夹下
pause |
这样,在第一次暂停时,我们可以查看“复制文件夹C:\TDDOWNLOAD中的1.txt到文件夹D:\TDDOWNLOAD里”的操作是否成功。在第二次暂停时,我们可以再查看“复制文件夹C:\WINDOWS中的2.txt到本批处理文件同一文件夹下”是否成功。
5,“copy”是做什么的呢?
在上一个范例中,我们看到了一个新的命令copy。那么,copy是做什么的呢?
copy
将一个或多个文件从一个位置复制到其他位置。
语法 copy [/d] [/v] [/n] [{/y|/-y}] [/z] [{/a|/b}] Source [{/a|/b}] [+ Source [{/a|/b}] [+ ...]][Destination [{/a|/b}]]
参数 /d 允许将复制的加密文件在目标处作为解密文件保存。 /v 验证是否正确写入新文件。 /n 在复制名字超过八个字符,或者文件扩展名超过三个字符的文件时使用短文件名(如果有的话)。 /y 禁止提示您确认要覆盖现存的目标文件。 /-y 提示您确认要覆盖现存的目标文件。 /z 在重启模式中复制网络文件。 /a 表明 ASCII 文本文件。 /b 表明二进制文件。 Source 必需指定要复制的文件或文件集的所在位置。source 可以由驱动器号和冒号、文件夹名、文件名或这几者的组合所组成。 Destination 必需指定要将文件或文件集复制到的位置。Destination 可以由驱动器号和冒号、文件夹名、文件名及这几者的组合所组成。 /? 在命令提示符显示帮助。 注释 可以复制那些使用文件结束字符 (CTRL+Z) 以表明文件结束的 ASCII 文本文件。 使用 /a 当在命令行的文件列表之前有 /a 时,它适用于所有已列出的文件,直到 copy 遇到 /b。在这种情况下,/b 应用于文件前面的 /b。
当 /a 在命令行上紧跟在文件列表之后时,它适用于所有已列出的文件,直到 copy 遇到 /b。在这种情况下,/b 应用于文件前面的 /b。
/a 参数的作用取决于它在命令行字符串中的位置。当 /a 紧随 Source 之后时,copy 会将文件当作 ASCII(文本)文件,并复制第一个文件结束符前的数据。
当 /a 紧随 Destination 之后时,copy 会添加文件结束符作为文件的最后一个字符。
使用 /b /b 指定命令解释器读取目录中由文件大小指定的字节数。/b 是 copy 的默认值,除非 copy 用于合并文件。
当 /b 在命令行上位于文件列表之前时,它适用于所有已列出的文件,直到 copy 遇到 /a。在这种情况下,/a 应用于文件前面的 /a。
当 /b 在命令行上位于文件列表之后时,它适用于所有已列出的文件,直到 copy 遇到 /a。在这种情况下,/a 应用于文件前面的 /a。
/b 的作用取决于它在命令行字符串中的位置。当 /b 紧随 Source 之后时,copy 复制包含任何文件结束符的整个文件。
当 /b 紧随 Destination 之后时,copy 不会添加文件结束符。
使用 /v 如果写入操作不能校验,则会出现错误消息。尽管使用 copy 很少发生记录错误,但是仍可以使用 /v 来确保重要的数据已正确记录。因为要检查驱动器上记录的每一个扇区,所以该 /v 命令行选项也会使 copy 命令的运行速度减慢。
使用 /y 和 /-y 如果在 COPYCMD 环境变量中预先设置了 /y,可以通过在命令行使用 /-y 来替换该设置。默认情况下,在替换该设置时会提示您,除非该 copy 命令在批处理脚本中执行。
附属文件 要附加文件,请为 Destination 指定单个文件,但要为 Source 指定多个文件(使用通配符或 文件 1+文件 2+文件 3 的格式)。
使用 /z 如果在复制阶段连接丢失(例如,如果服务器脱机切断了连接),copy /z 将在重新建立连接后继续复制。/z 同时会显示每个文件已完成的复制操作的百分比。
复制到设备以及从设备复制 可以用设备名替换一次或多次出现的 source 或 destination。
在复制到设备时使用或省略 /b 当 destination 是设备时(例如,Com1 或 Lpt1),/b 将以二进制模式将数据复制到该设备。在二进制模式下,copy /b 会将所有字符(包括特殊字符,例如, CTRL+C、CTRL+S、CTRL+Z 以及换行符等)作为数据复制到设备。但是,如果省略了 /b,则将以 ASCII 模式将数据复制到设备。在 ASCII 模式下,特殊字符可能导致 Windows XP 在复制过程中合并文件。有关详细信息,请参阅“合并文件”。
使用默认目标文件 如果不指定目标文件,将使用与源文件相同的名称、创建日期、创建时间来创建副本,并将新副本置于当前驱动器的当前目录中。如果源文件位于当前驱动器的当前目录中,而您没有为目标文件指定其他驱动器或目录,则 copy 命令将终止并显示下列错误消息:
File cannot be copied onto itself
0 File(s) copied
合并文件 如果指定了使用加号 (+) 分隔的多个 source,copy 会将这些文件合并在单个文件之中。如果在 source 中使用了通配符(* 或 ?),但在 destination 中指定了单个文件名,则 copy 会将所有与 source 中的文件名匹配的文件合并,并使用在 destination 中指定的文件名来创建单个文件。除非使用了 /b 命令行选项,否则在任一种情形中,copy 都会假定合并的文件是 ASCII 文件。
复制零长度文件 Copy 不会复制 0 字节长度的文件。使用 xcopy 复制这些文件。
更改文件的时间和日期 如果要将当前的时间和日期指派给文件而不修改文件,请使用以下语法:
copy /b Source+,,
逗号表明省略了 Destination 参数。
在子目录中复制文件 要复制目录中的所有的文件和子目录,应该使用 xcopy 命令。有关 xcopy 的详细信息,请参阅“相关主题”。
故障恢复控制台提供了带有不同参数的 copy 命令。 范例 要将文件 Memo.doc 复制到当前目录中的 Letter.doc,并确保在复制的文件的末尾为文件结束符,请键入:
copy memo.doc letter.doc /a
要将文件 Robin.typ 从当前驱动器的当前目录复制到位于驱动器 C 上的现有目录 Birds 中,请键入:
copy robin.typ c:\birds
如果 Birds 目录不存在,Robin.typ 文件将被复制到驱动器 C 的磁盘根目录下名为 Birds 的文件中。
要将几个文件复制进一个文件,则需列出几个 Source 文件,并且文件名之间用加号 (+) 隔开,同时指定要包含合并结果文件的 Destination 文件。例如,要将位于当前驱动器的当前目录中的 Mar89.rpt、Apr89.rpt 以及 May89.rpt 合并,并将它们放在当前驱动器的当前目录下名为 Report 的文件中,请键入:
copy mar89.rpt + apr89.rpt + may89.rpt report
合并文件时,copy 会使用当前日期和时间来标记目标文件。如果省略 Destination,则文件被合并并且会使用首个指定的文件的名称存储。例如,要将所有的四个文件合并进 Report,而且已有名为 Report 的文件,请键入:
copy report + mar89.rpt + apr89.rpt + may89.rpt
还可通过使用通配符(* 或 ?)来将几个文件合并进一个文件。例如,在当前驱动器的当前目录中,要将所有具有 .exe 扩展名的文件合并进名为 Combin.doc 的文件中,请键入:
copy *.txt combin.doc
如果要使用通配符将几个二进制文件合并进一个文件,请添加 /b 命令行选项。这可防止 Windows XP 将 CTRL+Z 当作文件结束符处理。例如,键入:
copy /b *.exe combin.exe
警告
如果合并二进制文件,结果文件可能因为内部格式而无法使用。 在下例中,copy 命令将每个带有 .txt 扩展名的文件和它对应的 .ref 文件合并起来。结果是文件名相同但扩展名为 .doc 的文件。copy 将 File1.txt 与 File1.ref 合并形成 File1.doc,然后 copy 将 File2.txt 与 File2.ref 合并形成 File2.doc,如此等等。例如,键入:
copy *.txt + *.ref *.doc
要合并所有具有 .txt 扩展名的文件,然后合并所有具有 .ref 扩展名的文件,并将合并结果置于 Combin.doc 文件中,请键入:
copy *.txt + *.ref combin.doc |
所以,例如:
copy C:\TDDOWNLOAD\1.txt D:\TDDOWNLOAD
复制文件夹C:\TDDOWNLOAD中的1.txt到文件夹D:\TDDOWNLOAD里
copy C:\WINDOWS\2.txt
复制文件夹C:\WINDOWS中的2.txt到本批处理文件同一文件夹下
6,“rem”是做什么的呢?
在上一个范例中,我们看到了另外一个新的命令rem。那么,rem是做什么的呢?
Rem
使您可以在批处理文件或配置文件中加入注释。
语法
rem [comment]
参数
- comment
- 指定要作为注释的任何字符串。
- /?
- 在命令提示符显示帮助。
注释
- 使用 echo 命令显示注释
rem 命令不在屏幕上显示注释。必须在批处理或 Config.nt 文件中使用 echo on 命令才能在屏幕上显示注释。
- 对批处理文件注释的限制
在批处理文件注释中不能使用重定向字符“(”或“)”或管道 (|)。
- 使用 rem 增加垂直间距。
尽管您可以使用没有注释的 rem 为批处理文件增加垂直间距,但也可以使用空行来增加间距。在处理批处理程序时会忽略空行。
范例
批处理示例05:
@echo off copy C:\TDDOWNLOAD\1.txt D:\TDDOWNLOAD
rem 复制文件夹C:\TDDOWNLOAD中的1.txt到文件夹D:\TDDOWNLOAD里
pause
copy C:\WINDOWS\2.txt
:: 复制文件夹C:\WINDOWS中的2.txt到本批处理文件同一文件夹下
pause |
通过实际操作的对比,我们会理解:
①,rem后的内容不会被在执行过程显示,而echo后的则会。
②,rem是用来增加批处理文件文本中的垂直间隔,而echo.是增加批处理文件执行过程中显示时的垂直间隔的。
③,rem最大也是最主要的作用就是方便编辑批处理文件时,自己或别人通过rem后的内容来理解命令或程序的作用的。
④,小技巧:用::代替rem。
7,关于批处理文件中所使用命令的学习方法。
本章节中介绍了,一些命令,再以后的章节中会介绍更多的命令。那么大家如何自己学写这些命令呢?实际上,windows系统为我们提供很好的平台。
第一种方法:依次打开“开始菜单”—“帮助和支持”,在帮助和支持中心,我们可以在里面搜索很多关于计算机的知识,也包括批处理文件所使用的命令,如下图:
第二种方法:依次打开“开始菜单”—“运行”,在运行里输入CMD。例如,我们想知道cls命令是做什么的,只需要输入cls /?,然后回车就可以了,显示“清除屏幕”,一个很简单又实用的命令。再比如,我们想知道copy的详细语法规则和说明,只需要再输入copy /?,然后回车,就一切ok了。如下图:
8,“cls”是做什么的呢?
在上一示例中,我们在CMD窗口中可以进行各种命令的输入,但如果在不需要的时候想清理掉这些内容呢?其实很简单,输入cls,然后回车ok了!这一命令也可以在批处理文件中使用,但最好和pause等命令配合使用,否则执行起来的效果不怎么好……
cls
清除命令提示符窗口。
语法
cls
参数
- /?
- 在命令提示符显示帮助。
范例
要清除显示在命令提示符窗口中的所有信息,并返回空窗口,请键入:
cls
|