在 FreeDOS 上使用 BAT 文件自動(dòng)執(zhí)行任務(wù)
FreeDOS 下批處理文件的實(shí)用指南。
即使你以前沒有使用過 DOS,你也可能知道它的命令行 shell,即 COMMAND.COM
。它已經(jīng)成為 DOS 的同義詞,F(xiàn)reeDOS 為此也實(shí)現(xiàn)了一個(gè)類似的 shell,稱為 “FreeCOM”,但也命名為 COMMAND.COM
,就像在其他 DOS 系統(tǒng)上一樣。
但是 FreeCOM shell 可以做的不僅僅是為你提供一個(gè)命令行提示符讓你在其中運(yùn)行命令,如果你需要在 FreeDOS 上自動(dòng)執(zhí)行任務(wù),你可以使用 批處理文件,也稱為 “BAT 文件”,因?yàn)檫@些腳本使用 .BAT
擴(kuò)展名。
批處理文件可能比你在 Linux 編寫的腳本要簡單得多。因?yàn)樵诤芫靡郧?,這個(gè)功能最初被添加到 DOS 時(shí),它是為了讓 DOS 用戶“批量處理”某些命令。它的條件分支沒有太大的靈活性,也不支持更高級(jí)的功能,例如算術(shù)擴(kuò)展、標(biāo)準(zhǔn)輸出和錯(cuò)誤消息的重定向、后臺(tái)進(jìn)程、測試、循環(huán)(這項(xiàng)支持)和 Linux 腳本中常見的其他結(jié)構(gòu)。
本文是 FreeDOS 下批處理文件的實(shí)用指南。記住通過用百分號(hào)(%
)包裹變量名稱來引用環(huán)境變量,例如 %PATH%
。但是,請注意,由于歷史原因,FOR
循環(huán)的構(gòu)造略有不同。
打印輸出
批處理文件可能需要向用戶打印消息,讓用戶知道發(fā)生了什么。使用 ECHO
語句打印消息。例如,一個(gè)批處理文件可能使用以下語句表明它已完成了任務(wù):
ECHO Done
ECHO
語句不需要引號(hào)。FreeCOM ECHO
語句不會(huì)以任何特殊方式處理引號(hào),它會(huì)像普通文本一樣打印它們。
通常,F(xiàn)reeDOS 在執(zhí)行批處理文件時(shí)會(huì)打印每一行。這在一個(gè)非常短的批處理文件中通常不是問題,它只為用戶定義了幾個(gè)環(huán)境變量。但是對于執(zhí)行更多工作的較長批處理文件而言,批處理行的這種一直顯示可能會(huì)變得很麻煩。要阻止此輸出,在 ECHO
語句中使用 OFF
關(guān)鍵字,如下所示:
ECHO OFF
使用 ON
關(guān)鍵字在 FreeDOS 運(yùn)行時(shí)恢復(fù)顯示批處理行。
ECHO ON
大多數(shù)批處理文件在第一行包含一個(gè) ECHO OFF
語句,以阻止消息,但是 shell 在執(zhí)行語句時(shí)仍然會(huì)在屏幕上打印 ECHO OFF
。為了隱藏該語句,批處理文件通常在前面使用 @
符號(hào)。這樣,任何以這個(gè)特殊字符開頭的行都不會(huì)打印,即使打開了 ECHO
。
@ECHO OFF
注釋
編寫較長批處理文件時(shí),大多數(shù)程序員都喜歡使用 注釋 來提醒自己這個(gè)批處理文件的用途。在批處理文件中注釋,使用 REM
(remark)關(guān)鍵字。REM
之后的任何內(nèi)容都會(huì)被 FreeCOM shell 忽略。
@ECHO OFF
REM This is a comment
執(zhí)行“輔助”批處理文件
通常,F(xiàn)reeCOM 一次只運(yùn)行一個(gè)批處理文件。但是,你可能需要使用另一個(gè)批處理文件來執(zhí)行其他操作,例如為多個(gè)批處理文件設(shè)置公共環(huán)境變量。
如果你從"正在運(yùn)行"的批處理文件中直接調(diào)用第二個(gè)批處理文件,F(xiàn)reeCOM 將完全切換到第二個(gè)批處理文件,并停止處理第一個(gè)。要改為在第一個(gè)批處理文件“內(nèi)部”運(yùn)行第二個(gè)批處理文件,你需要告訴 FreeDOS shell 使用 CALL
關(guān)鍵字去 調(diào)用 第二個(gè)批處理文件。
@ECHO OFF
CALL SETENV.BAT
條件分支
批處理文件確實(shí)支持使用 IF
語句的簡單條件分支。它有三種基本形式:
- 測試上一條命令的返回狀態(tài)
- 測試一個(gè)變量是否等于一個(gè)值
- 測試文件是否存在
IF
語句的一個(gè)常見用途是測試程序是否成功返回。如果它們正常運(yùn)行,大多數(shù)程序?qū)⒎祷亓阒担蛘咴诔霈F(xiàn)錯(cuò)誤時(shí)返回一些其他值。在 DOS 中,這稱為 錯(cuò)誤級(jí)別,這是 IF
測試的特例。
測試名為 MYPROG
的程序是否成功退出,實(shí)際上是檢查程序是否返回“零”。使用 ERRORLEVEL
關(guān)鍵字來測試特定值。例如:
@ECHO OFF
MYPROG
IF ERRORLEVEL 0 ECHO Success
使用 ERRORLEVEL
測試錯(cuò)誤級(jí)別是檢查程序退出狀態(tài)的笨拙方法。檢查 DOS 程序的不同返回值,更有用的方法是使用 FreeDOS 為你定義的特殊變量,稱為 ERRORLEVEL
。它存儲(chǔ)了最近執(zhí)行程序的錯(cuò)誤級(jí)別,然后你可以使用 ==
測試不同的值。
你可以使用 ==
和 IF
語句來測試變量是否等于某個(gè)值。就像一些編程語言,你可以使用 ==
直接比較兩個(gè)值。通常,在一側(cè)引用一個(gè)環(huán)境變量,在另一側(cè)引用一個(gè)值,但你也可以比較兩個(gè)變量的值以查看它們是否相同。例如,你可以使用此批處理文件重寫上面的 ERRORLEVEL
代碼:
@ECHO OFF
MYPROG
IF %ERRORLEVEL%==0 ECHO Success
IF
語句的另一個(gè)常見用途是測試文件是否存在,如果存在則采取操作。你可以使用 EXIST
關(guān)鍵字來測試。例如,要?jiǎng)h除名為 TEMP.DAT
的臨時(shí)文件,你可以在批處理文件中使用以下行:
@ECHO OFF
IF EXIST TEMP.DAT DEL TEMP.DAT
對于任何 IF
語句,你都可以使用 NOT
關(guān)鍵字來 否定 測試。在文件 不 存在時(shí)打印消息,你可以這樣寫:
@ECHO OFF
IF NOT EXIST TEMP.DAT ECHO No file
分支執(zhí)行
利用 IF
測試的一種方法是跳轉(zhuǎn)到批處理文件中完全不同的部分,這取決于 IF
測試的結(jié)果。在最簡單的情況下,如果一個(gè)關(guān)鍵命令失敗,你可能希望跳到批處理文件的末尾。或者,如果某些環(huán)境變量設(shè)置不正確,你可能想要執(zhí)行其他語句。
你可以使用 GOTO
指令跳轉(zhuǎn)到批處理文件的其他部分。它會(huì)跳轉(zhuǎn)到批處理文件中稱為 標(biāo)簽 的特定行。注意,這是一個(gè)嚴(yán)格的 “go-to” 跳轉(zhuǎn):批處理文件執(zhí)行將在新標(biāo)簽處啟動(dòng)。
假設(shè)程序需要一個(gè)現(xiàn)有的空文件來存儲(chǔ)臨時(shí)數(shù)據(jù),如果文件不存在,則需要在運(yùn)行程序之前創(chuàng)建一個(gè)文件。你可以將這些動(dòng)作添加到批處理文件中,這樣你的程序始終有一個(gè)臨時(shí)文件可供使用:
@ECHO OFF
IF EXIST temp.dat GOTO prog
ECHO Creating temp file...
TOUCH temp.dat
:prog
ECHO Running the program...
MYPROG
當(dāng)然,這是一個(gè)非常簡單的例子。對于這種情況,你可以重寫批處理文件,將創(chuàng)建臨時(shí)文件作為 IF
語句的一部分:
@ECHO OFF
IF NOT EXIST temp.dat TOUCH temp.dat
ECHO Running the program...
MYPROG
迭代
如果你需要對一組文件執(zhí)行相同的任務(wù)怎么辦?你可以使用 FOR
循環(huán) 迭代 一組文件。這是一個(gè)單行循環(huán),每次使用不同的文件運(yùn)行單個(gè)命令。
FOR
循環(huán)對迭代變量使用一種特殊的語法,它的用法與其他 DOS 環(huán)境變量不同。要循環(huán)編輯一組文本文件,可以使用以下語句:(LCTT 譯注:原文此處寫錯(cuò)了,少寫了一個(gè) %
)
@ECHO OFF
FOR %%F IN (*.TXT) DO EDIT %%F
注意,如果在命令行中運(yùn)行此循環(huán),而不是在批處理文件中,那么迭代變量僅需要指定一個(gè)百分號(hào)(%
):
C:\> FOR %F IN (*.TXT) DO EDIT %F
命令行處理
在運(yùn)行批處理文件時(shí),F(xiàn)reeDOS 提供了一種簡單的方法來檢測用戶可能提供的命令行選項(xiàng)。FreeDOS 解析命令行輸入,并將前九個(gè)選項(xiàng)存儲(chǔ)在特殊變量 %1
、%2
..... 等中,直到 %9
。注意,無法通過這種方式直接訪問第十一個(gè)(及之后)選項(xiàng)。特殊變量 %0
存儲(chǔ)批處理文件的名稱。
如果你的批處理文件需要處理 9 個(gè)以上的選項(xiàng),你可以使用 SHIFT
語句移除第一個(gè)選項(xiàng),并將每個(gè)選項(xiàng)向下 移動(dòng) 一個(gè)值。所以第二個(gè)選項(xiàng)變成了 %1
,第十個(gè)選項(xiàng)變成了 %9
。
大多數(shù)批處理文件只需要移動(dòng)一個(gè)值。但是,如果你需要以其他增量進(jìn)行移位,可以將參數(shù)提供給 SHIFT
語句。例如:
SHIFT 2
下面是一個(gè)簡單的批處理文件,演示了移位操作:
@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
執(zhí)行帶有十個(gè)選項(xiàng)的批處理文件顯示了 SHIFT
語句如何重新排列命令行選項(xiàng),因此批處理文件現(xiàn)在可以用 %9
訪問第十個(gè)參數(shù):
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>