Windows 命令行基础

最后更新日期:2020-01-02

修订历史

1. 引言:为什么要使用命令行

  在 DOS 时代,人们只能依靠输入命令同计算机互交。而现在,微软的 Windows 操作系统已得到了广泛使用,我们处理日常事务也大多使用基于图形用户界面(GUI,Graphics User Interface)的应用程序,命令行正在逐渐被人们淡忘。但我们同时也看到,系统自带的命令行解释器从 Windows 98 的 command.com 变成 Windows XP 的 cmd.exe 直到 Windows 7 的 PowerShell ,功能大大增强了。

  命令行有它独特的价值,在某些方面的表现是 GUI 程序无法获得的,下面举例来说:

  1. Windows 系统有时会出现故障,或是中了病毒、木马,系统根本无法引导。而整个 DOS 操作系统可装入一张软盘,只要用一张启动盘就可进入 DOS ,从而进行备份数据、修复系统等工作。如果你不会 DOS 命令,修复系统便无从谈起。当然,还有一些别的修复工具,比如 WinPE 、故障恢复控制台等,也能用来修复系统。但 DOS 启动盘具有制作简单、体积小等优点。在 DOS 中使用的命令请参考附录1
  2. Windows 命令行中提供了一系列实用小工具,极为绿色。比如 ping、netstat、diskpart 等命令。这方面可参考“附录2”。
  3. 学习 Windows 命令行,有助于我们更深入地了解 Windows 的工作方式。
  4. 很多软件既有图形前端,又有命令行版可供选择。如 7-Zip、WinRAR(两者都是压缩软件)皆有命令行版,微软的 cabarc(用来制作 CAB 压缩包)也是命令行程序。使用命令行版的软件通常具有占用资源少、运行速度快、可通过脚本进行批量处理等优点。

  当然,命令行也有其缺点。比如界面不够美观,手工输入命令较为繁琐(这可以通过一些输入技巧来弥补,详见 3.4 节),学习起来较为困难等。

  本文涵盖了 Windows 命令行的各方面的内容,从最简单的文件名命名规范到编写脚本文件,主要是基础知识。本文主要是为那些 Windows 命令行新手而写的,对读者的技术水平或使用计算机的经历不做任何要求。

  不同的 Windows 在命令行处理上也有细微差异,我用的系统是 Windows XP 和 Windows 7 ,后面一些命令的运行结果是基于此。

2. 文件系统基础

  计算机内各种信息,如程序、数据等都是以文件形式存在的,使用计算机,可以说是对各种文件的操作管理。文件系统是 Windows 的一个组件,它能够让用户查看、组织以及保护存储设备上的文件和目录并与其进行互交。在“我的电脑”中选中任一本地磁盘,单击右键 -> “属性”,在弹出的“属性”对话框中可看到该磁盘(分区)的文件系统。

  Windows 中常见的文件系统有 FAT 、FAT32 、NTFS 、ISO9660(或称 CDFS) ,其中 ISO9660 用于光盘,其他用于磁盘。不同的文件系统有某些参数的差异,比如 FAT32 允许创建的单个文件不得超过 4GiB ,但 NTFS 可以允许创建超过 4GiB 的文件;又如 FAT32 不保留大小写,而 NTFS 保留大小写;NTFS 还支持更多特性,比如文件的硬链接(junction)。

2.1 分区与盘符

  硬盘空间的划分称作分区。每个分区上需要有一个文件系统,文件系统负责决定文件在硬盘上的实际空间排布方式。

  我们平时说的 C: 、 D: 等即指磁盘分区,这些磁盘分区可能位于同一块物理硬盘上,也可能位于不同的两块硬盘。 C: 、 D: 等称为盘符或驱动器号,只是系统的一种表示符号,可以更改或重新分配。一个分区通常只包含一个文件系统。

2.2 文件与名称

  文件名称由文件名和扩展名组成,两者由小圆点分隔,扩展名通常是用来表示文件的类别。Windows 中整个文件名称最长 255 个字符(一个中文字算两个字符);DOS 中,文件名最长 8 字符,扩展名最长 3 字符,称为 DOS 8.3 命名规则。文件名称可仅有前半部,即无扩展名,如文件名称最短可以是“1”、“C”等。给文件命名还应注意以下规则:

  1. 文件名不能包含下列任何字符之一(共 9 个):\/:*?“<>|。
  2. 不能单独使用“设备名”作文件名。“设备名”包括:con ,aux ,com1 ~ com9 ,lpt1 ~ lpt9 ,nul ,prn 。
  3. 文件名不区分大小写,如 A.txt 和 a.TxT 表示同一文件。

  你也许会发现很多文件没有扩展名,其实不然。这是因为 Windows 在默认情况下会隐藏大部分文件的扩展名。如果希望显示所有文件的扩展名的话,打开“我的电脑”,“工具”菜单 -> “文件夹选项”,再在“查看”选项卡中,去掉“隐藏已知文件类型的扩展名”。另外,Windows 是根据文件的扩展名来决定对文件的操作的,而不是根据内容。例如,把一个文本文件(txt)的扩展名改为“RM”,再双击它,Windows 就会调用某个安装在你电脑上的媒体播放器(如 RealPlayer)来打开它。

2.3 文件的目录管理

  把大量文件全放在一个目录里,操作系统查找一个给定的文件时就要花较长时间,同时,删除时也易误删除,对用户来说极不方便。于是,操作系统采用了目录的分级管理。将一个用户的同一类文件放在某个单独的目录下,和磁盘上所有其他文件分开来,这样的目录文件使用和管理起来要方便和科学得多。

  目录好比书的章、节等不同层次,呈树形结构。除根目录外,其他目录称为子目录。子目录下又可再带子目录。下图是一个树形目录结构的例子。

图2.1 树形目录结构

  除根目录外的所有子目录都有个名字,命名规则同文件,一般没有扩展名。

2.4 绝对路径和相对路径

  当我们建立或修改一个文件时,必须向 Windows 指明这个文件的位置,这须知道三件事:驱动器、文件所在目录和文件名,这些信息构成一个路径。

  路径是由一系列目录名组成的,这些目录名之间用“\”分开,也可以把文件名(文件名和最后一个目录也用“\”分开)和驱动器号包括在内。例如:C:\WINDOWS\explorer.exe 。

  每个文件都有一个绝对路径和一个相对路径。绝对路径是指文件在文件系统中的准确位置,如 C:\WINDOWS\notepad.exe 。命令行解释器可以记住一个指定的目录,称为当前目录,相对路径即指文件相对于当前目录的位置。例如,如果用户在 C:\WINDOWS 目录下,则 C:\WINDOWS\notepad.exe 的相对路径是 notepad.exe 。这类似于家庭住址。如果是将自己的地址告诉住在同一座城市的人,可能会说自己住在某条街过去两条街。这就是相对地址——相对于同一座城市。如果是将自己的地址告诉其他国家的某个人,就必须说得更加详细,如中国某个省某个市中的某条街某号以及邮政编码,这就是绝对地址。相对路径常用于脚本,且使输入更简便,但是绝对路径是一个更为安全的选择,因为它避免了可能出现的歧义。

  如果一个路径是用“\”开始的,Windows 就从根目录开始找起(绝对路径),否则就从当前目录开始找(相对路径)。

  例如,在上图中,若当前目录为 a12 ,要指示子目录 a122 下的文件 ms.txt ,可以用路径 \a1\a12\a122\ms.txt(绝对路径) 或 a122\ms.txt(相对路径)。

  在“我的电脑”中,“地址栏”显示的就是当前目录。如果你看不到地址栏,请找到“查看”菜单 -> “工具栏”,勾选“地址栏”。如果你的地址栏没有显示完整路径(绝对路径),请单击“工具”菜单 -> “文件夹选项”,再在“查看”选项卡中,选中“在地址栏中显示完整路径”。

3. 基本命令

  本章将具体地介绍一些命令。你最好能实践一下本章的内容,这需要使用 Windows 的“命令行解释器”,该程序在 Windows XP 中是 C:\WINDOWS\system32\cmd.exe 。请打开“开始” -> “程序” -> “附件” -> “命令行提示符”。然后,新窗口中可能会显示以下内容:

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\%USERNAME%>_

  其中“%USERNAME%”代表您当前的用户名。这里“>”提示符之前显示的就是当前目录。

  注意以下几点:

  1. Windows 中有两种命令:内部命令和外部命令。内部命令即内置在命令行解释器中的命令,不需要额外的程序,如 dir 、copy 等。外部命令是以可执行文件的形式(扩展名通常为 exe 或 com)存在于磁盘上,这就意味着该程序必须存在,否则 Windows 是找不到该命令的,如 format.com 。
  2. 每条命令输完后须回车,方开始运行,并得到运行结果。命令行解释器把提示符“\>”和回车键间的字符串视为一条命令。如果这字符串确实符合 Windows 命令语法,就执行它,执行完后又回到提示符状态,否则命令行解释器给出错误信息。例如:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\root>cd "C:\Program Files"(此处回车,以后不标出)

C:\Program Files>_
C:\Program Files>gf
'gf' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Program Files>type a.txt
系统找不到指定的文件。

C:\Program Files>_
  1. 要学习某个命令,最好的方法是阅读该命令的联机帮助。可以输入“命令名 /?”或“help 命令名”来查看命令的联机帮助,例如“format /?”。本章对命令的解说仅限于最基本的用法,欲详细了解请看联机帮助。

3.1 目录操作命令

1. cd(Change Directory):改变当前目录

  格式:cd [/D] [盘符:][路径]

C:\>cd \a1\a12\a122  (进入 a122 子目录,即指定 a122 为当前目录)
C:\a1\a12\a122>cd \  (退回根目录)
C:\>_

2. 多级目录之间的转换

  1) 由多级子目录转向另一多级子目录

C:\a1\a12\a122>cd \c1\c13
C:\c1\c13>_

  2) 由根目录进入深层子目录

  a. 直接进入:

C:\>cd \a1\a12\a122
C:\a1\a12\a122>_

  b. 逐层进入:

C:\>cd a1
C:\a1>cd a12
C:\a1\a12>cd a122
C:\a1\a12\a122>_

  3) 退出深层子目录

  a. 直接返回根目录:

C:\a1\a12\a122>cd \
C:\>_

  b. 逐级退出子目录:

C:\a1\a12\a122>cd ..
C:\a1\a12>cd ..
C:\a1>cd ..
C:\>_

  4) 进入同级子目录,如从 C:\a1\a12 转至 C:\a1\a11 :

C:\a1\a12>cd ..\a11
C:\a1\a11>_

  以上实例中用到了“..”,这用来表示当前目录的上级目录(父目录)。类似地,一个点“.”表示当前目录。

  cd 命令只是切换目录,如要切换盘符,则只需输入“盘符:”。比如切换到 D 盘,则输入“D:”即可。

