在 FreeDOS 上使用 BAT 文件自動執行任務
即使你以前沒有使用過 DOS,你也可能知道它的命令行 shell,即 COMMAND.COM
。它已經成為 DOS 的同義詞,FreeDOS 為此也實現了一個類似的 shell,稱為 「FreeCOM」,但也命名為 COMMAND.COM
,就像在其他 DOS 系統上一樣。
但是 FreeCOM shell 可以做的不僅僅是為你提供一個命令行提示符讓你在其中運行命令,如果你需要在 FreeDOS 上自動執行任務,你可以使用 批處理文件,也稱為 「BAT 文件」,因為這些腳本使用 .BAT
擴展名。
批處理文件可能比你在 Linux 編寫的腳本要簡單得多。因為在很久以前,這個功能最初被添加到 DOS 時,它是為了讓 DOS 用戶「批量處理」某些命令。它的條件分支沒有太大的靈活性,也不支持更高級的功能,例如算術擴展、標準輸出和錯誤消息的重定向、後台進程、測試、循環(這項支持)和 Linux 腳本中常見的其他結構。
本文是 FreeDOS 下批處理文件的實用指南。記住通過用百分號(%
)包裹變數名稱來引用環境變數,例如 %PATH%
。但是,請注意,由於歷史原因,FOR
循環的構造略有不同。
列印輸出
批處理文件可能需要向用戶列印消息,讓用戶知道發生了什麼。使用 ECHO
語句列印消息。例如,一個批處理文件可能使用以下語句表明它已完成了任務:
ECHO Done
ECHO
語句不需要引號。FreeCOM ECHO
語句不會以任何特殊方式處理引號,它會像普通文本一樣列印它們。
通常,FreeDOS 在執行批處理文件時會列印每一行。這在一個非常短的批處理文件中通常不是問題,它只為用戶定義了幾個環境變數。但是對於執行更多工作的較長批處理文件而言,批處理行的這種一直顯示可能會變得很麻煩。要阻止此輸出,在 ECHO
語句中使用 OFF
關鍵字,如下所示:
ECHO OFF
使用 ON
關鍵字在 FreeDOS 運行時恢復顯示批處理行。
ECHO ON
大多數批處理文件在第一行包含一個 ECHO OFF
語句,以阻止消息,但是 shell 在執行語句時仍然會在屏幕上列印 ECHO OFF
。為了隱藏該語句,批處理文件通常在前面使用 @
符號。這樣,任何以這個特殊字元開頭的行都不會列印,即使打開了 ECHO
。
@ECHO OFF
注釋
編寫較長批處理文件時,大多數程序員都喜歡使用 注釋 來提醒自己這個批處理文件的用途。在批處理文件中注釋,使用 REM
(remark)關鍵字。REM
之後的任何內容都會被 FreeCOM shell 忽略。
@ECHO OFF
REM This is a comment
執行「輔助」批處理文件
通常,FreeCOM 一次只運行一個批處理文件。但是,你可能需要使用另一個批處理文件來執行其他操作,例如為多個批處理文件設置公共環境變數。
如果你從"正在運行"的批處理文件中直接調用第二個批處理文件,FreeCOM 將完全切換到第二個批處理文件,並停止處理第一個。要改為在第一個批處理文件「內部」運行第二個批處理文件,你需要告訴 FreeDOS shell 使用 CALL
關鍵字去 調用 第二個批處理文件。
@ECHO OFF
CALL SETENV.BAT
條件分支
批處理文件確實支持使用 IF
語句的簡單條件分支。它有三種基本形式:
- 測試上一條命令的返回狀態
- 測試一個變數是否等於一個值
- 測試文件是否存在
IF
語句的一個常見用途是測試程序是否成功返回。如果它們正常運行,大多數程序將返回零值,或者在出現錯誤時返回一些其他值。在 DOS 中,這稱為 錯誤級別,這是 IF
測試的特例。
測試名為 MYPROG
的程序是否成功退出,實際上是檢查程序是否返回「零」。使用 ERRORLEVEL
關鍵字來測試特定值。例如:
@ECHO OFF
MYPROG
IF ERRORLEVEL 0 ECHO Success
使用 ERRORLEVEL
測試錯誤級別是檢查程序退出狀態的笨拙方法。檢查 DOS 程序的不同返回值,更有用的方法是使用 FreeDOS 為你定義的特殊變數,稱為 ERRORLEVEL
。它存儲了最近執行程序的錯誤級別,然後你可以使用 ==
測試不同的值。
你可以使用 ==
和 IF
語句來測試變數是否等於某個值。就像一些編程語言,你可以使用 ==
直接比較兩個值。通常,在一側引用一個環境變數,在另一側引用一個值,但你也可以比較兩個變數的值以查看它們是否相同。例如,你可以使用此批處理文件重寫上面的 ERRORLEVEL
代碼:
@ECHO OFF
MYPROG
IF %ERRORLEVEL%==0 ECHO Success
IF
語句的另一個常見用途是測試文件是否存在,如果存在則採取操作。你可以使用 EXIST
關鍵字來測試。例如,要刪除名為 TEMP.DAT
的臨時文件,你可以在批處理文件中使用以下行:
@ECHO OFF
IF EXIST TEMP.DAT DEL TEMP.DAT
對於任何 IF
語句,你都可以使用 NOT
關鍵字來 否定 測試。在文件 不 存在時列印消息,你可以這樣寫:
@ECHO OFF
IF NOT EXIST TEMP.DAT ECHO No file
分支執行
利用 IF
測試的一種方法是跳轉到批處理文件中完全不同的部分,這取決於 IF
測試的結果。在最簡單的情況下,如果一個關鍵命令失敗,你可能希望跳到批處理文件的末尾。或者,如果某些環境變數設置不正確,你可能想要執行其他語句。
你可以使用 GOTO
指令跳轉到批處理文件的其他部分。它會跳轉到批處理文件中稱為 標籤 的特定行。注意,這是一個嚴格的 「go-to」 跳轉:批處理文件執行將在新標籤處啟動。
假設程序需要一個現有的空文件來存儲臨時數據,如果文件不存在,則需要在運行程序之前創建一個文件。你可以將這些動作添加到批處理文件中,這樣你的程序始終有一個臨時文件可供使用:
@ECHO OFF
IF EXIST temp.dat GOTO prog
ECHO Creating temp file...
TOUCH temp.dat
:prog
ECHO Running the program...
MYPROG
當然,這是一個非常簡單的例子。對於這種情況,你可以重寫批處理文件,將創建臨時文件作為 IF
語句的一部分:
@ECHO OFF
IF NOT EXIST temp.dat TOUCH temp.dat
ECHO Running the program...
MYPROG
迭代
如果你需要對一組文件執行相同的任務怎麼辦?你可以使用 FOR
循環 迭代 一組文件。這是一個單行循環,每次使用不同的文件運行單個命令。
FOR
循環對迭代變數使用一種特殊的語法,它的用法與其他 DOS 環境變數不同。要循環編輯一組文本文件,可以使用以下語句:(LCTT 譯註:原文此處寫錯了,少寫了一個 %
)
@ECHO OFF
FOR %%F IN (*.TXT) DO EDIT %%F
注意,如果在命令行中運行此循環,而不是在批處理文件中,那麼迭代變數僅需要指定一個百分號(%
):
C:> FOR %F IN (*.TXT) DO EDIT %F
命令行處理
在運行批處理文件時,FreeDOS 提供了一種簡單的方法來檢測用戶可能提供的命令行選項。FreeDOS 解析命令行輸入,並將前九個選項存儲在特殊變數 %1
、%2
..... 等中,直到 %9
。注意,無法通過這種方式直接訪問第十一個(及之後)選項。特殊變數 %0
存儲批處理文件的名稱。
如果你的批處理文件需要處理 9 個以上的選項,你可以使用 SHIFT
語句移除第一個選項,並將每個選項向下 移動 一個值。所以第二個選項變成了 %1
,第十個選項變成了 %9
。
大多數批處理文件只需要移動一個值。但是,如果你需要以其他增量進行移位,可以將參數提供給 SHIFT
語句。例如:
SHIFT 2
下面是一個簡單的批處理文件,演示了移位操作:
@ECHO OFF
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
ECHO Shift by one ..
SHIFT 1
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
執行帶有十個選項的批處理文件顯示了 SHIFT
語句如何重新排列命令行選項,因此批處理文件現在可以用 %9
訪問第十個參數:
C:SRC>args 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
Shift by one ..
2 3 4 5 6 7 8 9 10
C:SRC>
via: https://opensource.com/article/21/6/automate-tasks-bat-files-freedos
作者:Jim Hall 選題:lujun9972 譯者:MjSeven 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive