Linux中國

在 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 語句的簡單條件分支。它有三種基本形式:

  1. 測試上一條命令的返回狀態
  2. 測試一個變數是否等於一個值
  3. 測試文件是否存在

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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國

    Linux中國

    捐贈 Let's Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...