3. md(Make Directory):建立子目录

  格式:md [盘符:] 新建子目录路径

C:\a1\a12>md a123  (在当前目录下建立子目录 a123)
C:\a1\a12>md \d1  (在 C 盘根目录下建立子目录 d1)

4. rd(Remove Directory):删除子目录

  格式:rd [/S] [/Q] [盘符:]被删除子目录路径

C:\c1>rd c13  (删除当前目录下的 c13 子目录)
C:\c1>rd ..\b1  (删除根目录下的 b1 子目录)

  说明:

  1. 只有空子目录(不含文件的)才能被删除(除非用 /S 参数)。
  2. 根目录和当前目录不能被删除。

3.2 文件操作命令

1. dir :列文件目录清单

  格式:dir [盘符:][路径] [/P] [/W]

  说明:

  1. 参数“/P”为分屏显示,参数“/W”为简要显示(只显示文件名,不显示文件大小日期等信息)。
  2. 该命令可以使用通配符“*”和“?”,? 代表任一字符,* 代表任一字符串(若干个字符)。
C:\>dir  (显示当前目录下文件目录清单)
C:\>dir E:\bin /p  (分页显示 E 盘上 bin 目录下文件目录清单)
C:\WINDOWS\system32>dir p*.vbs  (显示以 p 开头,以 .vbs 为后缀的所有文件目录清单,结果如下)
 驱动器 C 中的卷是 SYSTEM
 卷的序列号是 B4E5-F200

 C:\WINDOWS\system32 的目录

2002-10-08  04:00           165,389 pagefileconfig.vbs
2002-10-08  04:00            35,332 prncnfg.vbs
2002-10-08  04:00            25,086 prndrvr.vbs
2002-10-08  04:00            21,250 prnjobs.vbs
2002-10-08  04:00            32,095 prnmngr.vbs
2002-10-08  04:00            28,992 prnport.vbs
2002-10-08  04:00            15,633 prnqctl.vbs
2002-10-08  04:00             3,621 pubprn.vbs
               8 个文件        327,398 字节
               0 个目录  1,826,009,088 可用字节

2. copy :复制文件

  格式:copy 源文件[+源文件] [目标文件]

C:\>copy *.* E:\backup    (复制当前目录下所有文件到 E:\backup)
C:\>copy pic\ws?.jpg F:    (复制 pic 目录下以 ws 开头,后任跟一个字符的 jpeg 图片到 F 盘)
C:\>copy a1+a2    (将 a2 的内容添加到 a1 尾,使 a1 的内容更新)

3. del :删除文件

  格式:del 一个或多个文件名

C:\>del *.tmp
C:\>del 1.txt 2.txt

4. ren :重命名文件

  格式:ren 原文件名 新文件名

  小结:

  1. 本章限于篇幅,只介绍了一些基本命令,相信您已经有能力自己阅读帮助文档。正如前面所提到的,Windows 命令的联机帮助是了解某个命令的最佳方法。输入“help”可得到一份常见命令列表。输入“命令名 /?”或“help 命令名”可以找到指定的联机帮助页。

  2. 命令的一般格式如下:

    命令名 [参数1] [参数2] ... [操作对象1] [操作对象2] ...

    使用参数,可开启命令的某些特定功能。参数和操作对象的顺序通常都可任意安排,不过某些情况下也有严格的顺序要求。例如 dir /w E:\bin 和 dir E:\bin /w 的效果是一样的。具体顺序应参考各命令的帮助文档。

  3. 命令参数中的文件名一般形式如下:

    [盘符:][路径]文件名[.扩展名]

    例如:

    • C:\PA\MUSI.rar

      C 盘 PA 子目录中的 rar 文件 MUSI

    • index.html

      当前盘上的 HTML 文件 index

3.3 通配符

  使用命令行界面的一个比较有趣的方面在于,能够使用特定的称为通配符或元字符(metacharacter)的字符来改变和增强命令的行为。

  正如上一节提到过的,Windows 中有两种通配符:问号(?)匹配文件名中的任何一个字符,星号(*)匹配文件名中的零个或多个字符。可以在一个命令中综合使用这些通配符以定位多个文件,或者在不记得文件的全名时找到该文件。例如,假定当前目录中含有文件:

date help help1 help2 help3 myprog.f myprog.o

  表3-1给出了匹配实例。

表3-1
参数+通配符 所匹配的文件
help? help1 help2 help3
help* help help1 help2 help3
* date help help1 help2 help3 myprog.f myprog.o
*.f myprog.f
d* date

  另外,通配符在 Windows 的“搜索”中也可以使用。

3.4 命令输入技巧

  打错了命令,怎样修改呢?怎样才能更高效地输入命令?这些都是本节将探讨的问题。

  在 DOS 操作系统中,打错命令有两种情况:

  1. 打错命令,若未回车可用退格键或左方向键(←)抹去错误后重打,然后回车执行。
  2. 打错了命令,已经回车,可用功能键修改。

  常用 DOS 功能键有:

F1 从左至右一个个字符地重复上次键入的命令。
F2 连续重复至某字符位置前所有字符(不含某字符)。
F3 复制上次输入的命令或当前光标后面剩余的全部字符。
F4 与 F2 相反删除到指定字符。
Del 删去一字符。
Ins 插入若干字符。
Esc 作废当前行。
Ctrl+C 强行终止当前命令或程序的执行。

  实际上,我们更多时候会在 Windows 下修改,“命令行解释器”给我们提供了更方便的修改方法。首先,在未回车时输左方向键(←)并不会像 DOS 中那样删除前一个字符,只会移动光标,故只需把光标移到有错误的地方修改即可。并且,Windows 中可使用上方向键(↑)来遍历已经输过的命令。另外,“命令行解释器”还提供了强大的复制/粘贴功能。姑举一例说明:

  假如上一个命令是“dir transitional.txt”,现在要输入“type transitional.txt”,有两种方法:

  1. 先按上方向键(↑)(或<F3>),屏幕显示:dir transitional.txt 。再按<Home>键,将光标移动到行首,按三次<Del>键,再输入 type ,即完成命令。
  2. 在窗口中点右键,选择“标记”,再用鼠标拉框选中上一个命令中的“transitional.txt”,按回车,就将文本“transitional.txt”复制到了剪贴板。然后输入“type”,空格,再点右键,选择“粘贴”,即完成命令。

  要提高输入效率还得靠另一个功能键:<Tab> ,它能自动补完文件名。例如,假设当前目录中以字母 t 开头的只有 transitional.txt 和 trap.exe ,但你嫌 transitional.txt 这个名字太长,于是你输入“type”空格后,输入“t”,然后按<Tab> ,命令行解释器会自动补完后面的部分,变成“type transitional.txt”,如果再按<Tab>,就会在 transitional.txt 和 trap.exe 这两个文件名之间切换。

4. 一些较高级的概念

  上一章介绍了 Windows 命令行的基础知识,本章将讨论一些更高级的功能,这些功能足以使 Windows 命令行成为一个非常灵活而且强大的工具。

4.1 输入输出重定向和管道

  每个命令都需要一个输入源和一个输出目的地。默认输入是键盘,默认输出是屏幕,这称为标准输入和标准输出。但在很多情况中,用户也许希望为单独某次操作修改输入和输出。例如,写一个命令,从一个文件提取数据,进行加工后,输出到另一文件。这称为重定向(redirection)。

  命令行解释器使用字符“<”和“>”来定义临时输入和输出源。假定用户希望使用 dir 命令列出某个目录的内容,并将输出保存到文本文件中而并非打印到屏幕上,那么他可以建立一个 dir.txt ,然后执行:

C:\>dir > dir.txt

C:\>

  这里,以上命令不会产生输出,但会修改 dir.txt 的内容。注意字符“>”会 完全覆盖 dir.txt 中已有的数据,而且 dir.txt 不存在时还会自动新建文件。如果希望保存先前数据,则可以使用 >> 操作符:

C:\>dir >> dir.txt (将输出追加到 dir.txt 的末尾)

C:\>

  字符 < 用于修改输入,所谓输入,是指某些命令从键盘读取的输入。这种命令在 Windows 不太常见,就举 sort 为例。sort 命令要求用户输入一系列单词,每个单词占一行,以 Ctrl+Z 结束输入,然后将这些单词按字母表顺序排序并输出到屏幕上。

E:\>sort
g (这里开始键盘输入)
n
o
m
e
^Z (Ctrl+Z 后回车,以下是输出)
e
g
m
n
o

  如果我们使用输入输出重定向呢?我们先建立一个 names.txt ,内容如下:

Kobato
Tomoyo
Eriol
Fay
Meilin
Rika
Ruby
Kaede
Freya
Misaki
Dorothy
Edward
Lisa

  然后执行:

sort < names.txt > names-alpha.txt

  该命令将输入和输出重定向结合在一起使用:将 names.txt 文件中的条目排序,然后将排序后的输出写入一个名为 names-alpha.txt 的文件中。得到的 names-alpha.txt 如下:

Dorothy
Edward
Eriol
Fay
Freya
Kaede
Kobato
Lisa
Meilin
Misaki
Rika
Ruby
Tomoyo

  管道(pipe)是一个操作符,它把输入和输出重定向结合在一起,从而将一个命令的输出立即作为另一个命令的输入。管道用竖直线字符(|)表示,该字符通常位于 Enter 键附近。

  最经典的使用管道的命令:more 。可以说该命令大部分情况下都和管道一起使用。例如,要查看 sort 命令的帮助信息,输入 sort /? ,但一屏显示不完,使用 sort /? | more 来分屏显示。

C:\>sort /? | more
SORT [/R] [/+n] [/M kilobytes] [/L locale] [/REC recordbytes]
  [[drive1:][path1]filename1] [/T [drive2:][path2]]
  [/O [drive3:][path3]filename3]
  /+n                         指定开始每个比较的字符号码 n。/+3 说明每个
                              比较应从每行的第三个字符开始。少于 n 个字符
                              的行排在其他行之前。按默认值,从每行的第一
                              个字符开始比较。
  /L[OCALE] locale            用指定的区域设置替代系统默认区域设置。
                              ""C"" 区域设置产生最快的排序顺序并且是当前的
                              唯一其他选择。排序总是不分大小写的。
  /M[EMORY] kilobytes         指定用于排序的主内存量,单位为 KB。
                              最小内存量总是 160 KB。如果指定内存大小,
                              无论主内存的可用量是多少,指定的内存量
                              会全部用于排序。

                              要取得最佳性能,通常不指定内存大小。按默认
                              值,如果达到默认最大内存值,排序会一次完成
                              (非临时文件);否则,排序会分两次完成(没有
                              完全排序的数据存储在临时文件中);用于排序
                              和合并的内存量相等。如果输入和输出都是
                              文件, 默认最大内存量为可用主内存的 90%;
                              否则,为主内存的 45%。
  /REC[ORD_MAXIMUM] characters 指定记录中的最大字符数量
                               (默认值为 4096,最大值为 65535)。
-- More  --

  此时,屏幕左下角显示:– More – ,按任意键则显示下一屏,直到全部显示完。

  另一个经典的使用管道的命令是 find ,用来过滤输出。例如,我要查看当前的环境变量,但我只对 PATH 感兴趣,则输入:

C:\>set | find "Path"
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\bin

4.2 特殊设备

  在 Windows 中可以使用如下设备名:

表4-1
设备名 表示
AUX 辅助设备
CON 控制台(键盘)
PRN 默认打印机(LPT1)
NUL 空设备
LPT1 - LPT3 并行端口
COM1 - COM4 串行端口

  可将命令的参数指定为这些设备名,就能实现很多奇妙功能。

1. 使用 con

C:\>copy con t.txt (读取键盘输入,并复制到 t.txt)
Hello,world! (此处用键盘输入,以 Ctrl+Z 结束)
^Z
已复制         1 个文件。

C:\>

2. 使用 nul “粉碎”文件

  文件被删除之后(指在回收站中被删除),还可以用某些软件恢复。怎样才能将文件彻底删除呢?这里提供一种简单易行的方法。

C:\>dir | find "t.txt"
2008-06-16  20:01                14 t.txt (目前为 14 字节)

C:\>copy nul t.txt (将“空”复制到 t.txt ,这样就将 t.txt 的大小改写为了 0 字节)
改写 t.txt 吗? (Yes/No/All): y
已复制         1 个文件。

C:\>dir | find "t.txt"
2008-06-16  20:37                 0 t.txt (文件大小已为 0 了)

C:\>del t.txt (再删除即可)

C:\>

  使用“copy nul 文件名”的办法,将文件大小改为 0 后再删除,这样即使用软件恢复也只能恢复出来一个空文件而已,无法得到原来的那个文件了。

4.3 环境变量

  环境变量是一个“变量名=变量值”的对应关系,每一个变量都有一个值与之对应。set 命令用于设置或查看环境变量。我们可以通过两个百分号的形式:“%变量名%”,在命令中引用变量的值。

C:\>set (列出当前所有环境变量及其值)
……省略输出若干……
windir=C:\WINDOWS

C:\>cd %windir% (该命令在执行时,“%windir%”会自动被替换成“C:\WINDOWS”)

C:\WINDOWS>set str=Hello! (用“set 变量名=变量值”来设置一个变量)

C:\WINDOWS>echo %str% (echo 命令可回显一个字符串)
Hello!

C:\WINDOWS>

  变量给命令或批处理文件带来了极大的灵活性,多用于批处理文件中。

4.4 环境变量 PATH

  有一个特殊的环境变量 PATH ,包含一组用分号(;)分隔的目录名。命令行解释器根据它查找可执行程序(exe)。

  如果想让自己的程序可以在命令行下使用,可以将程序所在的目录加入 PATH 中。

  例如若想直接使用 D:\GnuWin32\bin 下的 wget.exe :

C:\>wget
'wget' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>D:\GnuWin32\bin\wget
...(运行成功)

  如果每次使用的时候都要输入完整的路径 D:\GnuWin32\bin\wget ,显得有些繁琐,我们希望 wget 能像其他的 Windows 命令一样只输入名字就可以使用。这时可将它所在的目录,即 D:\GnuWin32\bin 加到 PATH 中:

C:\>echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0

C:\>set PATH=%PATH%;D:\GnuWin32\bin

C:\>echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;D:\GnuWin32\bin

C:\wget
...(运行成功)

  对 PATH 的更改只在这一次会话中有效,如果关闭命令行解释器再重新打开或者重启电脑 PATH 又会变成原来的系统默认值,如何修改这个默认值呢?

  Windows 7 中:计算机 -> 右键 -> 属性 -> 高级系统设置 -> 环境变量,下面的“系统变量”中的 PATH 。

5. 批处理文件简介

  使用批处理文件(亦称批处理程序或脚本),可以简化日常或重复性任务。批处理文件是纯文本文件,它包含一条或多条命令,其文件扩展名为 .bat 或 .cmd 。在命令提示符下键入批处理文件的名称,cmd.exe 就会按照该文件中各个命令出现的顺序来逐个运行它们。所以批处理文件的特点是:一次建立,多次运行,适合进行重复性任务。在 DOS 中只能使用 .bat 的批处理文件。

  可以在批处理文件中包含任何命令。某些命令,比如 for、goto 和 if 命令等,它们允许你对批处理文件中的命令作条件流程控制。例如,if 命令根据条件语句的结果来执行命令。还有些只能在批处理文件中执行的命令。

  有关批处理文件的详细信息,请参考以下命令的帮助页。

表5-1
命令 功能
rem 添加一段注释
echo 显示信息,或将命令回显打开或关上
if 执行批处理程序中的条件性处理
for 为一套文件中的每个文件运行一个指定的命令
goto 跳转到批处理程序中某个标明的行执行
pause 暂停批文件的处理并显示消息
call 从一个批处理程序调用另一个批处理程序,而不终止父批处理程序
pushd 保存当前目录,然后对其进行更改
popd 还原 pushd 保存的当前目录的上一个值
shift 更换批文件中可替换参数的位置
setlocal 开始批文件中环境更改的本地化
endlocal 结束批文件中环境更改的本地化
title 设置 cmd.exe 会话的窗口标题
start 启动另一个窗口来运行指定的程序或命令

6. 几个应用实例

6.1 批量改名

  下载了一组图片后,得到如下文件:(加粗为用户输入的内容)

