bat檔案詳解

來源:互聯網
上載者:User

自從作業系統誕生以來,批處理就是最重要的功能之一,但在Windows大行其道的今天,批處理這個概念對普通使用者而言已經越來越遠,但不可否認,作為開發人員,這是必須要掌握的技能之一。在Linux系統下,批處理通過shell指令碼完成,而在windows平台下,批處理的檔案尾碼為.bat。bat檔案其實就是dos命令的集合,但許多dos命令都被廢棄了,今天就來講解一下bat檔案中使用的那些命令與bat檔案的基本寫法。
基礎命令 echo

這是最基礎的顯示命令,將其後的內容顯示在命令列,後面一般可以跟字串、變數等,基本和Linux中的echo命令相同:

echo "Hello,My First Bat."

在實際應用中我們會把這條命令和重新導向符號(也稱為管道符號,一般用> >> ^)結合來實現輸入一些命令到特定格式的檔案中。而在bat檔案頭,一般使用echo off語句表示後面的命令列不再顯示。該語句一般和@聯合使用,@用於命令之前,表示當前命令列不顯示,但僅僅適用於當前行。所以,一般我們所見的bat檔案第一行如下:

@echo off
call

顧名思義,本命令用於調用外部bat檔案,用法位call+【檔案名稱】。如果不用call而直接調用別的批次檔,那麼執行完那個批次檔後將無法返回當前檔案並執行當前檔案的後續命令。

call a.txt
rem

注釋,有些類似於C語言中的//,後面的內容不會執行,只是用於閱讀源碼時參考。 cd

chdir的簡寫,相信使用過命令列的人都不會陌生,用於切換路徑。有一些特殊的符號需要掌握一下,以下是基本用法:

rem 假設目前的目錄為根目錄C盤,其中有my、your兩個檔案夾,F盤有his檔案夾rem 進入my檔案夾cd myrem /表示根目錄,從my進入yourcd /yourrem 返回上次目錄cd -rem 返回上級目錄cd ..rem 返回根目錄cd . rem 或者cd /rem 切換到F盤中的his,記住\d 不能省略cd \d D:/his
pause

顧名思義,該目錄暫停程式執行,運行此句會暫停批處理的執行並在螢幕上顯示Press any key to continue…的提示,等待使用者按任意鍵後繼續。 start

調用外部程式,所有的DOS命令和命令列程式都可以由start命令來調用。
常用參數:
MIN 開始時視窗最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程式
HIGH 在 HIGH 優先順序類別開始應用程式
REALTIME 在 REALTIME 優先順序類別開始應用程式
WAIT 啟動應用程式並等候它結束
parameters 這些為傳送到命令/程式的參數

執行的應用程式是32位GUI應用程式時,CMD.EXE不等應用程式終止就返回命令提示。如果在命令指令碼內執行,該新行為則不會發生。 choice

choice 使用此命令可以讓使用者輸入一個字元(用於選擇),從而根據使用者的選擇返回不同的errorlevel,然後於if errorlevel配合,根據使用者的選擇運行不同的命令。
注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令文法會稍有不同,請用choice /?查看用法。
choice參數列表如下:
參數列表:
/C choices 指定要建立的選項列表。預設列表是 “YN”。
/N 在提示符中隱藏選項列表。提示前面的訊息得到顯示,選項依舊處於啟用狀態。
/CS 允許選擇分大小寫選項。在預設情況下,這個工具是不分大小寫。
/T timeout做出預設選擇之前,暫停秒數可接受的值是從0到9999。如果指定了0,就不會有暫停,預設選項會得到選擇。
/D choice 在 nnnn 秒之後指定預設選項。字元必須在用 /C選項指定的一組選擇中;同時,必須用/T指定 nnnn。
/M text 指定提示之前要顯示的訊息。如果沒有指定,工具只顯示提示。
/? 顯示協助訊息。

