BAT 批次檔

MS-DOS 與 Windows 作業系統,可以使用副檔名為 *.bat 的純文字文件格式,來編寫命令,讓系統執行工作。內容除了可以執行 DOS 命令外,還提供些許存取系統資料與邏輯控制等功能。在不方便使用 Java 或 C 語言來執行程式功能的場合,改用 BAT 批次檔來完成工作,不失為有效的解決方案。


檔案格式

批次檔必須使用 CR+LF 換行,否則無法順利執行多行指令。

Windows 作業系統預設使用在地字元編碼的關係,批次檔建議使用 Big5 或 ANSI 字元編碼,比較不會遭遇問題。若要使用 UTF-8 編碼,必須在開頭執行 CHCP 65001 指令。


輸出訊息

ECHO 訊息

用來輸出自己想要顯示出來的訊息。


隱藏指令執行時輸出的訊息

@

DOS 命令在執行時,會顯示過程中產生的訊息。如果不想看到這樣的訊息,可用 @ 表示這行程式不顯示過程訊息。


關閉指令執行時輸出的訊息

ECHO OFF

所有程式都不顯示過程訊息。

通常連 ECHO OFF 這行程式也不希望顯示過程訊息,因此會在前面加上 @,變成 @ECHO OFF。


輸出空行

@ECHO;


暫停

PAUSE

程式停止執行,等待使用者按任意鍵再繼續。


尋訪

FOR %%變數 IN (篩選) DO 指令 [參數]

FOR 指令與其說是迴圈,不如說是用來尋訪檔案。變數保存的是尋訪的檔案名稱。

篩選的寫法像是 (*.mp4 *.mkv),沒有篩選條件的話用萬用字元 (*)。

底下範例會開啟批次檔所在資料夾下所有 *.txt 檔案:

FOR %%n IN (*.txt) DO %%n


跳躍

跳到特定位置,執行其後的程式。


設定跳躍點

:標題


跳躍

GOTO 標題


最常見的用法是設定 :end 做為批次檔的結尾,然後在批次檔已經完成任務時,就可以跳過接下來的程式,直接結束工作。


條件


檢查資料

IF 變數==資料


檢查資料夾或檔案是否存在

IF EXIST 資料夾或檔案


檢查批次檔接受到的數值資料

IF ERRORLEVEL 數值


反向條件

IF 後面可用 NOT 作相反條件的判斷。


分歧條件

IF 判斷式 (執行功能) ELSE (執行功能)

注意!ELSE 與前面的 ) 符號不能斷行!

也因此,為了讓批次檔的分歧條件式,能夠更像結構化程式語言的 if else,可以採用如下的編寫風格:

IF 判斷式 (
 執行功能
) ELSE (
 執行功能
)

甚至多數人覺得,在批次檔使用 GOTO,反而比 IF ELSE 容易閱讀。(不過 GOTO 比較不好寫,因為用「下一行」取代 ELSE 的情況下,要更花費心力,才能安排好執行流程。)


暫停幾秒

TIMEOUT /T 秒數


輸入

SET /P 變數名稱=說明文字


詢問

CHOICE

會詢問 Y/N。

其後應搭配 IF %ERRORLEVEL%==1 判斷使用者選的是 Y,或者 IF %ERRORLEVEL%==2 選的是 N。

CHOICE 還允許自定更多選項,例如:

CHOICE /C NESW /M "N=北 E=東 S=南 W=西"
IF %ERRORLEVEL%==1 ECHO 往北走了
IF %ERRORLEVEL%==2 ECHO 往東走了
IF %ERRORLEVEL%==3 ECHO 往南走了
IF %ERRORLEVEL%==4 ECHO 往西走了


參數

接在批次檔後面的參數,可用 %1%9 來取得。

%1 是帶入的檔案的話:

%~D1磁碟機代號
%~P1路徑
%~N1檔名
%~X1副檔名
%~NX1檔名與副檔名

變數

取一個識別名稱,保存程式中所要用到的資料,以便讀取。


設定變數

SET 變數名稱=資料


讀取變數

%變數名稱%
%變數名稱:~開始位置,擷取字數%


系統環境變數

Windows 作業系統已經內定許多環境變數,可以方便我們設計批次檔時,更簡單、明確進行想要的操作目標:

%APPDATA%使用者家目錄的 AppData 的 Roaming 資料夾。
%CD%當前路徑。
%DATE%日期。
%HOMEDRIVE%使用者家目錄所在磁碟機的代號。
%HOMEPATH%使用者家目錄的資料夾路徑,不含磁碟機代號。
%PROGRAMFILES%系統 Program Files 資料夾的路徑。
%PROGRAMFILES(X86)%系統 Program Files (x86) 資料夾的路徑。
%RANDOM%隨機取得 0 到 32767 之間的整數。
%SYSTEMDRIVE%安裝作業系統的磁碟機代號。
%SYSTEMROOT%安裝作業系統的資料夾。
%TEMP%暫存檔 temp 資料夾的路徑。
%TIME%時間。
%USERNAME%使用者帳號名稱。
%USERPROFILE%使用者家目錄完整路徑。

綜合範例

SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
TAR -cf MyBackup-%MONTH%%DAY%.tar D:\MyBackup
@ECHO %TIME%
PAUSE


呼叫外部批次檔

CALL 批次檔

執行另一個批次檔,然後繼續往下一個流程執行。


結束批次檔

EXIT


結束正在執行的程式

TASKKILL /IM 程序名稱
TASKKILL /PID 處理程序識別碼


一行內執行多道指令

使用 & 符號。


多行指令寫成一道指令

() 符號括住。


註解

REM 註解文字

不會被批次檔執行,適合用來說明程式意圖,方便往後閱讀程式碼。


配色

COLOR 背景顏色和前景顏色

0 黑色
1 藍色
2 綠色
3 藍綠色
4 紅色
5 紫色
6 黃色
7 淺灰色
8 深灰色
9 淡藍色
A 淡綠色
B 淡藍綠色
C 淡紅色
D 淡紫色
E 淡黃色
F 白色

兩個顏色要連在一起,例如:

COLOR F1


視窗大小

MODE CON COLS=寬度 LINES=高度

單位分別是字元數和行數,不是像素。


視窗標題

TITLE 標題


免命令提示字元視窗執行應用程式

START "" 程式
START /D 路徑 程式


說明

各指令的更完整功能,請用 HELP 指令 查閱。


釘選到工作列或開始畫面

為批次檔建立捷徑,然後在圖示按「滑鼠右鍵」→「內容」,修改「目標」,在前面加上 CMD /C 即可。