C:\>d:(输入 D: 以切换到 D 盘,否则下一个 cd 命令无效)

D:\>cd D:\pics

D:\pics>dir /b
001.jpg
002-003.jpg
004.JPG
005.JPG
006.jpg
007.JPG
008.jpg
009.jpg
010.JPG
011.JPG
012.jpg
013.JPG
014.JPG
015.JPG
016.jpg
017.jpg
018.JPG
019.jpg
020.JPG

  我想将它们改名为 01.jpg ~ 20.jpg 用命令该怎样做呢?这里只提供一种可能的办法,实际上还有很多种方法,大家可触类旁通。

D:\pics>for %i in (01,04,05,06,07,08,09) do ren 0%i.jpg %i.jpg(for 命令中,%i 变量遍历小括号中的内容)

D:\pics>ren 001.jpg 01.jpg
……(命令回显会显示实际执行的命令,省略输出若干)
D:\pics>ren 009.jpg 09.jpg

D:\pics>for /L %i in (10,1,20) do ren 0%i.jpg %i.jpg

D:\pics>ren 010.jpg 10.jpg
(省略输出若干)
D:\pics>ren 020.jpg 20.jpg

D:\pics>ren 002-003.jpg 02-03.jpg(最后手动改名)

D:\pics>

  以上主要通过 for…in…do 结构及 /L 参数,使得本来要 19 次的改名操作只用两个 for 命令及一个 ren 就搞定。for 命令详细用法请参考其帮助页。

6.2 批量“粉碎”文件

  接着刚才的例子,如果我想用 4.2 节所述的方法“粉碎”当前文件夹下的所有 jpeg 文件,我该怎样做?

for %i in (*.jpg) do copy nul %i /y

  这里使用 /y 来防止 copy 的覆盖前提示。

6.3 清理 Windows 临时文件夹 %tmp%

  %tmp% 这个环境变量保存了 Windows 临时文件夹的位置,通常这个文件夹在 Windows 7 中是 C:\Users\用户名\AppData\Local\Temp ,WinXP 中则是 C:\Documents and Settings\用户名\Local Settings\Temp 。某些程序(典型如安装程序,解压缩软件)运行过程中产生的临时文件会存放于此,总之,是个堆放杂物的地方,其中文件一般可全部删除。在“我的电脑”的“地址栏”(若找不到地址栏,“查看”->“工具栏”->“地址栏”)中输入“%tmp%”,然后回车,看看你的临时文件夹有多少东西。

  下面讨论清理。可能每隔一段时间就需要清理临时文件夹,因此我们采用批处理文件。以下为 CleanTmp.cmd 文件的内容。

  第一种方案:全部删除

@echo off
rem 命令前加“@”会不让该命令显示出来,而“echo off”的作用是关闭整个
rem 脚本的命令回显。若不懂,请注释掉第一行(在最前面加“rem ”)再试。
rem CleanTmp.cmd : 清理 Windows 临时文件夹
rem Author : henix<https://blog.henix.info/>
echo Cleaning...
rd /s /q %tmp%
md %tmp%
echo Done.
pause

  也许你希望留下一些文件,比如 *.log ,那也可以用第二种方案:删除部分文件

rem CleanTmp.cmd : 清理 Windows 临时文件夹
rem Author : henix<https://blog.henix.info/>
del %tmp%\*.tmp /q
del %tmp%\*.wmv /q
del %tmp%\*.xml /q
rem 也可以添加更多,你的临时文件夹中经常出现的,而你又不想要的文件
pause

  将以上内容保存为 CleanTmp.cmd ,放在桌面(或其他你方便的地方),以后你只需双击这个 CleanTmp.cmd 就可清理临时文件夹。

6.4 快速切换 IP/DNS 配置

  有时我们可能需要经常切换 IP 配置,比如带着笔记本往返于家和公司之间,在家使用动态获取 IP,而在公司使用静态 IP ,如果每次都要点出对话框来修改 IP 的话,相当不方便。netsh 这个命令可以帮我们设置 IP 地址。

  在桌面上创建一个 dhcp.cmd ,内容如下:

set name="本地连接"
netsh interface ip set address %name% dhcp
netsh interface ip set dns %name% dhcp
pause

  假如你要切换的静态 IP 是 192.168.3.19 ,创建另一个文件 319.cmd ,内容如下:

set OUT=%TMP%\319.txt
set name="本地连接"

echo interface ip set address %name% static 192.168.3.19 255.255.255.0 192.168.3.1 0 > %OUT%
echo interface ip set dns %name% static 192.168.3.1 >> %OUT%
echo interface ip add dns %name% 8.8.8.8 >> %OUT%

netsh -f %OUT%

pause

  每次需要切换的时候双击运行这个脚本即可。这里 pause 的作用是暂停这个脚本,避免一闪而过。

  第二个脚本使用 netsh 的 -f 参数把一个文件当作脚本执行,这样 netsh 只初始化一次,速度较快。

6.5 下载一系列图片:for + wget

  有时我们在网上看到一系列图片,想把它们都下载下来,怎么办?首先要取得图片的地址,只有当图片的地址有一定规律性时,才能使用此法下载:在图片上点右键->“属性”,然后复制“地址”一栏的内容。假设要下载的图片地址很有规律,恰为 http://www.example.com/ 下的 1.jpg - 10.jpg 。

  网上有很多命令行小程序,可以增强命令行的功能。这里使用 GNU Wget ,该程序可通过 HTTP 、HTTPS 、FTP 协议下载文件。

  Windows 版下载地址:http://gnuwin32.sourceforge.net/packages/wget.htm ,需要下载“Binaries”和“Dependencies”,并把解压后可执行程序所在的目录添加到 PATH 中。