choice /C YNC /M "確認請按Y,否請按N,或者取消請按C。"choice /T 10 /C ync /CS /D ychoice /C ab /M "選項1請選擇a,選項2請選擇 b。"choice /C ab /N /M "選項1請選擇a,選項2請選擇b。
goto

指定跳轉到標籤,找到標籤後,程式將處理從下一行開始的命令。goto命令因為它的一些特性在不少進階語言中變得臭名昭著,但在指令碼語言中還是很有必要的。

if {%1}=={} goto noparms if {%2}=={} goto noparms(如果這裡的if、%1、%2你不明白的話,先跳過去,後面會有詳細的解釋。) :noparms echo Usage: monitor.bat ServerIP PortNumber goto end
if

if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。有三種格式:
1. if “參數” == “字串”  待執行的命令
參數如果等於指定的字串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)

if "%1"=="a" format a: if {%1}=={} goto noparms if {%2}=={} goto noparms 
if exist 檔案名稱 待執行的命令
如果有指定的檔案,則條件成立,運行命令,否則運行下一句。
if exist config.sys edit config.sys 
if errorlevel / if not errorlevel 數字 待執行的命令
如果返回碼等於指定的數字,則條件成立,運行命令,否則運行下一句。
if errorlevel 2 goto x2  

程式運行時都會返回一個數字,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼為0、1。 for

for命令是一個比較複雜的命令,主要用於參數在指定的範圍內迴圈執行命令。在批次檔中使用for命令時,指定變數請使用 %%variable。其實也就和進階程式語言中的for大同小異,其文法如下:
for %variable IN (set) DO command [command-parameters]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組檔案。可以使用萬用字元。
command 指定對每個檔案執行的命令。
command-parameters 為特定命令指定參數或命令列開關。

好了,基本上常用的命令也就這麼多了,dos命令其實還很多,如set、|、shift等等,總之,要想寫好bat檔案,命令的熟悉是必不可少的。 在bat中使用變數

任何語言中變數都是必不可少的,bat檔案中當然也是如此。說完了基礎命令,接下來就讓我們說說如何在bat檔案中使用變數吧。
%[1-9]表示參數,參數是指在運行批次檔時在檔案名稱後加的以空格(或者Tab)分隔的字串。變數可以從%0到%9,%0表示批處理命令本身,其它參數字串用%1到%9順序表示。
如果現在有一批次檔t.bat在C盤根目錄下,內容如下:

@echo off type %1 type %2 

那麼在命令列輸入C:/>t a.txt b.txt 運行,%1就表示a.txt,%2就表示b.txt,其他參數順延。 一個例子說明

當然要學號任何語言,光靠看文法是無濟於事的,必須要分析來源程式,最好是那些使用廣泛的來源程式。為了方便講解,我從tomcat7中取出了批次檔startup.bat並以注釋的方式寫上一些說明,方便大家學習。

@echo offrem 建立目前的目錄的環境變數set "CURRENT_DIR=%cd%"rem 判斷tomcat安裝目錄的環境變數是否正確,若正確,轉到gotHomeif not "%CATALINA_HOME%" == "" goto gotHomerem 若不正確,把目前的目錄設定為軟體根目錄set "CATALINA_HOME=%CURRENT_DIR%"rem 判斷是否存在catalina.bat批次檔,存在,轉到okHome,否則返回上級目錄if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomerem 返回上級目錄並將軟體根目錄設為該目錄cd ..set "CATALINA_HOME=%cd%"rem 開啟目前的目錄cd "%CURRENT_DIR%"rem gotHome模組:gotHomeif exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programgoto endrem gotHome模組結束rem okHome模組:okHomeset "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"rem Check that target executable existsif exist "%EXECUTABLE%" goto okExececho Cannot find "%EXECUTABLE%"echo This file is needed to run this programgoto endrem okHome模組結束:okExecrem Get remaining unshifted command line arguments and save them in theset CMD_LINE_ARGS=:setArgsrem 判斷命令列參數是否存在if ""%1""=="""" goto doneSetArgsset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1shiftgoto setArgs:doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS%:end

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.