MS-DOS 7 系統程式設計入門/命令列
第 2 章 命令列
MS-DOS 中的命令列以機器生成的提示符開始,然後隱含地由符號和單詞填充,這些符號和單詞必須根據特定的語法約定適合機器解釋。最後按 ENTER 鍵將命令列初始化為一個駐留程式 - 命令直譯器進行解釋。不同直譯器對語法約定的實現並不完全相同。
MS-DOS 7 提供了 3 個直譯器:IO.SYS、COMMAND.COM 和 DEBUG.EXE。每個直譯器都接受自己的一組命令,分別在第 4 章中描述 IO.SYS,在第 3 章中描述 COMMAND.COM,在第 6.05 部分中描述 DEBUG.EXE。由於載入程式 IO.SYS 僅處理配置檔案中的命令列,因此使用者首先會遇到 COMMAND.COM 所呈現的命令列。後者通常被稱為駐留直譯器,因為它永久地載入到計算機的記憶體中,因此始終準備執行從鍵盤輸入的命令。
透過輸入重定向(有關詳細資訊,請參見 2.04-02),可以強制直譯器接受來自鍵盤以外的命令,例如來自命令檔案。命令檔案中的每一行實際上都是一個獨立的命令列。透過輸入重定向傳送命令檔案是唯一可以透過 DEBUG.EXE 直譯器自動執行命令序列的方式(示例見 9.02)。
COMMAND.COM 直譯器也可以透過輸入重定向接受命令,但這並不是執行 COMMAND.COM 命令序列的最佳方式,因為它能夠處理一種特殊型別的命令檔案 - 批處理檔案 - 無需重定向。COMMAND.COM 直譯器從批處理檔案中接受許多補充命令,這些命令不能從命令列或普通命令檔案中執行。這些補充命令包括用其值替換虛擬引數和變數名稱(2.03-03)、搜尋標籤和其他一些命令(3.02、3.14、3.21、3.27)。本書中,術語“批處理檔案”僅用於此特殊型別的命令檔案。批處理檔案的示例顯示在第 9.03 部分中。配置檔案 AUTOEXEC.BAT(9.01-02、9.04-02、9.09-02)也是典型批處理檔案的示例。
本章描述了定義命令列組成的最基本約定,這些約定在單獨的命令列和命令檔案中都適用。這些約定在一定程度上適用於 MS-DOS 7 中的所有三個直譯器。直譯器的特有功能也將介紹。除非另有說明,否則隱含的是主直譯器 - COMMAND.COM - 對命令的解釋。
每個命令列都處理一個或多個物件。例如,物件可以是一個單獨的實用程式,用於執行所需的操作,也可以是命令直譯器的內部命令。命令列中的資料必須足夠充實,以精確地識別所處理的物件。為此,在任何公共目錄內,不允許物件具有相同的名稱:所有檔案和子目錄都必須取不同的名稱。為了識別任何特定目錄之外的任何物件,都會考慮該物件的路徑。該路徑可以顯式指定,也可以預設設定。
主物件的名稱及其可選路徑應在命令列中首先指定,並可能在其後跟其他專案,包括其他物件的名稱、引數、引用、語法標記等。第 9.03 節中介紹的命令檔案中的每一行都可以作為命令列的示例。
但是,也有一些物件 - 內部命令、埠和其他一些物件 - 無法透過路徑規範進行定義。這些物件的名稱必須是唯一的保留字,不能分配給任何其他物件。因此,首先要考慮的是使用者可以為哪些物件分配名稱,以及哪些物件不能分配名稱。
保留字代表每個直譯器特有的內部命令的名稱,以及在特定計算機中聲稱存在的裝置的名稱。這些物件的名稱不能更改或分配給其他物件。但是,應該瞭解這些保留字,以防止嘗試將這些名稱分配給使用者可以命名的其他物件。
內部命令是特定直譯器本身執行的命令。只要命令列由 COMMAND.COM 解釋,第 3 章中描述的所有這些內部命令的名稱都被視為保留字。例如,您不能將名稱 PROMPT 分配給檔案,因為 COMMAND.COM 在命令列中遇到此名稱時,會將其“理解”為自己的內部命令,並且不需要做任何事情,只需執行此命令即可。其他命令直譯器也類似地不允許將它們的內部命令的名稱分配給其他物件。
PC 中裝置的保留名稱定義了獲取資料的來源或傳送資料的目標。最常見的裝置名稱是
| AUX | – 第一個序列埠 |
| COM1 | – 第一個序列埠(等同於保留名稱 AUX) |
| COM2 | – 第二個序列埠 |
| CON | – 控制檯,即鍵盤用於輸入,顯示用於輸出 |
| LPT1 | – 第一個並行埠 |
| NUL | – 虛擬“無處可去”的輸出埠 |
| PRN | – 第一個並行埠(等同於保留名稱 LPT1) |
除了這些裝置名稱之外,還有一些其他名稱被視為保留名稱:CLOCK$、COM3、COM4、CONFIG$、LPT2、LPT3。這些詞語由整合到 DOS 核心中的裝置驅動程式保留,即使相應的裝置不存在於物理上,也會始終存在。可以透過 MEM.EXE 實用程式 (6.17) 顯示您 PC 中聲稱存在的全部裝置列表,前提是它以 /D 引數啟動。此實用程式會顯示一個表格,所有註冊的名稱都會顯示在其第 4 列中。保留字會向右偏移 3 個空格,與其他名稱區分開來。
幾個可安裝的軟體驅動程式也可以透過名稱識別併為其保留詞語。例如,SETVER.EXE 驅動程式 (5.01-02) 保留詞語 SETVERXX,HIMEM.SYS 驅動程式 (5.04-01) 保留詞語 XMSXXXX0,EMM386.EXE 驅動程式 (5.04-02) 保留詞語 EMMXXXX0。此外,當您為 CD-ROM 驅動器指定任意識別符號時,例如 MSCD001(參見 5.09-01、5.09-02、5.09-03),DOS 會將此名稱註冊為保留字。如果稍後您嘗試將此名稱分配給檔案,DOS 將拒絕您的嘗試。
命名和重新命名操作最常應用於目錄 (3.19、6.20) 和檔案 (3.24、3.25),包括普通檔案和可執行檔案。DOS 中的名稱最多包含 8 個字元,並且可以附加一個最多包含 3 個字元的副檔名(字尾)。字尾用點與名稱分隔。當分配了字尾,但特定操作不需要它並且省略時,點分隔符也必須省略。
名稱和字尾都可以由字母、數字和在命令列解析中沒有專門功能任務的幾個符號組成:井號 (#)、美元符號 ($)、和號 (&)、減號 (–)、感嘆號 (!) 、下劃線 (_) 和其他幾個符號 (2.04-06)。除要與命令 IF (3.15-02)、SEARCH (6.05-16) 和 FIND (6.14) 進行比較的字串中的字母外,大寫字母和小寫字母在幾乎所有操作中都被視為等效。
由於點 (.) 用於分隔名稱和字尾,因此不允許將其用作普通字元。其他禁止的符號包括逗號 (,)、冒號 (:)、分號 (;)、等號 (=)、問號 (?)、加號 (+)、左箭頭 (<)、右箭頭 (>)、星號 (*)、管道 (|)、斜槓 (/)、反斜槓 (\) 和雙引號 (" )。除非透過 COUNTRY 命令 (4.05、5.02-01、A.02-5) 取消了對國家語言符號的用法限制,否則也不允許使用國家語言符號。
目錄名稱通常沒有後綴。檔名稱中的字尾用於指示檔案的型別或來源。三個字尾:BAT、COM 和 EXE 具有特殊狀態,因為 COMMAND.COM 直譯器識別它們屬於可執行檔案。當命令列中指定帶有這些字尾之一的檔名時,COMMAND.COM 會自動嘗試執行該檔案程式碼。如果存在除有效可執行程式碼以外的其他內容,則計算機很可能會“掛起”。這些字尾不應分配給肯定不是可執行且有效的檔案。
其他字尾的分配並不那麼關鍵,但仍應遵循常見限制。檔案管理器能夠將檔案與特定副檔名連結到專用應用程式,例如,字尾為 BAS 的檔案可能會自動傳送到 BASIC 語言直譯器以供執行。將每個檔案自動定向到相應的程式很方便(6.25-03、6.25-04 中的示例)。字尾還有助於直觀識別基本檔案的類別。以下列表顯示了一些常見於 DOS 環境中的字尾關聯。
| BAK | – 存檔或檔案的舊版本 |
| BAT | – 批處理檔案,可由 COMMAND.COM 解釋 |
| BIN | – 需要固定放置的可執行檔案 |
| BMP | – 光柵影像檔案 (點陣圖) |
| CAB | – 用於軟體分發的壓縮檔案 |
| COM | – 沒有頭的可執行檔案 |
| CPI | – 包含 DOS 字型資料的庫檔案 |
| DAT | – 各種型別的非文字資料檔案 |
| DOC | – WORD 編輯器生成的文字檔案 |
| DLL | – 可執行程式碼的動態連結庫 |
| EXE | – 帶有頭部控制資料的可執行檔案 |
| EXT | – 功能擴充套件的規範 |
| GIF | – 圖形影像檔案 |
| HTM | – 用超文字標記語言編寫的檔案 |
| INI | – 包含初始化資料的檔案 |
| JPG | – 按照 JPEG 規範壓縮的影像檔案 |
| RAR | – 由 RAR.EXE 打包的壓縮存檔檔案 |
| RTF | – 富文字格式的文字檔案 |
| SCR | – 包含命令列的檔案,可由 DEBUG.EXE 解釋 |
| SYS | – 系統檔案,可以是文字檔案或可安裝檔案 |
| TMP | – 臨時檔案 |
| TXT | – 非格式化的文字檔案 |
| ZIP | – 由 PKZIP.EXE 打包的壓縮存檔檔案 |
可以在網際網路網站 http://www.openwith.org/ 中找到許多其他字尾的關聯。
2.01-03 檔案掩碼和萬用字元
[edit | edit source]問號 ( ? ) 和星號 ( * ) 被稱為替換符號(或萬用字元),它們不能在名稱和副檔名中使用,但可以用於替換命令列中名稱和字尾規範中的字元。包含萬用字元的名稱規範是檔案掩碼——一種一次性地解決多個檔案的方法。
解析包含檔案掩碼的命令列時,COMMAND.COM 可能會呼叫萬用字元擴充套件功能,該功能會搜尋滿足遇到檔案掩碼的檔名。如果找到了這樣的檔案,它的名稱將替換檔案掩碼,然後執行帶有此名稱的命令列。如果找到多個這樣的檔案,則會對每個找到的檔名依次執行類似的過程。
包含萬用字元的單詞是否會被解釋——這取決於要執行的命令:一些命令會呼叫上述萬用字元擴充套件功能,一些命令不會。通常情況下,萬用字元不會被忽略,但也有一些例外情況。
- 內部命令 ECHO、SET、TYPE 和 IF 使用相等比較功能(參見第 3 章)不會擴充套件萬用字元。
- 批處理檔案引數中的萬用字元不會被擴充套件(無論使用 CALL 命令與否);
- 輸入重定向符號(2.04-02)不會擴充套件萬用字元;
- FOR 命令(3.13)僅擴充套件括號內的萬用字元,但在括號之外,萬用字元將“按原樣”傳輸到 FOR 迴圈中要執行的命令,萬用字元的進一步命運取決於該命令。
萬用字元 (?) 表示一個符號,該符號會促使比較過程對任何單個字母或數字給出肯定響應。當檔名或字尾中的 (?) 萬用字元後面沒有明確指定的字母或數字時,比較過程也會對該位置的任何符號的缺失給出肯定響應。例如,在命令中
DEL readme.??
該物件將匹配當前目錄中所有名為“readme”且字尾不超過兩個字元的檔案:readme.ru、readme.en、readme.f 等等。因此,DEL 命令(3.09)將從當前目錄中刪除所有這些檔案。
星號 ( * ) 表示一個符號,該符號會促使比較過程對任何數量的任何後續字母或數字給出肯定響應,直到單詞結束,單詞結束可以是點或空格。例如,命令 DEL C:\TEMP\*.* 中的星號將匹配任何帶有任何字尾的檔名,因此此 DEL 命令將應用於指定目錄中的所有檔案。
2.02-03、9.09-02 和第 9 章中幾個其他批處理檔案中展示了萬用字元使用的許多示例。
- 注意
- 搜尋滿足檔案掩碼的檔案時是否會考慮屬性——這取決於要執行的命令。例如,ATTRIB 命令(6.01)的萬用字元擴充套件包括所有檔案,沒有例外。
- 直譯器 IO.SYS 和 DEBUG.EXE 不接受萬用字元。在 CONFIG.SYS 檔案由 IO.SYS 解釋時,問號被視為提示符,而不是萬用字元(參見 4.06、4.07、4.15、4.16、4.25)。
2.02 路徑
[edit | edit source]每個檔案在磁碟上的確切位置在某個目錄中指定。通常,多個目錄按層次結構排列:每個較高等級的目錄不僅可以包含有關檔案的資訊,還可以包含有關幾個較低等級目錄(子目錄)位置的資訊。要訪問任何檔案,您必須指出磁碟和路徑——即目錄以及通向包含該特定檔案的精確位置資料的目錄的整個子目錄鏈。
DOS 提供了機會(2.04-01、3.03)將任何一個特定路徑指定為預設路徑。此路徑將儲存在 DOS 的內部資料表中(A.03-3)。每次您在沒有路徑規範的情況下輸入命令列時,DOS 都會考慮儲存的預設路徑。預設路徑中指定的磁碟和最終目錄(子目錄)被稱為當前磁碟和當前目錄。DOS 的提示符(3.22)通常會調整以顯示當前路徑。
2.02-01 典型路徑結構
[edit | edit source]預設情況下,命令直譯器在當前目錄中搜索所定址的物件。如果物件必須在任何其他目錄中找到,則物件的名稱應以路徑開頭,例如
C:\DOS\MS7\Edit.com
其中
Edit.com |
– 是所定址的可執行檔案; |
C:\DOS\MS7\ – 是該檔案路徑的一個示例。 | |
顯示的路徑規範指導搜尋過程:首先應切換到磁碟 C 的根目錄,然後進入 DOS 目錄,然後進入其 MS7 子目錄,最後在該子目錄中搜索指定的可執行檔案。如果您碰巧擁有其他目錄結構,您將不得不指定其他名稱,但原理保持不變:首先是磁碟的字母名稱,後面跟著冒號,然後是一系列用反斜槓分隔的目錄名稱,最後是所定址物件的名稱。
以反斜槓結尾的規範在 MS-DOS 中被認為沒有目標物件,因此不完整。此類路徑將被忽略(參見 2.04-01)或被視為無效,除了一個特殊情況——路徑縮減為單個反斜槓。磁碟字母名稱後面的單個反斜槓表示指向指定磁碟根目錄的路徑。例如,A:\ 表示指向磁碟 A 的根目錄的路徑。
沒有磁碟字母名稱的路徑(例如:\DOS\MS7\Edit.com)從當前磁碟的根目錄開始計算,無論當前磁碟是什麼。這對於編寫媒體無關的批處理檔案很重要(9.01-01、9.04-01、9.09-01)。單個反斜槓被解釋為指向當前磁碟的未命名根目錄的路徑。使用以下反斜槓 CD \ 更改當前目錄的命令(3.02)將執行跳轉到當前磁碟的根目錄,無論它是什麼。
當路徑的開頭既沒有磁碟也沒有根規範時,它將從當前目錄開始計算。例如,路徑 DOS\VC4\Vc.com 意味著第一個子目錄 DOS 存在於當前目錄中,否則會顯示錯誤訊息。
2.02-02 PATH 變數
[edit | edit source]為了使命令列使用更輕鬆,DOS 提供了另一種路徑規範機制——透過 PATH 環境變數。當滿足以下 4 個條件時,此機制就會生效。
- 命令針對 COMMAND.COM 直譯器;
- PATH 變數已存在於環境中;
- 命令列中未指定路徑;
- 在當前目錄中找不到第一個所定址的物件。
如果所有這些條件都滿足,DOS 將沿著所有構成 PATH 變數值的路徑搜尋第一個地址物件。PATH 變數應事先使用內部 PATH 命令 (3.20) 設定。使用 PATH 命令進行路徑規範的示例顯示在 9.01-02、9.04-02、9.09-02 中。
藉助 PATH 變數,您可以像這些實用程式始終存在於您可能選擇的任何目錄中一樣輕鬆地呼叫它們以執行。這很方便,但僅在您碰巧在當前目錄中遇到與版本相關的同義實用程式時才會發生,該實用程式屬於 DOS 的其他版本。然後,後一個實用程式將首先被找到並失敗,留下錯誤訊息。關於如何避免此類衝突的不同方法在文章 5.01-02 和第 6 章的介紹文章中進行了討論。這個問題也可以透過在命令檔案或配置檔案中指定完整路徑來解決。此類解決方案的示例在第 9.03 部分給出。
2.02-03 路徑規範中的點(s)
[edit | edit source]路徑規範中的點(.)被解釋為當前目錄的別名。例如,請注意以下複製命令中替換目標路徑的尾隨點
Copy /B A:\MyDir\*.* .
有時批處理檔案必須編寫,以便在任何當前目錄(事先可能未知)中執行其工作,然後點別名是唯一允許的替換,用於所需的目標路徑規範到當前目錄。當任何其他(非當前)目錄將隱含為其他情況時,也需要使用點來定址當前目錄。
點作為路徑語句的第一個符號意味著應該從當前目錄開始計算路徑
.\VC4\Vc.com
這樣的路徑等效於沒有前導反斜槓的路徑 (2.02-01),但無論如何這種形式的路徑在批處理檔案中可能很實用,因為 MS-DOS 沒有其他方法來擺脫前導反斜槓。使用帶有前導點別名和反斜槓的命令的另一個原因是,當執行同義實用程式可能會造成不希望的後果時,防止在 PATH 環境變數中列出的所有路徑中搜索同義實用程式。
一些實用程式返回帶有最終反斜槓的目錄規範,例如
C:\DOS\MS7\
MS-DOS 將此類路徑視為無效,並且 MS-DOS 沒有提供擺脫最終反斜槓的方法。將點附加到此類路徑可以解決問題
C:\DOS\MS7\.
- 此目錄規範被視為有效。
雙點,或點點(..)可以像單個點一樣在路徑語句中的任何位置使用,但點點是父目錄的別名。例如,如果您得到規範 C:\DOS\MS7\ 並想要定址其父目錄,那麼規範 C:\DOS\MS7\.. 恰好等效於 C:\DOS。
在解析包含雙點別名的路徑時,DOS 只會拋棄路徑鏈的前一個元素(最後一個示例中的 \MS7\)。DOS 不檢查丟擲的元素是否存在,也不檢查它是否代表檔案或目錄。這提供了一個機會,可以在執行期間獲得的另一個檔案的路徑的基礎上,在事先未知的目錄中定址一個新檔案。此類定址的示例顯示在文章 6.25-03 中。
沒有前導路徑的雙點被解釋為相對於當前目錄的父目錄的別名,例如,在更改當前目錄的命令中 (3.03)
Cd ..
為了向上爬兩層目錄結構樹,您必須將雙點組合兩次
Cd ..\..
甚至更復雜的雙點組合也可以用來導航和探索目錄樹。
2.03 命令列解析語法提示
[edit | edit source]2.03-01 分隔符
[edit | edit source]命令列中的單詞用分隔符隔開:空格 ( )、逗號 ( , )、等號 ( = ) 和分號 ( ; )。雖然空格是最普遍使用的,但這些符號中的任何一個都被忽略在命令列的開頭,並且將在解析操作中充當分隔符,包括解析 FOR 命令 (3.13) 中的物件列表。由於同樣的原因,分隔符不能從命令列的引數傳遞到批處理檔案的內部虛擬引數 (2.03-03)。
不過也有一些例外。SET 和 IF 命令以特殊方式使用等號 ( = ),不允許將其用於分隔。當逗號、分號或等號符號位於 ECHO 命令之前時,則顯示部分行將從分隔符之後開始,包括可能的先前空格和單詞 ECHO 本身。分號 ( ; ) 在 PATH 命令 (參見 3.20) 中用作特殊分隔符。
IO.SYS 直譯器對分號的處理方式不同。分號被放置在 Config.sys 或 Msdos.sys 檔案 (5.01-01) 中的行的首位,被解釋為跳轉到下一行的命令,忽略當前行的剩餘部分(通常包含註釋)。偵錯程式 DEBUG.EXE 在彙編模式下以類似的方式處理分號:它忽略分號後的行的剩餘部分,從而能夠為 DEBUG 的命令檔案添加註釋 (7.01-05)。
2.03-02 斜槓
[edit | edit source]MS-DOS 命令列規範中的斜槓 ( / ) 是一個符號,用於將以下字母 (或單詞) 解釋為引數。例如,在命令 DEL C:\TEMP\*.* /P (參見 3.07) 中,斜槓 ( / ) 強制將字母 P 解釋為引數,從而在指定目錄中是否應刪除每個檔案時提示。引數的精確位置和形式是特定的,必須符合特定命令的規範。有時,斜槓 ( / ) 在 FOR 命令中用作功能分隔符,導致以下單詞中的字母轉換為大寫 (有關詳細資訊,請參見 3.13)。
2.03-03 百分號
[edit | edit source]批處理檔案中的百分號 ( % ) 表示用相同引數或變數的值替換虛擬引數的名稱或變數的名稱。這些替換在執行指定的命令和重定向之前執行。
虛擬引數用數字 0 到 9 命名。第 0 個虛擬引數的值始終是批處理檔案本身的名稱;其他虛擬引數從命令列中指定的專案中獲取其值,這些專案是從批處理開始的命令列中指定的專案。因此,例如,%3 將被替換為命令列中批處理檔名後面的第三個專案。如果多個虛擬引數在它們之間沒有空格地指定,則替換後它們的值將被連線起來。將值分配給虛擬引數的示例顯示在 2.03-04 和 9.03-01 中。
如果命令列中批處理檔名後面的單詞總數少於 3,則虛擬引數的指定 %3 將被替換為空,並消失,不會出現任何錯誤訊息。如果批處理檔名後面的單詞總數大於 9,則可以透過對虛擬引數編號進行移位 (3.27) 來訪問其餘部分的值。不過有一個例外:Autoexec.bat 檔案(例如,9.01-02),在 DOS 載入過程中自動執行,根本沒有虛擬引數,因此 CALL %0 命令 (3.02) 不會導致其遞迴執行。
變數的名稱必須是一個單詞,第一個字元是字母(不是數字!)。變數的值要麼由特殊的 SET 命令 (3.23) 分配,要麼從父環境繼承,該環境屬於啟動當前程式執行的程式 (參見 6.04)。為了執行替換,命令列中的變數名稱必須兩側都用百分號包圍 (例如,%VAR%)。第 9.03 部分顯示了包含環境變數的命令列的許多其他示例。
- 注意
- 如果百分號需要不進行替換地傳遞,則必須指定兩次 (
%%)。在解釋命令列時,雙百分號不會引起替換,它只是簡單地轉換為單個百分號。 - FOR 命令 (3.13) 使用它自己的區域性變數;它在批處理檔案之外的名稱必須只用一個 (前導) 百分號指定。在批處理檔案中使用時,該變數的名稱需要兩個前導百分號,例如,
%%A,因為替換不應在 FOR 命令之前執行 (有關詳細資訊,請參見 3.13)。 - 其他直譯器 (IO.SYS 和 DEBUG.EXE) 忽略百分號,不將變數和虛擬引數替換為它們的值。
2.03-04 雙引號 ( " )
[edit | edit source]雙引號 ( " ) 會停用直譯器解析命令列的功能,直到在同一行中遇到下一個雙引號。因此,任何一組位於開始和結束雙引號之間的單詞(可能包括分隔符、重定向等)將被解釋為一個專案。包含的雙引號本身被認為屬於包含的專案。例如,執行一行
C:\>Batch.bat 1 " 2 3 " 4 ""
建立一個新的虛擬引數集,其中第一個引數的值是單個數字 1,第二個引數的值是字串 " 2 3 ",第三個引數的值是數字 4,最後一個第四個引數的值是一對空雙引號。此虛擬引數集將存在,直到執行 Batch.bat 終止。將一組單詞包含在雙引號中是將這組單詞整體(連同內部的任何符號)包含在一個虛擬引數的值中的一種方法。這個技巧尤其用於保持 DOS 中長名稱的完整性。
一對空雙引號 ( "" ) 被認為是一個特殊的空符號,可以使解析序列保持不變。大多數 MS-DOS 7 中的內部命令(除了 ECHO、IF 和 SET)都忽略一對空雙引號作為單獨的符號,但接受受雙引號影響的解析結果。例如,命令
C:\>cd ""
如果在命令列中沒有其他符號,則該命令將被執行。如果引數用雙引號括起來,則命令將被執行,就像沒有雙引號一樣。
C:\>cd "C:\dos"
在解析命令列時,不會檢查結束雙引號的存在,除了解析 FIND(6.14)和 FOR(3.13)命令的引數。FIND 和 FOR 命令以稍微不同的方式進行解析:任何用雙引號括起來的單片語都被視為一個專案,但雙引號不被視為屬於該專案。因此,空配對雙引號("")可以在 FIND 命令中用於計算文字檔案中的總行數。出於同樣的原因,FOR 命令可以去除包含的雙引號,當這些雙引號不再需要時。
方括號 [ ] 用作要由 DEBUG.EXE 和 IO.SYS 執行的檔案中的特殊符號。方括號中的資料由 DEBUG.EXE 解釋為對運算元的引用(有關詳細資訊,請參見第 7 章的介紹文章)。
在由 IO.SYS 載入程式執行的配置指令碼 MSDOS.SYS 和 CONFIG.SYS 中,方括號中的單詞以不同的方式解釋:作為標題,標記單獨配置塊的開始,同時作為符號,包含此配置塊的名稱。有兩個保留字表示 CONFIG.SYS 檔案中的特殊配置塊:[menu] 和 [common]。[menu] 塊表示多配置選單;如果存在,它必須放在 CONFIG.SYS 檔案中第一個。選單塊因允許的命令的特殊子集而突出:MENUCOLOR(4.19)、MENUDEFAULT(4.20)、MENUITEM(4.21)和 SUBMENU(4.29)命令只能在宣佈為選單或子選單的塊中使用。除 NUMLOCK 命令(4.23)外,第 4 章中描述的所有其他配置命令都不能在選單和子選單塊中使用。
要在所有配置中執行的命令分組在一個或多個具有相同名稱 [common] 的塊中。在塊標題之外,配置塊的名稱在沒有方括號的情況下引用(4.14)。具有 [menu]、[common] 和其他一些塊的 CONFIG.SYS 配置檔案示例分別顯示在 9.04-01 和 9.09-01 中。
冒號 ( : ) 的解釋取決於它在命令列中的位置。用作一行中的第一個字元(僅在批處理檔案中),冒號 ( : ) 強制將緊隨其後的單詞解釋為標籤,標記跳轉的目標地址點。這一行中可能有多個單詞,但所有其他單詞和符號將被忽略。批處理檔案行首的雙冒號 ( :: ) 有時用於停用該行中指定的所有操作,包括重定向操作(2.04-02 – 2.04-05)。命令列中第二個位置的冒號 ( : ) 強制將前面的字母解釋為磁碟的字母名稱。如果命令列後面的部分為空,或簡化為單個反斜槓,或包含在反斜槓中,則整行將不被解釋為路徑,而是解釋為更改當前磁碟(使指定磁碟成為預設磁碟)的命令。例如,要使磁碟 A: 成為當前預設磁碟,您可以鍵入以下內容:
A:
或者
A:\
或者
A:\WINDOWS\
然後按 ENTER 鍵。更改當前磁碟不會更改該磁碟上的預設目錄。如果目標磁碟上的當前目錄是例如 A:\DOS,它將在上述每個示例中更改預設磁碟後保留其狀態。在這些命令中,任何包含在反斜槓中的路徑都不會被檢查,甚至可能不存在。實際上,任何以反斜槓結尾的完整地址都適合作為當前磁碟更改命令。
左箭頭 ( < ) 表示輸入重定向操作,由 COMMAND.COM 直譯器為執行命令列中左箭頭符號左側指定的程式而準備。預設情況下,標準輸入通道 (STDIN) 與控制檯 (CON) 相連,並接受來自鍵盤的輸入。實際上,左箭頭是將 STDIN(控制代碼 0000h)與輸入重定向符號右側指定的資料來源連線的命令。當左側指定的實用程式請求 DOS 透過 STDIN 通道進行資料輸入時,它將從該資料來源獲取資料。當然,只有當實用程式要求透過 STDIN 通道進行輸入時,這才能起作用。例如,命令
MORE < C:\DOS\Filename.txt
為過濾器實用程式 MORE.COM(6.19)提供從 C:\DOS 目錄中指定文字檔案讀取的資料。如果省略目錄規範,則隱含當前目錄。在任何情況下,都不會沿著 PATH 變數中列出的路徑搜尋要讀取的檔案。不允許使用檔案掩碼代替原始檔名,不會擴充套件萬用字元(2.01-03)。
除了檔案之外,埠(LPT1、LPT2、COM1、COM2、COM3、COM4)也可以用作輸入資料的來源。如果預設連結被 CTTY NUL 命令(3.07)破壞,則要從鍵盤執行輸入,您必須使用輸入重定向,並明確指定控制檯 (CON) 作為資料來源(3.07 中的示例)。
在任何情況下,輸入重定向時,您都必須確保指定的資料來源已準備好提供所需的資料。等待來自空閒、空閒或有缺陷資料來源的資料輸入很可能會導致掛起。
- 注意
- 重定向透過 JFT 表中的資料替換來安排(註釋 3 到 A.07-1)。由 COMMAND.COM 為執行程式準備的重定向可能會被程式本身取消(9.07-02 中的示例)。
- 其他命令直譯器(DEBUG.EXE 和 IO.SYS)忽略左箭頭符號以及其他重定向符號(2.04-02 – 2.04-05)。但是,由 COMMAND.COM 準備的重定向被 DEBUG.EXE 接受(9.02 中的示例)。
右箭頭 ( > ) 表示輸出重定向操作,由 COMMAND.COM 直譯器為執行命令列中右箭頭符號左側指定的程式而準備。預設情況下,標準輸出通道 (STDOUT,控制代碼 0001h) 被定向到控制檯裝置 (CON) - 也就是說,定向到顯示器的螢幕。輸出重定向強制將 STDOUT 定向到另一個目標 - 右箭頭符號右側指定的目標。例如,DEL /? 命令(3.09)通常將聯機幫助呈現給顯示器,但當它後面跟著輸出重定向符號時
DEL /? > Filename.txt
它的輸出將不會到達螢幕,它將被寫入指定的檔案中。將自動建立一個具有指定名稱(Filename.txt)的新檔案,以便將重定向的輸出寫入該檔案。如果存在同名檔案,則它將被覆蓋而不會提示,其以前的內容將丟失。
除了檔案之外,可允許的重定向目標可能包括埠(LPT1、LPT2、COM1、COM2、COM3、COM4)、印表機 PRN(通常等效於 LPT1)、顯示器 (CON) 和特殊準裝置 NUL,它充當“黑洞”:任何輸出都將永遠丟失(3.21 中的示例)。這通常用於去除不需要的訊息。
如果 STDOUT 通道和顯示裝置之間的預設連結被 CTTY NUL 命令(3.07)破壞,則仍然可以將輸出傳送到顯示器,但需要明確地將輸出重定向到 CON 裝置(9.03-02 中的示例)。
輸出重定向只能截獲透過 DOS 的正常 STDOUT 通道傳送的資料。透過 BIOS 的中斷(8.01-17、8.01-21、8.01-33)、透過 DOS 的 INT 29(8.02-88)和透過 STDERR 通道傳送的錯誤訊息(控制代碼 0002h)無法被 STDOUT 重定向影響。
如果您在一行中組合輸入和輸出重定向,則主可執行命令必須首先放在後面,然後是帶有完整源規範的輸入重定向。輸出重定向應在之後指定。組合重定向的示例顯示在 6.14、6.25-03 和 9.03-02 中。
所有重定向符號 (2.04-02 - 2.04-05) 優先順序高於普通操作,但標籤 (2.04-01) 和雙引號 (2.03-04) 除外。例如,在字串輸入命令 (ECHO、SET) 後,所有重定向符號都不會被處理為字串的一部分,而是會導致重定向。由於同樣的原因,重定向會忽略 IF 命令設定的條件,唯一可以有條件地執行重定向的方法是使用條件“IF...GOTO”跳轉繞過其行 (3.15、3.14)。
即使同一行中的主操作無效、被停用或根本沒有輸出,也會執行重定向。REM 命令 (3.24) 之後的空輸出重定向通常用於建立零長度檔案。
批處理檔案作為一個整體的輸出只能透過載入命令直譯器 COMMAND.COM 的單獨模組來重定向,使用 /C 引數 (6.04) 執行此批處理檔案(示例 - 在 3.22、9.01-03 中)。如果沒有啟動新的直譯器模組,批處理檔案的輸出可以在該批處理檔案內部逐行重定向,但不能作為一個整體重定向。
重定向應謹慎使用,因為它可能會影響某些傳送給使用者的警告或某些操作的提示,除了預期的輸出之外。例如,DIR /P 命令在每次螢幕滿後停止其輸出,並透過 STDOUT 傳送一條訊息,提醒使用者輸出將在任何按鍵後恢復。當此類訊息和警告被重定向時,螢幕將保持空白,並且 PC 似乎已掛起。
2.04-04 雙右箭頭
[edit | edit source]雙右箭頭 (>>),就像單右箭頭 (2.04-03) 一樣,也是輸出重定向的符號,但其作用不同,當重定向的目標檔案已經存在時。重定向到雙右箭頭不會重新覆蓋目標檔案,而是將新資料追加到現有目標檔案的先前內容。右箭頭 (2.04-03) 輸出重定向的所有其他特性也適用於雙右箭頭。
2.04-05 豎線(或“管道”)
[edit | edit source]豎線或“管道”分隔符 (|) 是中間重定向的符號,即從一個實用程式(或命令)到另一個實用程式(或命令)的資料傳輸。為此,COMMAND.COM 直譯器專門建立一個臨時檔案。位於“管道”左側的實用程式首先執行,其透過 STDOUT 通道 (透過控制代碼 0001) 的輸出被寫入此臨時檔案。然後控制權轉移到位於“管道”右側的實用程式(或命令)。當此實用程式發出透過 STDIN 通道 (透過控制代碼 0000) 接收資料的請求時,這些資料將從準備好的臨時檔案中獲取。當後者的實用程式執行終止時,臨時檔案將被自動刪除。
例如,以下命令序列可以避免詢問使用者是否真的要刪除指定目錄中的所有檔案
ECHO Y | DEL C:\TEMP\*.*
首先,建立一個空的臨時檔案。然後執行 ECHO 命令,其輸出訊息(單個字母 Y)被寫入該臨時檔案。然後執行 DEL 命令。找到 *.* 檔案掩碼後,它將發出請求以獲得使用者的許可並開始等待來自 STDIN 通道的回覆。但是,由於其 STDIN 通道被重定向,因此執行不會被暫停:回覆 - 字母 Y - 將立即從準備好的臨時檔案中讀取。
在一條命令列中,可能有兩個以上的命令透過“管道”連結。此類命令列的示例在 3.08 和 3.28 中顯示。
如果“管道”符號後的命令不需要臨時檔案的內容,則“管道”符號前的命令不必將訊息傳送到 STDOUT 通道。因此,“管道”符號可以潛在地用作分隔符,可以在一行中指定多個命令。但是,不建議使用這種“管道”方法:FOR 迴圈 (3.13) 可以做到同樣的事情,速度更快,並且無需訪問可寫磁碟來建立臨時檔案。
- 注意
- “管道”分隔符意味著在當前目錄或環境變數 TEMP 指示的目錄中建立臨時檔案。但是,當 DOS 從不可寫入的光碟或任何防寫介質載入時,這兩種嘗試都可能失敗。在這種情況下,錯誤訊息會通知中間重定向無法執行。然後,在“管道”符號右側指定的命令也不會執行。
2.04-06 “at” (@) 符號
[edit | edit source]在批處理檔案的命令列中用作第一個符號時,“at”符號 (@) 被解釋為一個命令,用於阻止在螢幕上顯示此行。因此,幾乎每個批處理檔案都以“at”符號開頭,後面跟著 ECHO OFF 命令。有時,這種操作不僅在第一行中是必要的(例如,在 3.13、6.25-02、6.25-03 中)。
- 注意
- DOS 並不限制在檔名中使用“at”符號,但錯誤地解釋以“at”符號代替第一個字母的檔名可能會導致有害後果。