Windows命令行基礎

 

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 ,com0 ~ com9 ,lpt0 ~ lpt9 ,nul ,prn 。
  3. 文件名不區分大小寫,如 A.txt 和 a.TxT 表示同一文件。

  你也許會發現很多文件沒有擴展名,其實不然。這是因爲 Windows 在默認情況下會隱藏大部分文件的擴展名。如果希望顯示所有文件的擴展名的話,打開“我的電腦”,“工具”菜單 -> “文件夾選項”,再在“查看”選項卡中,去掉“隱藏已知文件類型的擴展名”。另外,Windows 是根據文件的擴展名來決定對文件的操作的,而不是根據內容。例如,把一個文本文件(txt)的擴展名改爲“RM”,再雙擊它,Windows 就會調用某個安裝在你電腦上的媒體播放器(如 RealPlayer)來打開它。

2.3 文件的目錄管理

  把大量文件全放在一個目錄裏,操作系統查找一個給定的文件時就要花較長時間,同時,刪除時也易誤刪除,對用戶來說極不方便。於是,操作系統採用了目錄的分級管理。將一個用戶的同一類文件放在某個單獨的目錄下,和磁盤上所有其他文件分開來,這樣的目錄文件使用和管理起來要方便和科學得多。

  目錄好比書的章、節等不同層次,呈樹形結構。除根目錄外,其他目錄稱爲子目錄。子目錄下又可再帶子目錄。下圖是一個樹形目錄結構的例子。

圖2.1 樹形目錄結構

圖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<http://blog.henix.info/>
echo Cleaning...
rd /s /q %tmp%
md %tmp%
echo Done.
pause

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

rem CleanTmp.cmd : 清理 Windows 臨時文件夾
rem Author : henix<http://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. 常見問題解答

  • 問:echo 命令輸出總要換行,有辦法輸出一個字符串而不換行嗎?

    答:可以利用 set 命令的一個特殊用法

    set/p=輸出的內容<nul
  • 問:據說用 md 可以創建一些特殊目錄?

    答:

    md test..\

    將創建一個名爲“test.”(Windows XP)或者“test..”(Windows 7)的目錄,在資源管理器中無法正常刪除。刪除:

    rd test..\

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 的可靠文件複製。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章