基本信息
批處理檔案是無格式的文本檔案。在命令提示下鍵入批處理檔案的名稱,或者雙擊該批處理檔案,系統就會調用Cmd.exe按照該檔案中各個命令出現的順序來逐個運行它們。使用批處理檔案(也被稱為批處理程式或腳本),可以簡化日常或重複性任務。批處理的本質,是一堆DOS命令按一定順序排列而形成的集合。
批處理,也稱為批處理腳本,英文譯為BATCH,批處理檔案後綴BAT就取的前三個字母。它的構成沒有固定格式,只要遵守以下這條就ok了:每一行可視為一個命令,每個命令里可以含多條子命令,從第一行開始執行,直到最後一行結束,它運行的平台是DOS。批處理有一個很鮮明的特點:使用方便、靈活,功能強大,自動化程度高。
它有什麼用呢?
比如,在啟動wps軟體時,每次都必須執行
C:\>cdwps
C:\WPS>spdos
C:\WPS>py
C:\WPS>wbx
C:\WPS>wps
如果每次用WPS之前都這樣執行一次,您是不是覺得很麻煩呢?
如果有一個方法,只需編寫一個批處理檔案,就會自動執行剛才的所有命令,您想不想學呢?
當您看完此節,自己編寫的第一個批處理檔案順利執行時,您一定會大吃一驚的。
此外電腦每次啟動時都會尋找autoexec.bat這條批處理檔案,從而可執行一些每次開機都要執行的命令,如設定路徑path、載入滑鼠驅動mouse、磁碟加速smartdrv等,可以使您的電腦真正自動化。
echo、@、call、pause、rem是批處理檔案最常用的幾個命令,我們就從他們開始學起。echo表示顯示此命令後的字元
echooff表示在此語句後所有運行的命令都不顯示命令行本身
@與echooff相象,但它是加在其它命令行的最前面,表示運行時不顯示命令行本身。
call調用另一條批處理檔案(如果直接調用別的批處理檔案,執行完那條檔案後將無法執行當前檔案後續命令)
pause運行此句會暫停,顯示Pressanykeytocontinue...等待用戶按任意鍵後繼續
rem表示此命令後的字元為解釋行,不執行,只是給自己今後查找用的
例:用edit編輯a.bat檔案,輸入下列內容後存檔為c:\a.bat,執行該批處理檔案後可實現:將根目錄中所有檔案寫入a.txt中,啟動UCDOS,進入WPS等功能。
檔案內容
批處理檔案的內容為:檔案表示:echooff不顯示命令行
dirc:\*.*>a.txt將c盤檔案列表寫入a.txt
callc:\ucdos\ucdos.bat調用ucdos
echo你好顯示"你好"
pause暫停,等待按鍵繼續
rem使用wps注釋將使用wps
cducdos進入ucdos目錄
wps使用wps
批處理檔案中還可以像C語言一樣使用參數,這只需用到一個參數表示符%。
%表示參數,參數是指在運行批處理檔案時在檔案名稱後加的字元串。變數可以從%0到%9,%0表示檔案名稱本身,字元串用%1到%9順序表示。
例如,C:根目錄下一批處理檔案名稱為f.bat,內容為format%1
則如果執行C:\>fa:則實際執行的是formata:
又如C:根目錄下一批處理檔案的名為t.bat,內容為type%1type%2
那么運行C:\>ta.txtb.txt將順序地顯示a.txt和b.txt檔案的內容
ifgotochoicefor是批處理檔案中比較高級的命令,如果這幾個你用得很熟練,你就是批處理檔案的專家啦。
if表示將判斷是否符合規定的條件,從而決定執行不同的命令。有三種格式:
1、if"參數"=="字元串"待執行的命令
參數如果等於指定的字元串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)
如if"%1"=="a"formata:
2、ifexist檔案名稱待執行的命令
如果有指定的檔案,則條件成立,運行命令,否則運行下一句。如ifexistconfig.syseditconfig.sys
3、iferrorlevel數字待執行的命令
如果返回碼等於指定的數字,則條件成立,運行命令,否則運行下一句。如iferrorlevel2gotox2DOS程式運行時都會返回一個數字給DOS,稱為錯誤碼errorlevel或稱返回碼
goto批處理檔案運行到這裡將跳到goto所指定的標號處,一般與if配合使用。如:
gotoend
:end
echothisistheend
標號用:字元串表示,標號所在行不被執行
choice使用此命令可以讓用戶輸入一個字元,從而運行不同的命令。使用時應該加/c:參數,c:後應寫提示可輸入的字元,之間無空格。它的返回碼為1234……
如:choice/c:dmedefrag,mem,end
將顯示
defrag,mem,end[D,M,E]?
例如,test.bat的內容如下:
@echooff
choice/c:dmedefrag,mem,end
iferrorlevel3gotodefrag應先判斷數值最高的錯誤碼
iferrorlevel2gotomem
iferrotlevel1gotoend
:defrag
c:\dos\defrag
gotoend
:mem
mem
gotoend
:end
echogoodbye
此檔案運行後,將顯示defrag,mem,end[D,M,E]?用戶可選擇dme,然後if語句將作出判斷,d表示執行標號為defrag的程式段,m表示執行標號為mem的程式段,e表示執行標號為end的程式段,每個程式段最後都以gotoend將程式跳到end標號處,然後程式將顯示goodbye,檔案結束。
for循環命令,只要條件符合,它將多次執行同一命令。
格式FOR[%%f]in(集合)DO[命令]
只要參數f在指定的集合內,則條件成立,執行命令
如果一條批處理檔案中有一行:
for%%cin(*.bat*.txt)dotype%%c
含義是如果是以bat或txt結尾的檔案,則顯示檔案的內容。
autoexec.bat
DOS在啟動會自動運行autoexec.bat這條檔案,一般我們在裡面裝載每次必用的程式,如:path(設定路徑)、smartdrv(磁碟加速)、mouse(滑鼠啟動)、mscdex(光碟機連線)、doskey(鍵盤管理)、set(設定環境變數)等。
如果啟動盤根目錄中沒有這個檔案,電腦會讓用戶輸入日期和時間。
例如,一個典型的autoexec.bat內容如下:
@echooff不顯示命令行
prompt$p$g設定提示符前有目錄提示
pathc:\dos;c:\;c:\windows;c:\ucdos;c:\tools設定路徑
lhc:\dos\doskey.com載入鍵盤管理
lhc:\mouse\mouse.com載入滑鼠管理
lhc:\dos\smartdrv.exe載入磁碟加速管理
lhc:\dos\mscdex/S/D:MSCD000/M:12/V載入CD-ROM驅動
settemp=c:\temp設定臨時目錄
常用命令
echo命令
打開回顯或關閉請求回顯功能,或顯示訊息。如果沒有任何參數,echo命令將顯示當前回顯設定。語法
echo[{on|off}][message]
Sample:@echooff/echohelloworld
在實際套用中我們會把這條命令和重定向符號(也稱為管道符號,一般用>>>^)結合來實現輸入一
些命令到特定的檔案中。
@命令符
@與echooff功能相似,但它是加在其他命令行的最前面,表示運行時不顯示命令行本身。舉例:
----------------------------------------------------------------------------------------------------
@echooff
@echoNowinitializingtheprogram,pleasewaitaminite...
@formatX:/q/u/autoset//format命令不可以使用/y參數,但可以使用autoset這個
//參數,效果和y是一樣的
----------------------------------------------------------------------------------------------------
call命令
call命令用於從一個批處理程式調用另一個批處理程式,而不終止父批處理程式。call命令提示接受用作調用目標的標籤。如果再腳本或批處理檔案外使用call命令,則其不會在命令行起作用。語法:
call[[Drive:][Path]FileName[Bathparameters]][:labe][Arguments]]
參數:
[Drive:][Path]FileName
指定要調用的批處理程式的位置和名稱。FileName參數必須有.bat或.cmd擴展名。
Batchparameters
指定批處理程式所需的任何命令行信息,包括命令行選項、檔案名稱、批處理參數(即從%0到%9)或變數(例如,%baud%)。
:Label
指定批處理程式要跳轉到的標籤。使用帶有該參數的call命令,可以創建新的批處理檔案上下文,並將控制權交給指定標籤後的語句。首先遇到該處理檔案的末尾時(在跳轉到標籤後),控制權將交還給call語句後的語句。第二次遇到批處理檔案的末尾時,將推出批處理腳本。
Arguments
對於以:Label開始的批處理程式,指定要傳遞給其新實例的所有命令行信息,包括命令行選項、檔案名稱、批處理參數(即從%1到%9)或變數(例如,%baud%)。
舉例:
要從其他批處理程式運行checknew.bat程式,請在父批處理程式中輸入以下命令:
----------------------------------------------------------------------------------------------------
callchecknew
----------------------------------------------------------------------------------------------------
如果父批處理程式接受兩個批處理參數並且希望將這些參數傳遞給checknew.bat,則可以在父批處理程式中使用以下命令:
----------------------------------------------------------------------------------------------------
callchecknew%1%2
----------------------------------------------------------------------------------------------------
rem命令
注釋命令,類似於在C語言中的/*--------*/,它並不會被執行,只是起一個注釋的作用,便於別人閱讀和你自己日後修改。
::也具有rem的功能
RemMessage
Sample:@RemHereisthedescription.
pause命令
暫停命令。運行Pause命令時,將顯示下面的訊息:Pressanykeytocontinue...(或:請按任意鍵繼續...)
Sample:
@echooff
:begin
copyG:*.*d:\back
echo請插入另一張光碟...
pause
gotobegin
在這個例子中,驅動器G中磁碟上的所有檔案均複製到d:\back中。顯示的注釋提示您將另一張光碟
盤放入驅動器G時,pause命令會使程式掛起,以便您更換光碟,然後按任意鍵繼續處理。
start命令
調用外部程式,所有的DOS命令和命令行程式都可以由start命令來調用。如:startcalc.exe即可打開Windows的計算器。
常用參數:
MIN開始時視窗最小化
SEPARATE在分開的空間內開始16位Windows程式
HIGH在HIGH優先權類別開始應用程式
REALTIME在REALTIME優先權類別開始應用程式
WAIT啟動應用程式並等候它結束
parameters這些為傳送到命令/程式的參數
執行的應用程式是32-位GUI應用程式時,CMD.EXE不等應用程式終止就返回命令提示。如果在命令
腳本內執行,該新行為則不會發生。
goto命令
跳轉命令。程式指針跳轉到指定的標籤,從標籤後的第一條命令開始繼續執行批處理程式。語法:
gotolabel
參數:
label
指定所要轉向的批處理程式中的行。
Sample:
if{%1}=={}gotonoparms
if{%2}=={}gotonoparms(如果這裡的if、%1、%2你不明白的話,先跳過去,後面會有詳細的解釋。)
@Remcheckparametersifnullshowusage
:noparms
echoUsage:monitor.batServerIPPortNumber
gotoend
標籤的名字可以隨便起,但是最好是有意義的字母啦,字母前加個:用來表示這個字母是標籤,goto
命令就是根據這個:來尋找下一步跳到到那裡。最好有一些說明這樣你別人看起來才會理解你的意圖啊。
set命令
顯示、設定或刪除變數。顯示變數:set或sets前者顯示批處理當前已定義的所有變數及其值,後者顯示所有以s開頭的變數及值。
設定變數:setaa=abcd此句命令便可向變數aa賦值abcd。如果變數aa已被定義,則aa的值被修改為abcd;若aa尚未定義,則此句命令即可定義新的變數aa,同時為變數aa賦予初始值abcd。
刪除變數:setaa=此句命令即可刪除變數aa。若變數aa已被定義,則刪除變數aa;若aa尚未定義,則此句命令沒實質意義。
需要說明的是,批處理中的變數是不區分類型的,不需要像C語言中的變數那樣還要區分int、float、char等。比如執行setaa=345後,變數aa的值既可以被視為數字345,也可以被視為字元串345。
set命令具有擴展功能,如用作互動輸入、字元串處理、數值計算等,屬於高級命令範疇。
高級命令
if、choice、for等命令是批處理檔案中比較高級的命令。if命令
用語在批處理程式中執行條件處理語法:
if[not]errorlevelNumberCommand[elseExpression]
if[not]Strting==String2Command[elseExpression]
if[not]existFileNameCommand[elseExpression}
如果啟用了命令擴展,可以使用以下語法:
ifString1Compare0pString2command[elseExpression]
ifcmdextversionNuberCommand[elseExpression]
參數:
not
指定只有當條件為假時才執行該命令
errorlevelNumber
只有當由cmd.exe運行的前一個程式返回等於或大於Number的退出碼時,才能指定真條件。
Command
指定只有滿足前面的條件時才執行的命令。
String1==String2
只有當String和String2相同時才能指定真條件。這些值可以是文字字元串或批處理變數(例如%1)。對於文字字元串,不需要使用問號。
existFileName
如果FileName存在,則指定真條件。
Compareop
指定3個字母的比較運算符。表1列出了Compareop的有效值。
運算符 | 描述 | 運算符 | 描述 |
EQA | 等於 | LEQ | 小於或等於 |
NEQ | 不等於 | GTR | 大於 |
LSS | 小於 | GEQ | 大於或等於 |
強制字元串比較忽略大小寫。可以在if的String1==String2格上使用/i。這些比較是通用的。因為如果String1和String2全部由數字組成,則字元串將轉化為數字並執行比較。
cmdxtversionNumber
只有與cmd.exe的“命令擴展”功能相關的內部版本號等於或大於Number時,才指定真條件。第一版本是1。當命令擴展的功能有重大增強時,則在此號碼上加1。禁用命令擴展時(默認情況下命令擴展為啟用),cmdextversion條件不為真。
definedVariable
如果定義了Variable,則指定條件為真。
Expression
指定將傳遞給else子句中的命令行命令和任何參數。
舉例:
例1:要在找不到檔案product.dat時顯示找不到數據檔案的訊息,則輸入:
ifnotexistproduct.datechoCannotfinddatafile
例2:如果在格式化驅動器A中的磁碟期間發生錯誤,則以下命令將顯示錯誤訊息。
----------------------------------------------------------------------------------------------------
:begin
@echooff
formata:/s
ifnoterrorlevel1gotoend
echoAnerroroccurredduringformatting.
:end
echoEndofbatchprogram.
----------------------------------------------------------------------------------------------------
如果沒發生錯誤,不會出現錯誤訊息
choice命令
使用choice命令,在批處理程式中,通過顯示提示信息並暫停批處理程式,用戶可以從一組選項鍵中進行選擇。語法:
choice[/c[Choices]][/n][/cs][/tTimeout/dChoice][/mText]
參數:
/cChoices
指定用戶選項鍵。顯示時,選項鍵由逗號分隔,出現在中括弧([])中,後面跟著問號。如果未指定“/cChoices”,默認情況下,Choice顯示使用[Y,N]。
/n
隱藏用戶選項鍵。如果使用此命令行選項,將在提示符之前出現訊息正文,選項仍處於啟用狀態。
/cs
指定用戶選項鍵必須區分大小寫。默認情況下,用戶選項鍵不區分大小寫。
/tTimeout/dChoice
指定在默認為指定鍵之前choice暫停指定的秒數。表2描述了/t命令行選項的值。
值 | 描述 |
Timeout | 要暫停的秒數。可接受的值介於0~9999。如果使用0,choice在默認為指定鍵之前不暫停 |
/dChoice | 指定Timeout秒數之後的默認選擇。使用的字元必須在由/cChoice指定的選擇集中。如果使用此命令行選項,還必須同時指定/tTimeout |
舉例:
----------------------------------------------------------------------------------------------------
@echooff
choice/Cdme/m"defrag,mem,end"
iferrorlevel3gotoend//應先判斷數值最高的錯誤碼
iferrorlevel2gotomem
iferrotlevel1gotodefrag
:defrag
c:\dos\defrag
gotoden
:end
echogoodbye
----------------------------------------------------------------------------------------------------
此檔案運行後,將顯示:
defrag,men,end[D,M,E]?用戶可選擇dme
然後if語句將做出判斷,d表示執行標號為defrag的程式段,m表示執行標號為mem的程式段,c表示執行標號為end的程式段,每個程式段最後都以gotoend將程式跳到end標號處,然後程式將顯示goodbye,程式結束。
for命令
for命令用於對一組檔案中的每個檔案運行指定的命令語法:
for[%Variable|%%Variable]in(Set)doCommand[CommandLineoptions]
參數:
[%Variable|%%Variable]
必需參數,代表可替換的參數。使用%Variable通過命令提示符執行for命令。使用%%Variable在批處理檔案中執行for命令。變數要區分大小寫,並且必須用Alpha值表示,例如%A、%B或%C。
(set)
必需參數,指定要用指定命令處理的一個或多個檔案、目錄、數值範圍以及文本字元串。需要括弧。
Command
必需參數,指定要對包括在指定的(Set)中每個檔案、目錄、數值範圍以及文本字元串所執行的命令。
CommandLineOptions
指定要與所指定命令一起使用的任何命令行選項。
循環命令只要條件符合,它將多次執行同一命令,同時for的循環裡面還可以套用for再進行循環。
舉例:
for%%cin(*.bat*.txt)
dotype%%c
含義:如果以.bat或.txt結尾的檔案,則顯示檔案的內容。