Windows 批处理脚本学习教程

Collected by Clove

第一章:前言

无意中发现了批处理的强悍作用是不容忽视的,而在几周之前我连其概念都不知道。批处理在某些情况下有着与编程类似的思想,有人说批处理是一种宏。从应用范围上来看,批处理的用途非常广泛。了解到了其实用性,加之我有C语言做基础,是以有了学习批处理的想法。可以说我对批处理的学习几乎是从零开始的,只是在工作之余在网上自行搜索浏览探索尝试的。如果您也对批处理有兴趣的话,不妨看看下文,共同学习一番。

[声明]:本文可以作为了解并熟悉批处理的参考,但并不保证文中所有的概念、理论、用法及操作的正确性或规范性。如果本文(系列)存在错误或纰漏,本人对此表示抱歉,并欢迎读者指正。

1.1 什么是批处理?

从内容上看,批处理文件包含了大量的基本DOS命令,是一种可执行文件。该文件运行时能按照其规则将其中的命令逐一执行。使用批处理文件进行的批量的命令处理的过程,称之为批处理。
批处理文件(Batch File,简称BAT文件)是一种在DOS下最常用的可执行文件。它具有灵活的操纵性,可适应各种复杂的计算机操作。所谓的批处理,就是按规定的顺序自动执行若干个指定的DOS命令或程序。即是把原来一个一个执行的命令汇总起来,成批的执行,而程序文件可以移植到其它电脑中运行,因此可以大大节省命令反复输入的繁琐。同时批处理文件还有一些编程的特点,可以通过扩展参数来灵活的控制程序的执行,所以在日常工作中非常实用。[1]

批处理文件的后缀名为.bat(Batch的缩写)。可以用绝大多数的文本编辑工具进行编辑。由于批处理文件的实质就是一个命令的集合,所以批处理文件的工作平台是由这些命令所工作的平台来决定,如今Microsoft环境下的批处理文件(.bat和.cmd文件)的平台,当然也就是Microsoft的DOS和Windows系统。[1]

1.2 了解与使用基本DOS命令

说到批处理,我们不得不先讨论一些基本的DOS命令。对于“命令”("Command")一词,实际上就体现了我们与计算机的交流过程。比如,您可以通过使用鼠标点击“开始”,选择关机来命令计算机执行关闭计算机的行动;您也可以通过只是简单地双击一下桌面上的《星际争霸》快捷方式来让计算机运行《星际争霸》这款经典的即时战略游戏。也许您认为这些命令就如同吃饭睡觉一样简单,这是因为图形化界面已经为我们把复杂难以理解的命令操作封装成人人都能非常容易上手的操作方式,使得我们只需要点点鼠标或是敲几下键盘就能轻而易举地完成。

而DOS命令,对于不少新接触计算机的朋友来说可能是一个高深而神秘的词。不过,如果您多少还懂点英语的话,这些问题可能就变得是很容易被理解的。假如我们打算把电脑D盘里的一个叫做"a.txt"的文本文件复制到E盘里,您也许能够提出使用Ctrl+C复制该文件,然后再在E盘中Ctrl+V将其粘贴到此处;或是建议按住Ctrl键然后直接拖动到E盘,又或是用右键拖动后再选择,等等。这些都是图形界面里的操作,如果我们想用DOS命令来实现这一操作该如何去做呢?copy D:\a.txt E:\a.txt 这句英文看起来更像是在尝试与电脑进行聊天。不过您必须得保证您的发言有着严格正确的格式,电脑才会按照您的意图去执行。以下为常用文件操作DOS命令:

dir    列文件名
cd    改变当前目录
ren    改变文件名
copy   拷贝文件
del    删除文件
md    建立子目录
rd    删除目录
deltree  删除目录树
format  格式化磁盘
edit   文本编辑
type   显示文件内容
mem    查看内存状况
以下是新增加的命令
help   显示帮助提示
cls    清屏
move   移动文件,改目录名
more   分屏显示
xcopy   拷贝目录和文件
[2]

仅仅是告诉您有哪些命令可以使用,此时您仍不会明白DOS命令的操作用法。我们不妨从例子中学习并理解。