E:\pics>for /L %i in (1,1,10) do start wget http://www.example.com/%i.jpg

  start 命令会开启一个新的进程,可以实现多进程并发下载。

6.6 平坦复制(flat copy)

  如果想把一个目录中的所有文件(包含子目录)复制到另一处,但不想复制子目录结构,怎么办?

  使用 for 命令并使用 dir 的运行结果:

for /F "tokens=*" %i in ('dir /s /b /a-d "%SRC%"') do copy "%i" "%DEST%"

  或者直接用 for /R :

for /R "%SRC%" %i in (*) do copy "%i" "%DEST%"

7. 常见问题解答

8. 参考文献

  1. Paul Love, Joe Merlino 等: 《Unix 入门经典》. 张楚雄、许文昭译. 清华大学出版社. 2006
  2. 张钟澍、杨佛章编著: 《电脑打字与文书编辑(修订本)》. 成都科技大学出版社. 1993

附录1:常用 DOS 命令一览

(一)内部命令

1. CD(全程 CHDIR ,显示当前目录的名称或将其更改)
  格式:CD [路径名]
2. CLS(清除屏幕)
3. COPY(将至少一个文件复制到另一个位置)
  格式:COPY [/V] [/A | /B] 文件1 [+ 文件2 [+ ...]] 目标文件
4. DATE(显示或设置日期)
5. DEL(或用 ERASE ,删除至少一个文件)
6. DIR(显示一个目录中的文件和子目录)
  格式:DIR [盘符][路径][文件名] [/B] [/P] [/W]
7. MD(全称 MKDIR ,创建目录)
  格式:MD [路径]
8. RD(全称 RMDIR ,删除目录)
  格式:RD [路径]
  说明:只能删除空目录
9. REN(全称 RENAME ,重命名文件)
  格式:REN [盘符][路径]旧文件名 新文件名
  说明:不能为目标文件指定新的驱动器或路径
10. TIME(显示或设置系统时间)
11. TYPE(显示文本文件的内容)
  格式:TYPE [盘符][路径]文件名
12. VER(显示 DOS 版本)
13. VOL(显示磁盘卷标和序列号)
  格式:VOL [盘符]

(二)外部命令

1. ATTRIB(显示或更改文件属性)
  格式:ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [[盘符][路径]文件名] [/S]
  说明:+ :设置属性,- :清除属性,R :只读文件属性,A :存档文件属性,S :系统文件属性,H :隐藏文件属性。/S :处理当前文件夹及其子文件夹中的匹配文件。仅用 ATTRIB 会列出当前目录下全部文件及其属性。
2. CHKDSK(检查磁盘并显示状态报告)
  格式:CHKDSK [盘符[[路径]文件名]]] [/F] [/V]
  说明:不指明文件,则对整个盘进行操作,/F 为修复磁盘上的错误,/V 为显示磁盘上每个文件的完整路径和名称。
3. EDIT(EDIT 为一菜单式文本编辑软件)
4. FORMAT(格式化磁盘以供 DOS 使用)
  格式:FORMAT 盘符 [/V:卷标] [/Q] [/S]
  说明:高级格式化会清除全部文件,/V 指定卷标,/Q 快速格式化,/S 为格式化成 DOS 系统盘(相当于 FORMAT 后再 SYS)。
5. SYS(传输系统文件)
  格式:SYS [盘符]
  说明:制作可启动的 DOS 系统盘。
6. XCOPY(复制文件和目录树)
  格式:XCOPY 源文件 [目标文件] [/P] [/S [/E]] [/V]
  说明:/P 创建每个目标文件前提示,/S 复制目录和子目录,除了空的,/E 复制目录和子目录,包括空的,/V 验证每个新文件。

附录2:Windows 中的一些有用的命令

  下表列出了 Windows 中的一些有用的命令,使用方法请参考其帮助页。

