MS-DOS 7 系統程式設計入門/內部命令
第三章 內部命令
內部命令是由命令直譯器本身執行的命令。與其他需要搜尋和從其介質讀取的實用程式相反,直譯器永久駐留在記憶體中,因此內部命令執行得更快。由於內部命令無需搜尋,因此無需指定內部命令的路徑。所有內部命令的另一個共同屬性是它們不返回錯誤級別程式碼。
本章介紹 Microsoft 專有命令直譯器 COMMAND.COM 的內部命令(檔案大小 93812 位元組,檔案日期 1996 年 6 月 12 日)。此直譯器的本地化版本通常略大,日期略晚,但仍然執行相同的內部命令集。在所描述的內部命令中,有專為批處理檔案設計的命令(3.02、3.14、3.21、3.27)。
COMMAND.COM 直譯器為其內部命令提供簡短的幫助資訊。要顯示幫助文字,您必須鍵入命令名稱,後跟一個空格和 /? 引數,然後按 ENTER 鍵。但是,提供的簡短幫助資訊通常被認為太短。本章提供了一些說明,可以幫助您避免常見錯誤,並使內部命令的使用更加有效。
BREAK 命令類似於同義配置命令(有關詳細資訊,請參見 4.02)。它們都影響相同的二進位制標誌,該標誌控制在磁碟訪問操作期間對 BREAK 和 CTRL-C 鍵擊的檢查。當命令直譯器的當前駐留模組完成其工作時,此二進位制標誌不會丟失其狀態,並且本地環境將丟失。與 IO.SYS 載入程式 (4.02) 相反,COMMAND.COM 直譯器在響應不帶引數的 BREAK 命令時會顯示所述二進位制標誌的當前狀態。
CALL 是一個從另一個批處理檔案(主批處理)執行一個批處理檔案(次要批處理)的命令。批處理檔案是非格式化的文字命令檔案,COMMAND.COM 直譯器從中接受擴充套件的命令集。CALL 命令只是其中一個旨在從鍵盤而不是從批處理檔案行輸入的命令。
批處理檔案中的每一行都可能包含一個內部命令的名稱,或一個外部實用程式的名稱,或另一個批處理檔案的名稱。當命令直譯器遇到一個外部實用程式的名稱時,它會將控制權轉移到該實用程式,但在實用程式完成其工作後會收回控制權,並繼續執行同一個批處理檔案中的下一行。但是,批處理檔案不像普通實用程式那樣工作。在批處理檔案(主批處理)的一行中找到一個批處理檔案(次要批處理)的名稱後,COMMAND.COM 直譯器會開始執行次要批處理,並且不會返回到主批處理。為了能夠返回到主批處理檔案的執行,次要批處理應使用 CALL 命令啟動,例如
CALL C:\DOS\VC4\Help.bat J 96
其中
C:\DOS\VC4\ – HELP.BAT 檔案的路徑示例。如果省略路徑,則將在當前目錄中搜索該檔案,然後根據 PATH 變數指定的路徑進行搜尋。 | ||
Help.bat |
– | 次要批處理檔案的名稱示例。 |
J 96 |
– | 要傳輸到 HELP.BAT 檔案的特定引數(其他批處理檔案可能需要其他引數,或者可能根本不需要引數)。 |
實際上,CALL 命令會阻止關閉主批處理檔案,會保留主批處理檔案的儲存段、其虛擬引數和其檔案指標位置(作為返回目標),讓命令直譯器執行 CALL 命令後在同一行中指定的另一個(次要)批處理檔案,然後恢復對主批處理檔案需求的訪問,從而能夠返回到主批處理檔案中下一操作的執行。
- 注意
- 次要批處理檔案不是繼承主環境的副本,而是繼承對相同主環境的訪問。在次要批處理檔案執行期間分配的變數的值將在恢復主批處理檔案執行後變得可訪問。
- 使用 CALL 命令執行批處理檔案允許巢狀超過兩次。
- CALL 命令允許執行遞迴呼叫,即,可以從同一個批處理檔案中的行中呼叫一個批處理檔案。但是,使用者有責任防止遞迴巢狀級別的不受控制的加深。
- 如果次要批處理檔案未在指定的目錄或當前目錄中找到,以及在 PATH 變數定義的所有路徑中都未找到 (2.02-02),那麼執行將轉移到主批處理檔案的下一行,而不會出現任何錯誤訊息。
- 在使用 CALL 命令的行中不允許重定向符號 (2.04-02 - 2.04-05)。
- 所述 CALL 命令是為 COMMAND.COM 直譯器設計的,不應與同義彙編命令 (7.03-08) 混淆,後者由 DEBUG.EXE 偵錯程式解釋。
當命令列中未指定磁碟和路徑時,MS-DOS 隱含地假設所定址的物件位於預設(當前)磁碟的預設(當前)目錄中。預設磁碟分配已在第 2.04-01 文章中進行了說明。預設目錄分配由 CD 命令執行。
CD 命令允許根據指定路徑更改任何磁碟上的當前目錄(但不能更改當前磁碟本身)。例如,命令
CD C:\DOS
如果當前(預設)磁碟是 C 盤,則會將當前目錄設定為 \DOS。CD 命令可以指向非當前磁碟,但指定的路徑會被視為預設,當 CD 命令中指定的磁碟被設定為當前磁碟時,該預設路徑將成為當前(預設)目錄 (2.04-01)。
CD 命令中的路徑可以以任何允許的形式表示 (2.02-01)。路徑中的最後一個詞必須是目標目錄的名稱或任何別名符號的組合 (2.02-03, 2.03-02)。這些組合可以執行以下操作:進入根目錄 (CD \)、進入父目錄 (CD ..)、向上遍歷目錄結構兩級 (CD ..\..) 等等。
沒有路徑指定的 CD 命令,例如
CD C:
顯示指定磁碟上當前目錄的路徑。如果磁碟也不指定,則隱含當前磁碟。
- 注意
- CHDIR 是與 CD 命令相同的另一個有效名稱。
- 透過 CD 命令分配為當前目錄的目錄無法使用 RD 命令 (3.23) 刪除,即使該目錄不屬於當前磁碟。
- 所有邏輯磁碟的當前目錄的預設路徑儲存在 CDS 表結構 (A.03-3) 中。預設情況下,它填充到根目錄的路徑。
3.04 CHCP – 更改內碼表
[edit | edit source]內碼表是用於在螢幕上顯示訊息的字元和符號陣列。當使用 CHCP 命令而不帶後面的內碼表編號時,它將顯示當前活動內碼表的編號。更改內碼表的功能通常被停用,
- 除非 DISPLAY.SYS 驅動程式 (5.02-02) 準備了兩個或多個內碼表記憶體緩衝區,
- 除非這些緩衝區已透過
MODE.COM CON CP PREP命令 (6.18-03) 用不同的內碼表填充, - 並且除非事先載入了 NLSFUNC.EXE 驅動程式 (5.02-03)。
慣例是隻載入一個國家內碼表,因為每個國家內碼表不僅包含國家字元集,還包含美式英語字元集。在這些字元集之間切換並不意味著內碼表更改:它是在任何一個國家內碼表內部執行的。
當沒有一個內碼表包含你要使用的語言的字元集時,就需要載入多個國家內碼表。例如,如果你準備了挪威內碼表 865 和俄羅斯內碼表 866,那麼命令 CHCP 865 和 CHCP 866 將在這些內碼表之間執行切換。
- 注意
- 可以使用
MODE.COM CON CP SEL命令 (6.18-03) 更改內碼表,該命令不需要載入 NLSFUNC.EXE 驅動程式。 - CHCP 命令無法處理由非微軟碟機動程式載入的國家內碼表,例如由 KEYRUS.COM (5.02-05) 載入的內碼表。
- 如果你使用某個重要實用程式或 TSR shell 的國家版本(例如,使用俄語符號的 Norton Commander),那麼更改內碼表將使這種國家符號完全不可讀!只有美式英語符號(字元 32 – 127,所有內碼表共用)不會受到內碼表更改的影響。
3.05 CLS – 清除螢幕
[edit | edit source]CLS 命令會清除顯示卡記憶體中當前螢幕頁的所有內容,並將其顏色設定為預設值,從而實現黑色背景上的白色文字顯示。
3.06 COPY – 複製檔案
[edit | edit source]COPY 命令用於複製一個檔案或多個檔案。它還允許連線檔案並組合複製和重新命名。以下是將一個檔案複製到另一個位置的示例
COPY /A C:\DOS\MS7\Trial.txt A:\DOS /V /Y
其中
/A |
– | 表示指定原始檔必須複製到第一個檔案結束符 (1Ah) 之前。要將一個檔案複製到目標檔案,預設情況下會使用相反的 /B 引數。它強制完整複製檔案,忽略檔案結束符位元組 1Ah,該位元組在可執行檔案和二進位制資料檔案中可能起著完全不同的作用。 |
C:\DOS\MS7\ – 是原始檔路徑的示例。有關路徑規範的允許替代形式,請參見 2.02-01 – 2.02-03。如果沒有指定原始檔路徑,則只會從當前目錄中搜索此原始檔(COPY 命令會忽略 PATH 變數中的路徑)。 | ||
Trial.txt – 是要複製的原始檔名的示例。如果原始檔名有副檔名,則必須指定副檔名。原始檔可以具有 "A"(存檔)和 "R"(只讀)屬性。不會複製具有 "H"(隱藏)和 "S"(系統)屬性的原始檔。 | ||
A:\DOS |
– | 是現有目標目錄的路徑示例,其中應放置副本。但是,如果 \DOS 目錄不存在,則 DOS 將被解釋為副本的新名稱,並且將在 A 盤的根目錄中建立一個名為 DOS 的副本。如果你不想重新命名副本,則目標路徑必須與源路徑不同。如果原始檔不在當前目錄中,則可以省略目標路徑,在這種情況下,當前目錄將隱含為目標。 |
/V |
– | 是一個可選引數,它會強制驗證副本。這會使複製速度變慢,並且在目標介質是硬碟時不需要。但是,當目標介質是軟盤時,/V 引數可能值得延遲。 |
/Y |
– | 是一個可選引數,它允許在不提示的情況下覆蓋目標目錄中的任何同名檔案。/Y 引數可以在 COPYCMD 環境變數 (透過命令 SET COPYCMD= /Y ) 中預設,這樣你就不需要在命令列中指定它。當需要提示時,可以在命令列中使用 /–Y 引數覆蓋此預設。 |
當 /A 引數是命令列中的最後一個專案時,它的作用完全不同:它不會阻止完整複製檔案,而是會強制 COPY 命令在副本中追加檔案結束符 (1Ah),如果該檔案結束符不存在的話。
COPY 命令中指定的第一個路徑始終被解釋為源路徑,最後一個被解釋為目標路徑。在一個 COPY 命令中指定兩個以上的路徑(或檔名)被視為錯誤,除非指定中間原始檔,並在前面加上加號 ( + ) 用於連線複製,例如
COPY /B T1.dat + T2.dat /A + Remark.txt C:\DOS
其中
/B |
– | 複製模式引數,它在第一個原始檔名之前,會保持其對所有後續原始檔名的影響,直到遇到相反的引數規範 (本例中的 /A)。如果還有其他原始檔名,則後者會將其影響傳播到所有剩餘的原始檔名。由於連線主要應用於非可執行檔案,因此 /A 引數被視為連線複製的預設引數。 |
T1.dat、T2.dat、Remark.txt – 這些是要連線複製的三個原始檔。由於省略了原始檔的路徑,因此隱含所有這些檔案都存在於當前目錄中。除了第一個原始檔名之外,所有後續原始檔名前面都必須加上連線符號 ( + )。 | ||
C:\DOS |
– | 是目標目錄路徑的示例。如果目標目錄存在,則連線結果將放置在該目錄中,並且會繼承第一個原始檔 (T1.DAT) 的名稱。但是,如果 C:\DOS 目錄不存在,則最後一個名稱 DOS 將被解釋為組合檔案的新的名稱,並且將在 C 盤的根目錄中寫入名為 DOS 的連線結果。 |
允許使用檔案掩碼代替原始檔名,但應謹慎使用這種規範。讓我們考慮一個例子
COPY /B T*.dat C:\DOS\Concat.dat
COPY 命令檢查目標路徑中的最後一個詞(最後一個反斜槓的右側),以確定它是否是一個現有子目錄的名稱。如果子目錄 CONCAT.DAT 不存在,則所有符合給定檔案掩碼的檔案副本將被連線到一個新的檔案中,該檔案將在 C:\DOS 目錄中建立,並將命名為 Concat.dat。但是,如果名為 CONCAT.DAT 的子目錄已經存在,則所有符合檔案掩碼的檔案將不會被連線,而是會逐個單獨地複製到該子目錄中。後一個例子表明,COPY 命令使你能夠使用同一個命令列獲得完全不同的結果。這就是為什麼你必須確切知道你指定的最後一個名稱是否與現有子目錄的名稱一致。
對於連線複製,可以將同一個檔案指定為目標和第一個原始檔,並且該檔案將被追加到後續原始檔的內容。不允許將非第一個原始檔指定為目標(該原始檔的內容將丟失)。當副本的新名稱不會被誤解時,則可以為原始檔和目標指定相同的路徑,甚至完全省略這兩個路徑(隱含當前目錄)。
將一個檔案複製到自身被視為錯誤。但是,連線複製的形式允許為未重新命名的副本和原始檔指定相同的路徑。同時,可以省略連線的第二個檔案的名稱,例如
COPY /B \DOS\File.ext +,,\DOS
這種偽複製形式不會更改檔案的內容,但用於將當前日期分配給檔案,或者如果檔案為空,則用於刪除檔案。[注 1][注 2]
COPY 命令中原始檔位置的保留字 CON (= 控制檯) 會導致命令直譯器不將後續輸入行解釋為命令列,而是將後續輸入解釋為文字
COPY CON C:\DOS\Remarks.txt
此命令允許將從鍵盤輸入的文字寫入到在 C:\DOS 目錄中建立的 Remarks.txt 檔案中,直到按下 F6-ENTER 鍵組合返回命令列輸入 (有關更多詳細資訊,請參見 1.04)。
保留字 PRN (印表機)、LPT1–LPT4 (並行埠)、COM1–COM4 (序列埠) 或 NUL (虛擬 "黑洞") 可以用作複製的目標,而不是檔案。命令
COPY CON PRN
將計算機變成一臺打字機。當然,必須正確配置所選目標,並且連線的終端裝置必須能夠響應 DOS 的請求。當目標是裝置時,預設情況下會使用 /A 引數 (作為 ASCII 文字複製)。與真正的終端裝置相反,虛擬裝置 NUL 始終配置正確。將真實檔案從物理介質 (例如,從軟盤) 複製到虛擬 "黑洞" NUL 有時用於測試該檔案是否為空或是否可讀。
- 注意
CTTY 命令更改所有三個標準 I/O 通道的設定:STDIN、STDOUT 和 STDERR。初始的預設 I/O 設定等效於 CTTY CON 命令設定的那些設定:所有通道都與 CON 裝置(控制檯)連結,即與鍵盤輸入和顯示輸出。CTTY 命令可以接受以下埠之一來代替控制檯 (CON):COM1 (AUX)、COM2、COM3、COM4、LPT1 (PRN)、LPT2 以及虛擬裝置 NUL(用於輸出到“無處”)。CTTY 是一個古老的命令。它的名稱(CTTY = Change TeleTYpewriter)讓人想起沒有顯示器、I/O 控制檯類似老式電傳打字機的時代。
如今,在批處理檔案中使用 CTTY 有兩個原因。第一個是防止意外中斷執行;第二個是防止透過 DOS 的 STDERR 通道傳送的、無法以其他方式重定向的、不希望看到的錯誤訊息。在這兩種情況下,問題都透過重定向到虛擬 NUL 裝置(無處)來解決:CTTY NUL 位於要保護的命令組之前,CTTY CON 稍後恢復與鍵盤和顯示器的正常通訊。在受保護的命令組(CTTY NUL 和 CTTY CON 之間)中,不允許內部和互動式中斷執行,因為否則不會顯示任何訊息,不會接受任何輸入,並且 PC 似乎會掛起。儘管如此,通常仍然可以透過 CTRL-ALT-DELETE 重啟。
CTTY 命令隻影響隱式 I/O 設定,但它不影響在命令列中顯式指定的重定向(2.04-02 – 2.04-05)。例如,讓我們考慮批處理檔案的以下部分
@ctty nul copy /B Trial.dat Suit.dat echo Press any key to exit > con pause < con ctty con
這裡來自 COPY 命令的訊息將不會到達螢幕,即使它是錯誤訊息。但是“按任意鍵退出”訊息將顯示,因為它被顯式地定向到 CON 裝置。下一個 PAUSE 命令也將正常工作,因為它被顯式地連結到鍵盤。這種形式的 CTTY 使用需要謹慎,但它為影響與使用者的互動提供了有吸引力的機會。本文 9.03-02 中展示了一個使用這種形式的 CTTY 的批處理檔案示例。
- 注意
- 被 CTTY NUL 命令禁止後,STDERR(錯誤)訊息無法被顯式地重定向並且會丟失。
要設定新日期,必須在命令列中 DATE 命令的名稱之後指定此新日期,例如
DATE 11.07.2002
當未指定日期時,將顯示當前日期,然後系統將提示您透過鍵盤輸入新日期。[注 2] 如果您不想更改日期,只需透過按 ENTER 鍵來響應提示。
字母和其他文字檔案通常會附加一行帶日期簽名的行。為此,應以以下方式使用 DATE 命令
ECHO= | DATE | Find.exe "Current" >> Anyfile.txt
這裡,第一個重定向 (ECHO= | DATE) 會自動響應顯示的提示並啟用無停頓操作,第二個重定向 (DATE | Find.exe) 會排除不希望看到的輸出行,第三個重定向 (>> Anyfile.txt) 會將日期簽名附加到指定的檔案。
當然,應該滿足執行重定向 (2.04-05) 和查詢檔案 (Find.exe 和要附加的檔案) 的所有條件。
- 注意
- 日期和月份資料的順序是特定於國家的,應由 COUNTRY 命令 (4.05) 設定。
- ^ 更改日期的提示補充了一個用於兩位數年份資料的提示,但這是一個錯誤 : MS-DOS 7 需要四位數年份資料。
DEL(DELete)命令不會物理刪除檔案,而是停用目錄規範中的檔案條目。被無效條目佔用的簇被認為是空閒的,並且可能在後續操作期間被覆蓋。但在這些簇被覆蓋之前,已刪除的檔案可以被恢復,例如,可以使用 Norton Utilities 版本中的 UNDELETE.EXE 實用程式來恢復。
這是一個帶有 DEL 命令的命令列的示例
DEL D:\TEMP\Filename.ext /P
其中
D:\TEMP\ |
– | 包含要刪除的檔案的目錄的磁碟和路徑規範的示例。如果省略路徑,則隱含當前目錄。 |
Filename.ext – 要刪除的檔案的名稱示例; | ||
/P |
– | 可選引數,在刪除每個檔案之前提示確認。 |
當指定檔案掩碼 (2.01-03) 而不是檔名時,將刪除所有符合此檔案掩碼的檔案。但是,嘗試使用檔案掩碼 *.* 刪除目錄中的所有檔案會導致停止並詢問使用者是否真的應該刪除所有檔案。即使未指定 /P 引數,執行也會停止。使用者必須使用 Y(是)或 N(否)鍵來響應查詢。
在批處理檔案中,無停頓操作通常是可取的,不需要任何提示和查詢。這可以透過以下方式實現,例如,在 FOR 迴圈中執行 DEL 命令
FOR %%Z in (*.*) do DEL %%Z
這種形式的迴圈始終顯示已刪除檔案的列表(即使重定向到 NUL)。您可以透過以下方式實現 DEL 命令來避免不希望看到的訊息
ECHO Y | IF EXIST D:\TEMP\*.* DEL D:\TEMP\*.* > NUL
在上面的示例中,ECHO Y 命令提供了對查詢的自動響應,而 IF EXIST 條件存在的唯一原因是當指定的目錄 (D:\TEMP\) 最初為空時避免“找不到檔案”錯誤訊息。
- 注意
ERASE是與DEL命令相同的另一個有效名稱。- 具有屬性 R(只讀)、H(隱藏)、S(系統)和目錄的檔案無法使用 DEL 命令刪除。要刪除目錄,應改用
RD命令 (3.23)。 DEL .命令(字尾為點)等效於DEL *.*。DEL \命令(字尾為反斜槓)在當前磁碟的根目錄中刪除所有不受屬性保護的檔案。
在 MS-DOS 中,DIR(DIRectory)命令是探索目錄內容的主要工具。這是一個帶有 DIR 命令的命令列的示例
DIR C:\DOS /P /A:HS /O:GN /S /L /V
其中
C:\DOS |
– | 要探索的目錄的路徑示例。如果未指定,則隱含當前目錄。 | ||||||
/P |
– | 可選引數,在輸出資料的每螢幕滿後停止,直到使用者按下任意鍵。 | ||||||
/A:HS |
– | 一個引數,指定允許顯示具有特定屬性的專案:H(隱藏)、S(系統)、A(新檔案或已更改檔案,尚未儲存在存檔中)、R(只讀)、D(目錄)。可以使用字首“–”來反轉選擇:–H(除隱藏以外)、–D(除目錄以外)等等。/A 引數不帶後續屬性,強制顯示目錄中的所有專案。當省略 /A 引數時,不會顯示隱藏檔案和系統檔案。 | ||||||
/O:GN |
– | 顯示專案的排序順序規範:G – 首先是目錄、N – 按名稱(預設)、S – 按大小(最小者優先)、E – 按副檔名、D – 按日期和時間(最早者優先)、A – 按最後訪問日期(最早者優先)。可以使用字首“–”來反轉順序:–N – 按名稱(反向字母順序)、–S – 按大小(最大者優先)等等。 | ||||||
/S |
– | 一個可選引數,強制顯示子目錄的內容。 | ||||||
/L |
– | 一個可選引數,強制將顯示的檔名轉換為小寫,否則這些名稱將按原樣顯示。 | ||||||
/V |
– | 一個可選引數,導致顯示補充資料:屬性、最後訪問時間、分配的磁碟空間、總磁碟空間及其使用情況。其他引數優先於 /V,它們是
|
DIR 命令可用於顯示有關特定檔案或所有符合給定檔案掩碼的檔案的資訊
DIR *.txt /P /S /B
在後一個示例中,路徑規範的缺失與 /S 引數的組合意味著 DIR 命令實際上將在當前目錄及其所有子目錄中搜索 *.txt 檔案。如果當前目錄是根目錄,則搜尋將在整個當前磁碟中進行。如果您只對查詢遺忘的檔案感興趣,/B 引數將使結果更簡潔易懂。
DIR 命令的引數可以預設在 DIRCMD 環境變數中(例如,使用命令 SET DIRCMD= /P /S /B),然後您將預設獲得 DIR 命令的所需操作。如有必要,您可以在命令列中在其前面加上連字元“–”來覆蓋任何預設引數(例如,/–P)。
當 DIR 命令與 /A 引數一起執行時,*.* 檔案掩碼(所有檔案)不排除目錄。如果您只需要顯示檔案,則應該提供 /A: –D 引數。此功能使您可以探索目錄(或磁碟)是否為空。例如,考慮以下批處理檔案中的幾行
@echo off set DIRCMD=/a /b dir *.* > C:\Temp\Found.lst copy C:\Temp\Found.lst NUL | Find.exe "0 file" > nul if errorlevel 1 echo Current directory is NOT empty if not errorlevel 1 echo Current directory is empty
第二行指定引數,以便 DIR 命令在測試目錄為空時不顯示任何內容。第三行將 DIR 命令的輸出重定向到 FOUND.LST 檔案。第四行的 COPY 命令不會複製空檔案,在這種情況下會發出“複製了 0 個檔案”的訊息。FIND.EXE 實用程式透過重定向捕獲此訊息並將錯誤級別設定為零。接下來的兩行用於感知錯誤級別並顯示相應的條件響應。
當 DIR 命令在沒有 /W 或 /B 引數的情況下執行時,它可能會以兩種不同的方式顯示檔名,具體取決於作業系統環境。在 WINDOWS 作業系統的 DOS 視窗中,檔名會“按原樣”顯示,但在 MS-DOS 7 環境中,檔案及其後綴的名稱會分開顯示,檔名和字尾之間沒有點。此功能可用作簡單測試,以確定當前的操作環境。
- 注意
DIR \命令顯示根目錄中的所有檔案。- 在 DIR 命令顯示過程中,可以透過按 CTRL–S 或 BREAK 鍵來停止螢幕上輸出行的滾動;然後,在按任何其他鍵後,滾動將恢復。
3.11 ECHO – 透過 STDOUT 輸出字串
[edit | edit source]在 ECHO 命令名稱之後同一命令列中指定的詞語將作為訊息傳送到 STDOUT 通道;除非重定向,否則其預設終端點是 CON(控制檯)裝置,在螢幕上顯示訊息。ECHO 命令的字串輸出示例,特別是在上一篇文章 3.10 中有所顯示。
要顯示的訊息最多可以包含 123 個字元。實際的訊息長度受行本身或遇到的第一個重定向符號(2.04-02 – 2.04-05)限制。訊息字串可能包含 ASCII 服務標記,如附錄 A.02-8 中所示。但訊息字串不能為空或以 ON 或 OFF 開頭。這些和其他一些例外用於執行特殊功能
ECHO ON – 開啟 ECHO 標誌,允許在執行批處理檔案行時顯示它們(這是預設狀態)。 | ||
ECHO OFF – 關閉 ECHO 標誌(不顯示任何行)。在批處理檔案之外,這會導致命令提示符消失。 | ||
ECHO |
– | (沒有後面的訊息)顯示 ECHO 標誌的當前狀態。 |
ECHO= |
– | (附加等號)– 透過 STDOUT 通道傳送位元組 0Dh 0Ah,就像按下 ENTER 鍵一樣(文章 3.08 中的示例)。在螢幕上或檔案中,這會導致插入空行。 |
ECHO+ |
– | 透過 STDOUT 傳送位元組 0Dh 0Ah,但如果存在,也會發送加號後面的詞語,包括 ON 和 OFF。當 ECHO 命令附加斜槓或點時,它也會類似地起作用。 |
ECHO 標誌是本地標誌,保持其狀態直到批處理檔案共享公共環境,但此狀態不會被繼承,並且在命令直譯器建立派生(子)環境時重置為預設值。
在預設 ECHO ON 狀態下顯示的命令列與批處理檔案中的原始命令列不同:在顯示的行中,所有別名都替換為它們的值。這對於除錯很有用。但在檔案已證明沒有錯誤時,這不是必需的。因此,幾乎每個完成的批處理檔案都以 @ECHO OFF 命令開頭。ECHO 命令之前的“@”字元將阻止顯示該命令本身。
3.12 EXIT – 關閉當前直譯器會話
[edit | edit source]命令直譯器 COMMAND.COM (6.04) 是一個駐留程式,它為執行其他程式安排環境。另一方面,命令直譯器本身可以像普通程式一樣啟動,以安排一個單獨的(本地)環境,如果需要的話。在這種情況下,命令直譯器的多個駐留模組可以同時存在於記憶體中,但只有一個可以處於活動狀態 - 最後載入的那個。EXIT 命令關閉活動駐留模組的當前會話,釋放模組佔用的記憶體,並將控制權轉移到父程式(啟動了該駐留模組)。
噹噹前直譯器會話關閉時,其包含所有值和變數的本地環境將丟失。同時,父程式的先前環境將再次可訪問,並且該程式的執行將自動恢復。命令直譯器的第一個駐留模組由 IO.SYS 載入程式使用 SHELL 命令 (4.26) 在 CONFIG.SYS 檔案 (9.01-01) 中啟動。這個第一個駐留模組無法將控制權轉移到它的“父程式”,因為 IO.SYS 載入程式不是駐留的,並且已經完成了它的工作。如果命令直譯器的第一個駐留模組能夠執行 EXIT 命令,那麼計算機將掛起。為了防止這種情況發生,COMMAND.COM 直譯器必須第一次使用 /P 引數 (6.04) 啟動,這將停用 EXIT 命令。
3.13 FOR – 迴圈運算子
[edit | edit source]FOR 迴圈運算子安排其他命令的迴圈執行。例如,假設我們需要顯示三個簡短的檔案:First.txt、Second.txt 和 Third.txt。與其使用單獨的命令將這些檔案傳送到顯示,不如使用 FOR 運算子,可以在一行中完成相同的事情
FOR %Z IN (First Second Third) DO TYPE %Z.txt
其中
%Z |
– | 迴圈變數名稱的示例,它依次設定為括號中指定的每個專案。迴圈變數名稱不應以數字開頭。通常它是一個字母名稱,前面帶有一個百分號 ( % ),當迴圈從命令列執行時,或者帶有一個雙百分號 (%%),當迴圈從批處理檔案執行時。 |
IN |
– | 一個必需的保留字,引入括號中指定的變數值的以下列表。 |
DO |
– | 一個必需的保留字,引入以下要迴圈執行的命令的名稱,迴圈次數與為迴圈變數指定的數值一樣多。在每次迭代中,一個新值將替換迴圈變數的名稱。 |
括號中的專案可以是任何詞語,包括環境變數替換(例如 %TEMP%)和虛擬引數替換(2.03-03)。括號中的專案可以用空格、分號 ( ; ) 或逗號 ( , ) 分隔。請注意,PATH 變數值中的路徑是用分號分隔的,因此 PATH 的值將被 FOR 迴圈分解成一組單獨的路徑。此操作通常用於確定給定檔案是否可訪問,或為其提供顯式路徑規範。批處理檔案的以下部分顯示了一個典型的路徑確定示例
@echo off set P= FOR %%Y IN (. %PATH%) DO if exist %%Y\Fc.exe set P=%%Y\Fc.exe if %P%"==" echo Requested file hasn't been found! if not %P%"==" echo Path to the requested file is %P%
在這裡,第二行將輔助變數 P 賦值為空值,第三行將指定檔案的路徑賦值,如果該檔案恰好被找到。請注意,迴圈變數名稱 (%%Y) 字首有一個百分號對,因為在批處理檔案中必須這樣。最後兩行檢查輔助變數值的存在,並根據結果發出相應的訊息。
括號中的專案可以包含萬用字元 (2.01-03),但包含萬用字元的專案將被解釋為檔名,應在當前目錄中或根據前面的路徑(如果指定)搜尋。不隱含沿 PATH 變數中的所有路徑自動搜尋。括號中的幾個專案中的每一個都可以包含萬用字元,例如
FOR %%X IN (A:\*.txt A:\*.doc) DO COPY /B %%X C:\DOS
有時需要單獨顯示 FOR 迴圈內執行的每個操作,但不顯示迴圈本身。以下對前面示例的修改可以說明此機會
ECHO ON @FOR %%X IN (A:\*.txt A:\*.doc) DO COPY /B %%X C:\DOS @ECHO OFF
如果在括號中用萬用字元指定的檔案未找到,則相應的操作將被跳過,沒有任何錯誤訊息。這就是為什麼 FOR 迴圈有時被用作消除不希望出現的錯誤訊息的手段(請參閱 3.09 的示例)。FOR 迴圈的另一個“副作用”是它能夠解析環境變數的多詞值,並消除該值中單獨詞語之前或之後可能存在的額外空格。
在括號內,一個字串(包括分隔符)可以被視為一個專案,如果它被包含在雙引號中(缺少結束引號被視為錯誤)。雙引號本身不被視為屬於專案。這使得可以在一行中指定多個不同的命令,例如
FOR %%Z IN ("set E=%W%" "echo E is set" "goto L23") DO %%Z
有一些操作序列無法在單獨的行中執行,但可以在 FOR 迴圈內執行。此類序列的示例顯示在文章 9.03-02 中的批處理檔案的第 46 行,以及文章 9.01-03 中的批處理檔案的第 6 行。
在括號內,包含在雙引號中的命令可能包含變數值的替換(例如 %W%)、條件命令 (IF)、跳轉命令 (GOTO) 和重定向 (2.04-02 - 2.04-05)。當從 FOR 迴圈內跳轉到標籤時,將跳過下一個操作(如果存在,則放在右側)。FOR 迴圈內的重定向將其操作傳播到所有後續命令。例如,在迴圈中
For %%Z in ("echo 1st line >> Q.txt" "echo 2nd line") do %%Z
“第二行”這個詞不會顯示在螢幕上,而是會被追加到 Q.txt 檔案中。後續操作的重定向可以更改,但必須顯式指定。
FOR 迴圈從其引數中刪除包含雙引號的能力不僅對於執行命令至關重要,而且對於顯示訊息也至關重要,這些訊息受到雙引號保護,不會被解析。
不允許巢狀 FOR 迴圈,但內部 FOR 迴圈可以由命令直譯器 (COMMAND.COM) 的一個單獨的駐留模組執行,該模組本身在同一命令列中指定的外部 FOR 迴圈內啟動。如果在批處理檔案內使用 FOR 迴圈來執行另一個(輔助)批處理檔案,則該輔助批處理檔案可能包含它自己的內部 FOR 迴圈。
- 注意
- 迴圈變數的名稱必須選擇得當,以防止與當前使用的任何其他變數發生衝突。
- 在括號內,正斜槓 ( / ) 被視為分隔符,但任何以正斜槓開頭的單個專案將被附加到該斜槓並轉換為大寫(在早期的 DOS 版本中,斜槓的作用不同)。
- 嘗試重定向來自 FOR 迴圈的所有訊息只會影響該迴圈中的第一個操作。如果後續操作沒有顯式重定向,則它們將受預設設定控制。
- 當直譯器 COMMAND.COM 從命令列顯式啟動以執行 FOR 迴圈時,迴圈變數必須以雙百分號開頭,就像在批處理檔案中一樣。
3.14 GOTO – 跳轉到標籤
[edit | edit source]GOTO 命令在批處理檔案中執行跳轉到一個標籤,該標籤必須在同一個批處理檔案的任何一行中指定。帶標籤的行以冒號 ( : ) 開頭,冒號後跟任意標籤的名稱。GOTO 命令後必須指定相同的名稱。當標籤名稱很長時,只考慮前 8 個字元。同一個批處理檔案不允許有同義標籤。例如,如果批處理檔案中的某一行有一個標籤 `:L36`,那麼使用以下命令跳轉到該標籤:
GOTO L36
GOTO 命令可以在同一行中由條件運算子 IF (3.15) 提前。在文章 9.03-02、9.09-02 中可以找到許多條件跳轉和無條件跳轉的示例。
- 注意
- GOTO 命令後的標籤名稱可以透過變數名稱的替換來獲取(例如 %VAR%)。
- 虛擬引數 (%1, %2..) 的值不能用作 GOTO 命令後的標籤名稱,但它可以在任何前面的字母之後構成該名稱的一部分。
- GOTO 命令不影響 errorlevel,因此可以在跳轉後繼續執行 errorlevel 檢查。
條件運算子允許執行三種類型的條件檢查:存在檢查、相等檢查和 errorlevel 檢查。
帶有條件執行任何操作的命令列必須以條件運算子 IF 開頭,後面跟著條件型別定義、條件規範以及在滿足條件時應執行的命令的完整規範。
可以在一行中按順序寫入多個帶有獨立條件定義和規範的條件運算子,然後隱式地將邏輯運算子 AND 應用於獨立條件檢查的結果。文章 3.15-03、9.03-01、9.09-02 中展示了將多個條件檢查組合在一行的示例。下面將詳細介紹每種條件檢查的命令列的特殊組成方式。
存在條件檢查由 IF EXIST 命令執行,可以應用於檔案、目錄和邏輯裝置。存在條件的反轉——不存在條件檢查——由 IF NOT EXIST 命令執行。以下是存在檢查使用情況的兩個示例:
IF EXIST C:\DOS\Format.com C:\DOS\Format.com A: /S IF NOT EXIST C:\DOS\Format.com ECHO Format.com isn't found!
其中
EXIST |
– | 一個保留字,用於定義檢查型別並強制將後續元素解釋為要搜尋的物件的名稱或掩碼(可以帶有路徑)。 |
C:\DOS\Format.com – 要搜尋的檔名的示例;前面有路徑。此檔名將僅在指定的目錄中搜索。當省略路徑時,表示當前目錄。 | ||
C:\DOS\Format.com A: /S – 如果滿足前一個條件(檢查返回 TRUE),則要啟動的實用程式的示例。請注意,實用程式名稱後面應該跟著所有必要的引數。當沒有指定路徑時,將從當前目錄開始搜尋實用程式,然後沿著儲存在 PATH 變數值中的所有路徑搜尋。 | ||
NOT |
– | 一個保留字,表示檢查任何條件型別返回的結果(TRUE 或 FALSE)的邏輯反轉。 |
ECHO Format.com isn't found! – 另一個根據前一個條件執行的命令的示例(當未找到實用程式時)。 | ||
給定的示例可以在找到其正確位置時執行指定的實用程式(FORMAT.COM),或者在未找到此實用程式時顯示一個可理解的訊息。
邏輯裝置的名稱是保留字 (2.01-01),由 DOS 核心或驅動程式在載入過程中分配。透過對邏輯裝置名稱應用存在檢查,可以確定是否載入了特定驅動程式。使用 /D 引數啟動 MEM.EXE 實用程式 (6.17) 可以顯示您計算機中的邏輯裝置的完整列表。例如,EMM386.EXE (5.04-02) 驅動程式保留邏輯裝置名稱 EMMXXXX0。因此,可以使用以下行對該驅動程式進行載入檢查:
IF NOT EXIST EMMXXXX0 ECHO The EMM driver isn't loaded!
當您使用帶有萬用字元的檔案掩碼而不是要搜尋的實用程式名稱時,它將僅引用符合條件的檔案,而不引用目錄。當至少存在一個檔案(或多個檔案,3.09 中的示例)時,存在條件為 *.* 為真。為了檢查目錄是否存在,您應該在目錄名稱後面新增虛擬檔案 NUL 的名稱
IF EXIST C:\DOS\NUL ECHO The C:\DOS directory exists!
但是,顯示的目錄存在檢查可能會在 CD-ROM 上失敗,因為它們的檔案系統 (ISO 9660) 有特殊性。
通常需要提供批處理檔案的無停頓執行。存在檢查僅在可訪問的介質上提供無停頓執行:檔案或目錄可能不存在,但磁碟必須存在(必須插入)並且必須格式化為可供 MS-DOS 7 訪問的檔案系統(FAT12、FAT16、FAT32)或可透過安裝的驅動程式訪問。當不知道介質是否可訪問時,仍然可以執行存在檢查的無停頓執行,但需要採取特殊措施來防止關鍵錯誤處理程式呼叫 (8.02-84) 以及避免出現不希望的訊息(9.03-02 中的示例)。
相等條件檢查應用於兩個用雙等號 (==) 分隔的詞。由於比較先驗已知的詞沒有意義,因此相等條件意味著使用別名,別名可以是虛擬引數或變數值 (2.03-03)。允許在要比較的詞中使用萬用字元 (? 和 *),但它們被解釋為普通符號,不會擴充套件為萬用字元。與普通的 DOS 習慣做法相反,比較中的詞中的大寫和小寫字母不視為相等。以下是在批處理檔案中使用相等檢查的兩個示例:
IF %VAR%==%2 GOTO L23 IF NOT %VAR%==%2 GOTO HELP
其中
%VAR% |
– | 一個別名,將被環境變數 VAR 的值替換; |
%2 |
– | 一個別名(虛擬引數),將被批處理檔案的第二個引數的值替換; |
GOTO L23 – 如果 %VAR%= =%2 條件滿足,則要執行的命令; | ||
NOT |
– | 一個保留字,表示條件檢查返回的結果(TRUE 或 FALSE)的邏輯反轉; |
GOTO HELP – 如果 %VAR%= =%2 條件不滿足,則要執行的命令。 | ||
當然,可以直接指定要比較的任何一個詞,而無需使用別名。要比較的每個詞都可以將一個或多個別名與直接指定的詞部分組合。但是,不允許比較的詞為空:這被視為語法錯誤。由於任何批處理檔案都可以在沒有引數的情況下執行,因此必須準備好在其虛擬引數(上面的示例中為 %2 或其他任何引數)為空的情況下執行。解決此問題的最簡單方法是在等式左右兩側都新增一個特定的符號(例如,一個點):
IF %VAR%.==%2. GOTO L23 IF NOT %VAR%.==%2. GOTO HELP
這些相等檢查與上一個示例中的檢查相同,但不受別名為空值的影響。同樣的原理也用於檢查變數(或虛擬引數)的值是否為空:
IF .==%CASH%. ECHO The CASH variable has an empty value
當變數的值可能包含空格時,應格外小心。雙等號右側的詞在其值中不允許有空格。如果變數 CASH(在上面的示例中)的值包含空格,它將被解釋為語法錯誤。但是,雙等號左側的詞允許在其內部有空格。當此詞由多個用空格分隔的項組成時,只考慮第一個(最左邊的)項。以下三個示例說明了這一點(三個示例都是有效的)
IF NOT A: B: C:.==. ECHO Compared items are not equal IF .A: B: C:==.A: ECHO Compared items (.A: and .A:) are equal IF . B: C:==. ECHO Compared items (dots) are equal too
在這三個示例中,B: 和 C: 項的存在都被忽略了。
當 DOS 中任何實用程式的執行即將結束時,它可能會留下 errorlevel 程式碼,即一個訊息,傳遞給後續的演算法。Errorlevel 指示已終止的執行是否成功,如果沒有成功,則遇到了什麼型別的障礙。Errorlevel 是 DOS 可交換資料區 (A.01-03 中的偏移量 14h) 中的 8 位二進位制程式碼,但它以十進位制數 (從 0 到 255) 表示(沒有符號)。Errorlevel 0 表示成功終止,其他 errorlevel 值通常表示不同型別的錯誤,針對每個實用程式進行具體解釋。
Errorlevel 條件由 ERRORLEVEL 關鍵字的存在來識別。它提供了一個機會來檢查 errorlevel 程式碼是否等於或大於指定的十進位制數,例如:
IF ERRORLEVEL 1 ECHO Execution has failed IF NOT ERRORLEVEL 1 ECHO Execution has terminated successfully
上面示例第一行中的檢查對於從 1 到 255 的所有 errorlevel 值(即,對於所有可能的失敗結果)返回 TRUE。第二行中的檢查包含保留字 NOT,這就是它充當邏輯反轉的原因,對於低於 1 的 errorlevel 返回 TRUE,即,對於單個值 0(表示成功終止)返回 TRUE。
當您需要對單一型別的錯誤結果執行單獨的過程時,可以連線 errorlevel 檢查。例如,假設在 errorlevel 為 15 的情況下,您需要執行到 ERROR15 標籤的跳轉。這可以透過以下命令列實現:
IF NOT ERRORLEVEL 16 IF ERRORLEVEL 15 GOTO ERROR15
上面行中的第一個檢查對於從 0 到 15 的所有 errorlevel 返回 TRUE,第二個檢查對於從 15 到 255 的所有 errorlevel 返回 TRUE。因此,errorlevel 15 是唯一允許執行後續 GOTO 命令的 errorlevel 值。
- 注意
- 一些實用程式使用非零 errorlevel 程式碼來指示正常(非錯誤)結果的不同情況。
- 所有內部命令 (3.01 - 3.34) 都不返回也不更改 errorlevel 程式碼。
- 允許以與上面顯示的兩個 errorlevel 檢查相同的方式將多個存在檢查、相等檢查和 errorlevel 檢查混合在一起。
3.16 LFNFOR – 長檔名顯示模式
[edit | edit source]LFNFOR 是一個未公開的本地開關,可以設定為 ON (LFNFOR ON) 或 OFF (LFNFOR OFF)。在沒有引數的情況下使用 LFNFOR 命令會顯示該開關的狀態。它的預設狀態為 OFF。在“裸”MS-DOS 7 中,LFNFOR 的狀態會被忽略,但在 Windows 作業系統下的 DOS 盒子中,將 LFNFOR 設定為 ON 會使 FOR 命令 (3.13) 對長檔名進行非截斷處理,例如:
FOR %%Z in (*.*) do echo %%Z
當 LFNFOR 設定為 OFF 時,FOR 命令會將長檔名截斷為 8 個字元,就像它在 MS-DOS 7 中一直做的那樣。
3.17 LH – 載入到傳統記憶體之外
[edit | edit source]LH 命令 (LH = Load High) 將驅動程式和 TSR 實用程式載入到具有 80386 或更高處理器的計算機的傳統記憶體 640kb 邊界之外。訪問 640kb 邊界之外的記憶體必須透過在 CONFIG.SYS 檔案中使用命令 DOS=UMB (4.08) 並載入記憶體管理器來提前啟用:HIMEM.SYS 驅動程式 (5.04-01) 然後是 EMM386.EXE (5.04-02) 或 UMBPCI.SYS (5.04-04) 驅動程式。在這兩種情況下,對由 LH 命令載入的 TSR 模組的訪問都將透過地址空間的 UMB 區域 (640–1024kb) 進行。當 UMB 區域沒有更多可用空間時,LH 命令不會發出錯誤訊息,並繼續將驅動程式和 TSR 實用程式載入到 640kb 以下的傳統記憶體中。
LH 的作用類似於 INSTALLHIGH 命令 (4.16);主要區別在於 INSTALLHIGH 命令由 IO.SYS 載入器執行,不能參與記憶體最佳化過程 (5.04-03)。LH 命令由 COMMAND.COM 直譯器從普通命令列執行,或(最好)從 AUTOEXEC.BAT 檔案中的行執行。以下是一個 AUTOEXEC.BAT 檔案中的一行的示例,其中 LH 命令用於載入 MSCDEX.EXE 驅動程式
LH /L:1,23680 \DOS\DRV\Mscdex.exe /D:CD1 /E /S /V /L:O /M:32
驅動程式名稱之前是一個路徑 (\DOS\DRV\),它可以採用任何允許的形式 (2.02-01)。如果省略路徑,將從當前目錄以及 PATH 變數值 (2.02-02) 中指定的所有路徑中搜索驅動程式。驅動程式名稱後面的所有內容都不會被 LH 命令識別,而是作為特定引數傳遞給驅動程式。
在 LH 命令名稱和要載入的軟體規範之間,可能有一個可選的 /L 引數,它提供了一種方法來指出 USB 記憶體區域的特定部分,該部分應專門用於訪問每個 TSR 模組 (另見 4.07)。在上面的示例中,該引數看起來像 /L:1,23680,其中 /L:1 表示透過 UMB 區域的第一部分定址,數字 23680 是 MSCDEX.EXE 驅動程式的 TSR 模組所需的空間大小(以位元組為單位)。
/L 引數後的尺寸規範是可選的,但當指定尺寸時,LH 命令可以接受一個額外的引數 /S,例如
LH /L:1,2160 /S \DOS\COM\Escape.com
/S 引數表示分配的 UMB 塊應該被截斷到指定的尺寸。這會導致地址空間的最高效使用,但不保證在尺寸規範不完全正確的情況下不會崩潰。不建議在記憶體最佳化實用程式 MEMMAKER.EXE (5.04-03) 執行的記憶體最佳化過程之外使用 /S 引數。在此過程中,/L 和 /S 引數以及精確的尺寸規範將自動插入所有包含 LH 命令的 AUTOEXEC.BAT 檔案行中。
- 注意
- 如果透過 UMBPCI.SYS 驅動程式 (5.04-04) 打開了傳統記憶體之外的訪問,則 LH 命令將 TSR 模組載入到 UMB 記憶體區域 (640–1024kb) 中。但 EMM386.EXE 驅動程式 (5.04-02) 的作用不同:它調整處理器的地址轉換表 (TLB),以便透過相同的地址空間 UMB 區域訪問 1088kb 之外的記憶體。這就是為什麼在後一種情況下,相同的 LH 命令實際上不會將 TSR 模組載入到 UMB 區域中,而是載入到 1088kb 之外的其他位置。
3.18 LOCK – 禁止併發訪問
[edit | edit source]MS-DOS 7 控制著各種程式對磁碟訪問的請求,以確保正確的訪問順序和有效的緩衝。需要直接訪問磁碟的程式必須透過 INT 13\AH=45h 中斷 (8.01-58) 與 MS-DOS 7 協調其操作。但有些程式沒有這樣做,例如,MS-DOS6.22 版本中用於恢復已刪除檔案的 UNDELETE.EXE 程式。為了允許此類程式執行其工作,MS-DOS 7 中的 COMMAND.COM 直譯器提供了 LOCK 命令。它會賦予下一個將要啟動的程式對請求的磁碟的獨佔訪問許可權。
LOCK 命令的引數是一個或多個要獲得獨佔處理的磁碟的字母名稱。在執行 LOCK 命令期間,系統會要求您從鍵盤上確認 (Y 或 N)。為了避免在批處理檔案中進行確認操作,您必須預先準備一個響應,例如
ECHO Y | LOCK C: D:
顯示的命令列的結果將是下一個將要啟動的程式對磁碟 C: 和 D: 的獨佔無中斷訪問。當該程式終止時,應透過 UNLOCK 命令 (3.31) 關閉磁碟的鎖定狀態。由於直接訪問操作可以巢狀,因此最多允許 256 個鎖定級別。當然,每個參與的程式都必須由適當的 LOCK 和 UNLOCK 命令序列支援。
3.19 MD – 建立目錄
[edit | edit source]MD 命令允許建立新的目錄或子目錄,例如
MD C:\DOS\ARC
其中
C:\DOS\ |
– | 一個指向現有目錄的路徑示例,新子目錄應該在此處建立 |
ARC |
– | 要建立的新的唯一子目錄名稱的示例。此名稱後面的反斜槓是不允許的。 |
新的唯一名稱是必需的引數,但前面的路徑是可選的。如果省略它,則將在當前磁碟的當前目錄中建立新的(子)目錄。
- 注意
- MKDIR 是相同 MD 命令的另一個有效名稱。
3.20 PATH – 搜尋路徑(es)規範
[edit | edit source]PATH 命令定義了搜尋沒有指定路徑且不在當前目錄中的程式的預設路徑。PATH 命令指定的路徑構成了同義環境變數 PATH 的值。它的值也可以透過 SET 命令 (3.26) 定義。但存在一個重要的區別:與 SET 命令不同,PATH 命令會自動將指定路徑中的所有字元轉換為大寫(否則搜尋過程可能會出錯)。PATH 命令必須後跟一個或多個現有路徑,用分號分隔,例如
PATH C:\DOS\VC4;C:\DOS\MS7;C:\WINDOWS\COMMAND
PATH 命令將任意單詞轉換為大寫字面的能力有時用於在進行區分大小寫的相等性檢查時避免歧義。
- 注意
- 在路徑規範字符串中,每個分號分隔符兩側都不得有空格。
- 路徑規範字符串的末尾不得有分號。
- 沒有後續引數的 PATH 命令僅顯示定義的路徑,並保持不變。
- PATH ; 命令(僅後跟一個分號)會刪除所有先前定義的路徑。
- PATH 命令名稱可以透過空格或等號 ( = ) 與後面的路徑規範字符串分隔。
3.21 PAUSE – 臨時停止
[edit | edit source]PAUSE 命令在批處理檔案的一行中遇到時,會停止執行該批處理檔案,並顯示訊息“按任意鍵繼續...” 。此訊息並不完全正確,因為 CTRL-C、CTRL-BREAK 和 ALT-03 鍵組合會終止執行,從而繞過批處理檔案的所有剩餘行(此操作不依賴於 BREAK 狀態)。當 PAUSE 的訊息不需要時,它可以被重定向。
PAUSE > NUL
PAUSE 命令後面可以緊跟一個註釋字串,就像 REM 命令一樣。除非設定了 ECHO 標誌(3.11),否則不會顯示此註釋。
當“CTTY NUL”命令(3.07)停止與控制檯的預設通訊時,PAUSE 命令必須進行顯式輸入重定向。
PAUSE < CON
在批處理檔案中,將 03h 符號(顯示為 ©,見 A.02-8)重定向到 PAUSE 命令提供了最短的方式來立即退出批處理檔案的執行,沒有任何暫停。
ECHO ©| PAUSE > NUL
可以使用 ALT-03 鍵將符號 03h 插入命令列,數字應在按住 ALT 鍵的同時透過數字鍵盤輸入。但不要嘗試使用前面的 REM 命令(3.24)停用此行:只有 ECHO 命令會被停用,重定向的符號不會被 PAUSE 命令接收,計算機將掛起。
3.22 PROMPT – 提示符規範
[edit | edit source]PROMPT 命令重新定義了同義環境變數 PROMPT 的值,該變數指定了 DOS 命令提示符的形式。通常,PROMPT 命令寫在 AUTOEXEC.BAT 檔案的一行中,但也可以從普通命令列中輸入。PROMPT 名稱後面應該跟著建議的提示符文字。在此文字中,以美元符號 ($) 開頭的字元對以特殊方式解釋,並被替換為其他無法直接寫入提示符文字的資料。以下是字元對與替換資料之間對應關係的表格。
| $Q | 等號 (=) |
$$ |
單個美元符號 ($) |
$T |
當前時間 |
$D |
當前日期 |
$P |
當前磁碟的字母名稱和當前目錄的路徑 |
$V |
Windows 版本號 |
$N |
當前磁碟的字母名稱 |
$G |
右箭頭(或大於)符號 (>) |
$L |
左箭頭(或小於)符號 (<) |
$B |
豎線(或管道)符號 (|) |
$H |
08h 程式碼“退格鍵”(A.02-8) |
$_ |
回車符 (0Dh) 和換行符 (0Ah) |
$E |
程式碼 1Bh “轉義鍵”(A.02-8) |
不帶引數的 PROMPT 命令會刪除 PROMPT 變數,然後 DOS 提示符會顯示當前磁碟的字母名稱,後跟右箭頭符號 (>),這與命令 PROMPT $N$G 後的提示符相同。預設情況下,MS-DOS 7 將另一個值(PROMPT $P$G)分配給 PROMPT 變數,這對應於最常見的命令提示符形式:當前目錄的完整路徑,後跟右箭頭符號。
提示符顯示的資料可以寫入檔案,然後作為環境變數的值分配。考慮以下批處理檔案行的示例。
prompt @echo off$_Set Ret$q$p C:\Command.com /c Ret.bat > Ret.bat Call Ret.bat
上面的示例中的第一行設定了提示符的複雜形式,第二行將此提示符寫入新的批處理檔案 RET.BAT。得到的 RET.BAT 檔案的內容可能如下所示。
@echo off Set Ret=D:\BACKUP
請注意,提示符引數“Set Ret$q$p”已轉換為“Set Ret=D:\BACKUP”,其中“D:\BACKUP”是執行批處理行時當前磁碟的字母名稱和實際當前路徑的示例。如果使用 CALL 命令(3.02)執行 RET.BAT 檔案,則實際完整路徑將被寫入環境變數 RET 的值中。之後,您可以刪除 RET.BAT 檔案,並在需要返回到先前磁碟和目錄時使用 RET 變數。
%Ret%\ CD %Ret%
文章 9.01-03 展示了 PROMPT 命令用於獲取當前磁碟字母名稱的另一個示例。當前時間、日期和作業系統版本號可以以類似的方式寫入環境變數。
3.23 RD – 刪除目錄
[edit | edit source]RD 命令(刪除目錄)可以刪除目錄,前提是滿足以下條件。
- 要刪除的目錄為空;
- 該目錄存在於可寫磁碟上;
- 該目錄不是磁碟的根目錄;
- 該目錄不是其磁碟上的當前目錄,即使所定址的磁碟不是當前磁碟。
以下是一個 RD 命令使用示例。
RD D:\TEMP\NOTES
其中
註釋 |
– | 是要刪除的目錄的名稱; |
D:\TEMP\ |
– | 是要刪除的目錄的路徑示例。路徑可以以任何允許的形式(2.02-01、2.02-03)指定,或者可以省略。如果省略了路徑,則表示當前目錄的子目錄。 |
- 注意
- RMDIR 是相同 RD 命令的另一個有效名稱。
3.24 REM – 註釋行
[edit | edit source]REM 命令(REMark)強制 COMMAND.COM 直譯器忽略同一命令列中後面的所有字元,直到遇到任何最近的重定向符號(2.04-02 - 2.04-05)或行末為止。REM 命令的主要任務是提供在批處理檔案中插入註釋行的機會。註釋在一行中最多可以有 123 個字元。REM 命令用於註釋,這些註釋在正常執行批處理檔案時不應顯示,而應僅在使用 ECHO 標誌(3.11)跟蹤時顯示。
REM 命令有時用於停用批處理檔案中的可執行行,但它不能停用重定向。雙冒號“::”(2.04-01)更適合此目的。REM 的另一個任務是“空”命令,它被認為是有效的並被正式執行,但什麼也不做(參見 6.25-03 中的 VCEDIT.EXT 示例)。
由於 REM 命令不會向 STDOUT 通道傳送任何輸出,因此重定向
REM > Anyfile.ext
用於建立指定名稱的空檔案。如果同義檔案已存在,則將被覆蓋並變為空。用零長度檔案覆蓋真實檔案會擦除目錄規範中其第一個簇的地址。因此,用零長度檔案覆蓋的檔案無法透過 UNDELETE.EXE 或其他類似實用程式恢復。
- 注意
- REM 命令不應用於停用具有中間重定向(2.04-05)的命令列。REM 命令只停用此行中的第一個命令,其輸出不會發送,並且命令列其餘部分中的命令永遠不會收到預期的資料。因此,計算機可能會掛起(文章 3.21 中的示例)。
- 在 Windows 作業系統的“DOS 視窗”中,不會執行空重定向,因此,不能使用 REM 命令建立零長度檔案。
3.25 REN – 重新命名檔案
[edit | edit source]REN 命令(REName)可以重新命名一個檔案或多個檔案,前提是它們的名稱符合某個掩碼。以下是一個使用 REM 命令重新命名一個檔案的示例。
REN C:\DOS\Notes.txt Notes.old
其中
C:\DOS\ |
– | 是要重新命名的檔案的路徑示例;路徑可以以任何允許的形式(2.02-01、2.02-03)指定,也可以省略。 |
Notes.txt – 要重新命名的檔案的當前名稱。 | ||
Notes.old – 要重新命名的相同檔案的新的名稱示例;新的名稱必須在沒有字首路徑的情況下指定,即使要重新命名的檔案存在於當前目錄以外的任何其他位置。 | ||
只在第一個(舊)名稱中指定萬用字元是允許的,但通常會導致錯誤:嘗試在一個目錄中建立多個同義檔案。因此,建議在舊檔名和新檔名中相同的位置指定萬用字元,以便保留每個檔名的唯一特徵。萬用字元隱藏的字元將不會改變。假設有一組檔案 Part_01.txt - Part_12.txt 要重新命名為 Chap_01.txt - Chap_12.txt。此操作透過一條命令執行。
REN Part_??.txt Chap_??.txt
- 注意
- 具有 H(隱藏)屬性的目錄和檔案不能透過 REN 命令重新命名。
- 重新命名檔案的屬性保持不變。
3.26 SET – 為變數賦值
[edit | edit source]如果 SET 命令沒有指定引數,它將顯示當前環境的所有變數及其值。但是,如果 SET 命令的名稱後面緊跟著任何單詞,則該單詞將被解釋為應分配新值的 環境變數的名稱,例如
SET TEMP=D:\Temp
其中
TEMP |
– | 是變數名稱的示例; |
D:\Temp |
– | 是將分配給變數 TEMP 的值。值規範中禁止使用等號和重定向符號 (2.04-02 – 2.04-05)。 |
- 注意
- 等號右側的任何空格,在有效字元之間、有效字元之前或之後(直到行尾標記),都將包含在變數的值中。
- 如果等號右側的部分為空,則指定的變數將被刪除(將不再存在)。
- SET 命令能夠擴充套件環境空間,當它不足以容納變數的新值時。
- 在批處理檔案中,等號右側的值可以包含其他變數名稱的替換(例如,
%VAR%)和虛擬引數 (2.03-03) 的替換。在定義新變數之前,所有這些別名將被替換為它們的值。 - CONFIG.SYS 檔案行中同義詞命令 SET (4.25) 由 IO.SYS 載入程式解釋。後者不執行替換和重定向,但這樣它就能夠在變數的值中包含相應的符號。
3.27 SHIFT – 虛擬引數順序移位
[edit | edit source]SHIFT 命令將批處理檔案中虛擬引數 (2.03-03) 的數字順序移位 -1(負一),因此以前的 %0 會丟失,以前的 %1 變成 %0,以前的 %2 變成 %1,等等。重要的是要注意,成為第 9 個的虛擬引數以前是第 10 個,無法訪問。因此,SHIFT 命令為批處理檔案提供了指定超過 9 個虛擬引數並按順序訪問它們的可能性,從一次迭代到下一次迭代移動它們的編號。DISK.BAT 檔案第 29-38 行中的子例程展示了這種編號移位的示例,該檔案位於文章 9.03-02 中。當移位的地址順序到達引數序列的末尾時,最後一個虛擬引數將變為空,這將終止包含 SHIFT 命令的整個迴圈的執行。
3.28 TIME – 時間顯示和重置
[edit | edit source]為了設定新時間,需要在命令列中 TIME 命令的名稱後面指定該新時間,例如
TIME 11:39:23,24
其中連續的數字表示小時、分鐘、秒和秒的百分之一。顯示的時間規範中的分隔符是冒號和逗號,但這取決於 COUNTRY 命令 (4.05) 設定的國家/地區約定。
當沒有指定時間時,將顯示當前時間,然後會提示您透過鍵盤輸入新時間。如果您不想更改時間,只需按 ENTER 鍵來響應提示即可。
為了將文字檔案追加時間簽名,應使用 TIME 命令,例如以下方式
ECHO= | TIME | Find.exe "Current" >> Anyfile.txt
這裡第一個重定向 (ECHO= | TIME) 自動響應顯示的提示並啟用不間斷操作,第二個重定向 (TIME | Find.exe) 排除不必要的輸出行,第三個重定向 (>> Anyfile.txt) 將時間簽名追加到指定檔案中。當然,執行重定向 (2.04-05) 和查詢檔案 (FIND.EXE 和要追加的檔案) 的所有條件都應該滿足。
3.29 TRUENAME – 路徑和名稱的規範形式
[edit | edit source]給定檔案的相對規範,TRUENAME 將返回其完整名稱及其絕對路徑,此外,所有字母都將轉換為大寫,正斜槓將轉換為反斜槓,星號 (2.01-03) 將轉換為相應數量的問號,長名稱將截斷為 8 個字元,長字尾將轉換為 3 個字元。
如果原始規範指出了由工具 ASSIGN.COM、JOIN.EXE 或 SUBST.EXE 編排的假路徑,則 TRUENAME 命令將返回真實路徑。當不使用後續規範時,TRUENAME 命令將返回當前目錄的完整路徑,就像 CD 命令 (3.03) 一樣。
- 注意
- TRUENAME 命令不顯示錯誤訊息。
- 除非安裝了 LAN 驅動程式,否則 TRUENAME 命令不能應用於網路路徑。
- TRUENAME 命令的操作基於 INT 21\AH=60h (8.02-72)。
3.30 TYPE – 將檔案讀取到 STDOUT
[edit | edit source]TYPE 命令讀取指定檔案的內容,並將其逐行傳送到 STDOUT 通道,該通道的預設終結點是 CON 裝置(顯示)。傳送可以透過 CTRL-C 或 CTRL-BREAK 鍵擊終止,或者透過按下 CTRL S 或 BREAK 鍵暫停,然後透過任何其他鍵擊恢復。用法示例
TYPE C:\DOS\Notes.txt
其中
Notes.txt – 要顯示的檔案的名稱示例;TYPE 命令不允許在名稱中使用萬用字元。 | ||
C:\DOS\ |
– | 是 要顯示的檔案的路徑示例;路徑可以採用任何允許的格式 (2.02-01、2.02-03) 或省略。在後一種情況下,該檔案隱含地存在於當前目錄中。 |
TYPE 命令的輸出可以重定向,例如,重定向到連線到 LPT1 埠的印表機
TYPE A:\Config.sys > PRN
TYPE 命令通常與 MORE.COM 檢視器 (6.19) 一起使用,後者逐頁顯示長 STDOUT 訊息。
3.31 UNLOCK – 併發訪問許可權
[edit | edit source]在已使用 LOCK 命令 (3.18) 授予磁碟直接訪問許可權的程式終止後,應使用 UNLOCK 命令恢復原始訪問狀態,該命令應用於相同的磁碟,例如
UNLOCK C:
實際上,UNLOCK 命令不允許多個併發訪問,而是將禁止併發訪問的巢狀禁止級別計數減少 1。因此,提供了對巢狀程式呼叫的適當處理。但是,如果原始禁止級別是 1,則 UNLOCK 命令將重新啟用對磁碟訪問請求的佇列。這在多工作業系統環境中很重要,例如在 Windows95/98 作業系統下的“DOS 視窗”中。如果磁碟最初沒有被鎖定,則 UNLOCK 命令不會執行任何操作。在任何情況下都不會顯示訊息。
3.32 VER – 作業系統版本顯示
[edit | edit source]在 MS-DOS 7 和 MS-DOS 8 中,VER 命令 (VERsion) 顯示相應的 WINDOWS 軟體版本的版本號。提供 /R 引數後
VER /R
VER 命令將版本訊息追加到關於 DOS 核心是否載入到高記憶體區域的備註。
3.33 VERIFY – 驗證功能控制
[edit | edit source]VERIFY 命令在不帶引數的情況下啟動,指示驗證功能的狀態,該功能定義是否應該重新讀取每個寫入的檔案並將其與原始檔案進行比較。預設情況下,驗證功能處於關閉狀態,並且不執行驗證。可以使用 VERIFY ON 或 VERIFY OFF 命令更改驗證功能的狀態(有關詳細資訊,請參閱 8.02-60 的註釋 2)。
- 注意
- 現代硬碟的高可靠性使得驗證變得不必要,它會導致時間損失和過度磁碟磨損。最好僅將 COPY 命令 (3.06) 的
/V引數初始化為僅複製到軟盤的檔案。 - VERIFY 功能充當全域性開關:當命令直譯器的當前駐留模組完成其工作並且本地環境丟失時,它不會丟失其狀態。
3.34 VOL – 磁碟標籤和序列號
[edit | edit source]磁碟標籤是由使用者選擇的最多 11 個字元的字串。如果使用者在格式化時未定義標籤,則該磁碟將獲得 NO NAME 標籤。之後,可以使用 LABEL.EXE 實用程式 (6.16) 或某些 TSR shell(Norton Commander、Volkov Commander 等)更改磁碟標籤。
序列號是一個 8 位十六進位制識別符號,在格式化過程中自動分配給磁碟。如果磁碟的生產技術採用磁接觸複製格式化,則磁碟可能沒有序列號。相反,在普通複製過程中,磁碟副本會從原始磁碟繼承標籤和序列號。
為了顯示特定磁碟的標籤和序列號,您需要在同一命令列中,在 VOL (= VOLume) 命令的名稱後面指定其字母名稱,例如
VOL A:
如果省略磁碟的字母名稱,則將顯示當前磁碟的卷標和序列號。