可以在 开始->所有程序->附件->命令提示符 找到并打开MS-DOS命令提示符。或是按WIN键(键盘上有微软标示的那个按键)再按R键,然后输入 cmd 并按回车,也能打开命令提示符。无论您对这个黑色而单调的界面感到是多么的新奇、或是陌生、甚至是厌恶,此时您都不会再计较了,重要的是您得尝试一下所谓的DOS命令。如果您正在用Windows XP操作系统(XP自带的DOS5使用方便,便于理解,以下均以XP操作系统为例进行说明),您将可能看到有类似 C:\Documents and Settings\Administrator> 的这么一行文字。这说明,您此时的工作位置就在 C:\Documents and Settings\Administrator 里。当然 Administrator 也可能是别的词,这取决于您当前登录的用户名以及该用户所设定文件夹的名称。而使用 Windows9X 操作系统的命令提示符将会看到经典的 C:\WIDNOWS> 。

此时我们来尝试一下使用一些基本的DOS命令,
比如,键入 dir (不区分大小写)并按回车后,我们会得到当前文件夹下所有的子文件夹和文件的相关信息。输入 dir c:\windows ,可以查看指定的路径文件夹(这里假定我们指定的文件夹是C盘的WINDOWS文件夹)中的信息。在输入该命令后,只见刷地一下啥也没看清,N多文件或文件夹就已一闪而过,因为一个屏幕无法显示这么多的文件或文件夹。好在在DOS5中我们可以用鼠标滚轮向前滚动查看更多的内容。然而,早期的DOS版本并不具有保存多页信息的功能,我们不妨使用 dir 的一些参数(适当的参数加在相应的命令后面可以实现更多的扩展功能),比如 /p ,即输入 dir c:\windows /p 。这样就能在每显示一个屏幕的内容后暂停一下以便查看。

关于 dir 命令的用法和参数还有更多。除了 dir 以外,每一种命令的用法和参数都不少。看到这里您也许会觉得很沮丧,认为自己没有天赋、也没有工夫来死记硬背这些该死的命令。事实上我也有同感。命令的具体用法在帮助里、在网上都能轻而易举地找到。只要输入 dir /? 就能得到关于dir命令完整的使用介绍,而且是中文的。同理,任何命令后面跟上 /? 的参数,都能得到该命令的完整说明。当然,也可以在网上搜索"DOS命令"等关键字来查找具体的DOS用法(推荐一个洪恩在线)。我们所需要的只是知道执行什么操作时用什么命令就行了,即使是连命令的名称都记不得了也没关系,都是现学现用的嘛。

很多情况下,我们只需要记住一条命令 help ,就能掌握整个DOS命令。比如直接输入 help 可以得到命令的帮助信息。输入 help dir 就能得到命令 dir 的具体参数及其用法(等同与 dir /? )。不仅仅是DOS命令,很多带有命令提示的工具都有help提供帮助和提示,例如MATLAD中的命令行,又如BattleNet中的以斜杠 / 开头的命令等等。

下面以一段例子来介绍DOS命令的具体用法(灰色背景的文字为DOS命令,可以尝试在命令提示符中输入测试查看效果)。

d:
转到驱动器D盘下,此时我们能看到 D:\> 的提示符(前提是您的电脑硬盘必须至少划分出D盘)。如果看到的不是就再输入下一行命令。
cd\
这一条命令 cd 的作用是改变当前的工作目录,后面加上 \ 表示返回到该驱动器的最顶级目录。另外,一个句点 . 表示当前文件夹,两个连续的句点 .. 则表示上一级文件夹, cd.. 即目录向上一级。
md test
正如前文所说,命令 md 的作用是创建子目录,此时打开D盘看一看,是不是多了一个名叫test的文件夹(如果不是事先早已存在的话)。事实上该命令的完整写法为 md d:\test ,由于当前目录已经在D盘了,所以我们把具体的路径给简化了。
md "test my folder"
同理,在D盘创建一个名为test my folder的文件夹。加双引号的目的是告诉计算机我们要创建一个名字中含有空格的文件夹,而不是分别创建名字分别为test、my和folder的3个不同的文件夹。注:除了空格以外,在路径或文件名中含有 &()[]{}^=;!'+,`~ 特殊字符时也需要用双引号引用起来,以便机器能够正确地识别。
cd test
改变当前工作目录,此时不再是D盘了,而是在 D:\test 的目录下。
echo Hello world>a.txt
遇到了一个新命令 echo ,它可以将某某内容显示出来。只考虑 echo Hello world 就是把字符串 Hello world 显示出来而已。后面使用了符号 > 表示将这句 Hello world 写入到某文件中。结果为:在 D:\test 文件夹里多了一个叫 a.txt 的文件,其内容为 Hello world 。
copy a.txt "d:\test my folder"
这就是将当前文件夹里的那个 a.txt 文件复制到 D:\test my folder 文件夹中
copy a.txt "..\test my folder\b.txt"
还是复制 a.txt ,但这次的路径与上一条命令的写法不同。 .. 表示先向上一级,再挪到 test my folder 文件夹里。其实还是复制到 D:\test my folder 这个文件夹里了。这次复制过去的文件名也不一样,因为这次我们指定了要复制过去的目标文件名为 b.txt 。
copy a.txt "..\test my folder\c.bmp"
再次复制 a.txt 到同样的文件夹里。不过这次不光改文件的标题名了,连文件的后缀名也改了。打开 D:\test my folder 文件夹检查一下,是不是多了名字分别叫 a.txt b.txt c.bmp 的3个文件。
cd..
向上一级
cd "test my folder"
进入 D:\test my folder 文件夹
ren c.bmp d.bin
重新命名文件 c.bmp 为 d.bin 。完整地写法为 ren "d:\test my folder\c.bmp" d.bin 。
del *.txt
删除当前工作目录中所有文件后缀名为 .txt 的文件。 * 表示通配符。例如:a.* 表示所有文件标题为 a 的文件,不论后缀名。 *.* 则表示任何标题名和任何后缀名的文件,即所有文件。此时结果应为:该目录里的 a.txt b.txt 这两个文件已经不存在了,即使是在回收站里也找不到了。
cd..
向上一级
rd test "test my folder"
这一条命令是想同时移除 test 和 test my folder 这两个文件夹。不过结果并没有成功,因为它会提示:目录不是空的。test 文件夹中有 a.txt ,test my folder 文件夹中还有 d.bin ,因此文件夹删不掉。
rd test "test my folder" /s
如果加上 /s 这个参数后就能删除这两个文件夹以及其文件夹中所包含的所有内容了。注意:删除前请确认这些文件夹是否是您以前就有的文件夹,或者说里面是否存有任何有用文件,不要因为这个测试而丢掉了重要文件。

1.3 我们的第一个批处理

在阅读本文之前您可能还对此一无所知,而现在您却已经略知一二了。如果您还无法理解DOS命令的工作原理或方式,在继续阅读下文之前,强烈建议具体操作实践一下。

不过说了那么多,看起来似乎还没进入正题,您可能会不耐烦地说:目前批处理连个影子都没见到呢。如果我们只是简单地将上述例子中的命令集合起来,那么这就形成了一个批处理。做法是:先打开记事本,把下面这些您已经了如指掌(或者说只是略知一二)的命令复制进去。然后保存到某处(比如桌面),并命名为 MyFirstBatch.bat (文件标题可自拟,但后缀名必须是.bat)。

::::::::::::::::::::::::::::::::
md "d:\test" "d:\test my folder"
echo Hello world>"d:\test\a.txt"
copy "d:\test\a.txt" "d:\test my folder"
copy "d:\test\a.txt" "d:\test my folder\b.txt"
copy "d:\test\a.txt" "d:\test my folder\c.bmp"
ren "d:\test my folder\c.bmp" d.bin
::::::::::::::::::::::::::::::::

看到了吧!惊喜吧!疯狂吧!一个自己写的,或者说至少是自己已经能够完全理解的批处理文件 MyFirstBatch.bat 就这样诞生了。或许此时您对这东西能否正常工作还持有怀疑态度,但是在看到对该批处理文件双击运行完的结果以后,先前或多或少的怀疑也就荡然无存了……

双击后,显示的只是一闪就关闭了。正确的结果是在D盘多了名字分别为 test 和 test my folder 的两个文件夹。文件夹 test 里有一个叫 a.txt 的文件。而文件夹 test my folder 里有名字分别为 a.txt b.txt 和 d.bin 的3个文件。

Collected by Clove--Mail to Me

Windows 批处理脚本学习教程