1. 文件系统命令
命令 说明
assoc 显示或修改文件扩展名关联。如果在没有参数的情况下使用,则 assoc 将显示所有当前文件扩展名关联的列表。
attrib 显示、设置或删除指派给文件或目录的只读、存档、系统以及隐藏属性。如果在不含参数的情况下使用,则 attrib 命令会显示当前目录中所有文件的属性。
chkdsk 查找文件系统和文件系统元数据中的错误,并显示查找结果的状态报告。如果不带任何参数,chkdsk 将仅显示当前驱动器中的磁盘状态。不会修复错误。要修复错误,必须包括 /f 参数。
convert 将文件分配表 (FAT) 和 FAT32 卷转换为 NTFS 文件系统,而现有的文件和文件夹完好无损。被转换为 NTFS 文件系统的卷无法再转换回 FAT 或 FAT32。
defrag 定位并整理本地卷上的零碎启动文件、数据文件和文件夹。
diskpart 管理磁盘、分区或卷,可新建、删除等。
expand 展开一个或多个压缩文件(.cab 格式)。
fc 比较两个文件并显示它们之间的差异。
for 对一组文件中的每个文件运行指定的命令。
fsutil Fsutil 是一个命令行实用程序,可用于执行多种与文件分配表 (FAT) 和 NTFS 文件系统相关的任务,例如管理重分析点、管理稀疏文件或拆卸卷。由于 fsutil 的功能非常强大,因而只有具有 Windows XP 或 Windows Server 2003 的完整知识的高级用户才应使用它。此外,必须作为管理员或 Administrator 组的成员登录,才能使用 fsutil。
ftype 显示或者修改在文件名扩展关联中使用的文件类型。使用不带参数的 ftype 显示已定义打开命令字符串的文件类型。
move 将一个或多个文件从一个目录移动到指定的目录。
subst 将路径与驱动器号关联。如果使用时不带参数,subst 将显示有效的虚拟驱动器的名称。
tree 以图形的方式显示路径或驱动器中磁盘的目录结构。
2. 网络相关命令
命令 说明
arp 显示和修改“地址解析协议 (ARP)”缓存中的项目。ARP 缓存中包含一个或多个表,它们用于存储 IP 地址及其经过解析的以太网或令牌环物理地址。计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表。如果在没有参数的情况下使用,则 arp 命令将显示帮助信息。
ftp 将文件传输到运行文件传输协议 (FTP) 服务器服务(如 Internet 信息服务)的计算机,或从这样的计算机传输文件。通过处理 ASCII 文本文件,可以交互的方式或以批处理模式使用 Ftp。
hostname 显示计算机全名中的主机名称部分。
ipconfig 显示所有当前的 TCP/IP 网络配置值、刷新动态主机配置协议 (DHCP) 和域名系统 (DNS) 设置。使用不带参数的 ipconfig 可以显示所有适配器的 IPv6 地址或 IPv4 地址、子网掩码和默认网关。
net 许多服务使用的网络命令都以词 net 开头,这些 net 命令有:net [ accounts | computer | config | continue | file | group | help | helpmsg | localgroup | name | pause | print | send | session | share | start | statistics | stop | time | use | user | view ]
netsh Netsh 是命令行脚本实用工具,它允许从本地或远程显示或修改当前正在运行的计算机的网络配置。Netsh 还提供了一个脚本功能,对于指定计算机,可以通过此功能以批处理模式运行一组命令。为了存档或配置其他服务器,Netsh 也可以将配置脚本保存在文本文件中。
netstat 显示活动的 TCP 连接、计算机侦听的端口、以太网统计信息、IP 路由表、IPv4 统计信息(对于 IP、ICMP、TCP 和 UDP 协议)以及 IPv6 统计信息(对于 IPv6、ICMPv6、通过 IPv6 的 TCP 以及通过 IPv6 的 UDP 协议)。使用时如果不带参数,netstat 显示活动的 TCP 连接。
ping 通过发送 Internet 控制消息协议 (ICMP) 回响请求消息来验证与另一台 TCP/IP 计算机的 IP 级连接。对应的回响应答消息的接收情况将和往返过程的时间一起显示出来。Ping 是用于检测网络连接性、可到达性和名称解析的疑难问题的主要 TCP/IP 命令。如果不带参数,ping 将显示帮助。
telnet 通过 TELNET 协议登陆远程计算机。
tftp 向运行日常文件传输协议 (TFTP) 服务或守护程序的远程计算机(尤其是运行 UNIX 的计算机)传输或接收文件。如果使用时不带参数,tftp 将显示帮助。
tracert 通过递增“存在时间 (TTL)”字段的值将“Internet 控制消息协议 (ICMP) 回显请求”或 ICMPv6 消息发送给目标可确定到达目标的路径。路径将以列表形式显示,其中包含源主机与目标主机之间路径中路由器的近侧路由器接口。近侧接口是距离路径中的发送主机最近的路由器的接口。如果使用时不带参数,tracert 显示帮助。
3. 系统管理命令
命令 说明
at 计划在指定时间和日期在计算机上运行命令和程序。at 命令只能在“计划”服务运行时使用。如果在没有参数的情况下使用,则 at 命令将列出已计划的命令。
chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页。
exit 退出当前批处理脚本或 Cmd.exe 程序(即命令解释程序)并返回到启动 Cmd.exe 的程序。
help 提供关于系统命令的联机信息(即非网络命令)。使用不带参数的 help 列举并简要描述每个系统命令。
reg 对注册表子项信息和注册表项值中的值执行添加、更改、导入、导出以及其他操作。
regsvr32 在注册表中作为命令组件注册 .dll 文件。
sc 与“服务控制器”和已安装设备进行通讯。SC.exe 检索和设置有关服务的控制信息。可以使用 SC.exe 来测试和调试服务程序。可以设置存储在注册表中的服务属性,以控制如何在启动时启动服务应用程序,以及如何将其作为后台程序运行。SC.exe 的参数可以配置指定的服务,检索当前服务的状态,也可以停止和启动服务。可以创建批处理文件来调用不同的 SC.exe 命令,以自动启动或关闭服务序列。SC.exe 提供的功能类似于“控制面板”中“管理工具”项中的“服务”。
shutdown 使您能够一次关闭或重新启动一台本地或远程计算机。
set 显示、设置或删除环境变量。如果没有任何参数,set 命令将显示当前环境设置。
takeown 使管理员成为文件的所有者,可授予管理员恢复对以前被拒绝的文件的访问权限。
taskkill 结束一个或多个任务或进程。可以根据进程 ID 或图像名来结束进程。
tasklist 显示本地或远程机器上当前运行的进程列表。
4. Windows 7 中新增的命令
命令 说明
bcdedit Bcdedit.exe 命令行工具用于修改启动配置数据存储。
mklink 创建符号链接、硬链接或目录联结。
robocopy Windows 的可靠文件复制。

附录3:相关资源

henix 完成于 2008-6-22 。