批處理

批處理

批處理(Batch),也稱為批處理腳本。顧名思義,批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言,它套用於DOS和Windows系統中。批處理檔案的擴展名為bat 。目前比較常見的批處理包含兩類:DOS批處理和PS批處理。PS批處理是基於強大的圖片編輯軟體Photoshop的,用來批量處理圖片的腳本;而DOS批處理則是基於DOS命令的,用來自動地批量地執行DOS命令以實現特定操作的腳本。更複雜的情況,需要使用if、for、goto等命令控制程式的運行過程,如同C、Basic等高級語言一樣。如果需要實現更複雜的套用,利用外部程式是必要的,這包括系統本身提供的外部命令和第三方提供的工具或者軟體。批處理程式雖然是在命令行環境中運行,但不僅僅能使用命令行軟體,任何當前系統下可運行的程式都可以放在批處理檔案中運行。有些人認為批處理語言的含義要比上面的描述更廣泛,還包括許多軟體自帶的批處理語言, 而這類批處理語言也大多提供把一系列操錄製為批處理檔案的功能,這樣用戶不必寫程式就能得到批處理程式。

基本信息

介紹

批處理批處理

學習有關批處理的一些比較瑣碎、但又比較有價值的一些知識,運用這些知識後,才有條件更好的實現的批處理的功能,並能使批處理擺脫黑白世界而顯得更加多姿多彩。

一環境變數

所謂“環境變數”,實際上就是C語言裡面的“變數”的意思。批處理的變數可以分為兩類,由系統定義的系統變數和由用戶根據需要自定義的用戶變數。
【1.系統變數】
批處理的一些變數是由作業系統事先定義好的,可以適用於任何批處理,我們稱這些特殊的變數為“系統變數”。系統變數有很多個,包括硬體類、作業系統類、檔案路徑類、系統時間類等。要查看所有的系統變數,請新打開一個cmd視窗,輸入set回車即可。對幾個比較常用的變數解釋如下:
ComputerName計算機名,即右鍵我的電腦--屬性--計算機名選項卡中的“完整的計算機名稱”
ComSpeccmd.exe完整路徑名
HomeDrive系統分區盤符,一般都是C糟,故而HomeDrive=C:
Path執行檔默認搜尋路徑。這個東東非常重要!待會兒單獨講解…
ProgramFiles就是系統的ProgramFiles的路徑啦,一般都是C:\ProgramFiles,這就是安裝軟體時默認的安裝路徑了
Prompt個性化設定cmd提示符的必備武器!不過,我沒怎么用過~
SystemDrive包含系統根目錄的分區,其實就是HomeDrive了
SystemRoot系統根目錄路徑,一般都是C:\WINDOWS
Temp、Tmp檔案、程式等可使用的臨時目錄,默認是C:\WINDOWS\Temp或Tmp。幾乎所有的程式在運行時都會在這個目錄裡面“臨時”寫入檔案。一般情況下,程式寫入的臨時檔案都應該被該程式刪除,可惜的是,大部分的程式都很健忘,導致這個資料夾占據的空間越來越大,自然也就使我們的系統增肥嘍。所以,我們要把它修改到其他分區,並且時時的清理裡面的臨時檔案。
UserName當前用戶名,即所登入的賬戶名
UserProfile當前用戶的配置目錄,一般都是C:\DocumentsandSettings\%UserName%。默認情況下,我們的桌面就是這個目錄下面的“桌面”資料夾;我的文檔就是這個目錄下面的“MyDocuments”資料夾。所以啦,往桌面上或我的文檔裡面放東西就是放到這個資料夾下面了,也就是放到C糟了,重灌系統時要覆蓋C糟內容的,所以桌面上或我的文檔裡面的東西當然就會GonewiththeWind了~解決方法有兩個,一是保持良好的習慣,不把重要檔案放到這兩個地方;二是,修改默認設定,將這兩個資料夾都移到其他分區。
WinDir作業系統路徑,其實就是SystemRoot了

二用戶變數

編寫批處理程式時,用戶根據需要自己定義的變數稱之為用戶變數。用戶變數類似於C語言裡面的變數,僅僅在定義該變數的程式中有效。
用戶變數由set命令定義,這是批處理中非常非常重要的一個操作,從而使set命令成為批處理裡面使用頻率最高的幾個命令之一。關於set命令的使用,參考set/?,本教程也會在後面對其進行講解。
【3.變數引用】
前面的幾節課裡面,我們已經看到了如何引用變數,即直接用變數名操作變數,通過"%"或"!"來獲取變數的值。其中,只有在for語句裡面重複對同一變數多次賦值時才需要使用"!",並且在使用"!"調用變數時,要首先“啟用延遲環境變數擴充”,啟動命令為:SetLocalEnableDelayedExpansion。另外需要說明的是,“啟用延遲環境變數擴充”後,所有的"!"都將被視為“取變數值”的特殊符號,即使用"^!"也不能輸出符號"!"。若要輸出"!",則需要“停用延遲環境變數擴充”,命令為:SetLocalDisableDelayedExpansion

三參數

跟C語言類似,在調用函式或其他批處理時可能需要傳遞參數。批處理的參數傳遞分為直接和間接兩種傳遞參數的方法。
【1.直接傳遞】
直接傳遞參數,即在使用call命令時,不使用任何參數,在子函式或子批處理裡面直接對主函式(也稱父批處理)裡面的變數進行修改。這跟彙編語言裡面的參數傳遞方式類似。
直接傳遞參數舉例:
===============================================
@echooff
setlocalenabledelayedexpansion
setvar=aCdehiM,?mnrstWy
echo%var%
call:deal
setlocaldisabledelayedexpansion
setvar=%var:?=!%
echo%var%
pause>nul
exit
:deal
settm=!var!
setvar=
for%%iin(6,3,11,11,16,15,1,4,11,5,12,13,9,0,12,7,15,14,5,10,2,16,18,8)do(
setvar=!var!!tm:~%%i,1!

goto:eof
===============================================
可以發現,當我們把變數var作為參數賦予子函式:deal後,子函式對var的值進行了修改;當子函式返回後,主函數裡面的var的值就已經是子函數裡面var被修改後的值了。
該例子中,使用了本節課前面講到的setlocalenabledelayedexpansion和setlocaldisabledelayedexpansion,前者保證了var在for循環裡面能夠根據我們的意願進行處理,後者保證了能夠正確輸出符號"!"。另外例子中還使用了命令set,利用set對字元串進行了處理。還有一個地方使用了語句goto:eof,該語句相當於C語言裡面的return或彙編語言裡面的RET,即子程式返回命令。需要說明的是,當子函式本身就在批處理檔案的末尾的話,我們是可以省略這句話的,比如將此例的goto:eof刪除是不會產生任何影響的。
【2.間接傳遞】
間接傳遞參數,即在使用call命令時,在其後面添加參數,形如call{[:label][ChildBatch]}Parameter1Parameter2...ParameterN。這跟C語言裡面傳遞參數的格式類似。不同於C語言,批處理中的子函式不需要定義形參,更不需要指定參數的個數。傳遞過來的參數,在子函式或子批處理裡面是以%1~%9的形式表示的,即%1~%9分別表示傳遞過來的第1~9個參數。
===============================================
@echooff
call:dealaaabbb"cc"dddeee
pause>nul
exit
:deal
echo%%0=%0
echo%%1=%1
echo%%2=%2
echo%%3=%3
echo%%4=%4
echo%%5=%5
===============================================
通過這個例子就可以清晰的看到%n參數表示法的用法。參數列表中包含空格的依舊要用雙引號(")引起來;另外,也可以看到,%0已經變成了子函式的標號了,而不是父批處理的檔案名稱全稱。
【3.區別】
這兩種參數傳遞方法本質上是沒有區別的,形式上,直接傳遞直接對原變數進行操作,丟失了原變數的值;間接傳遞則通過%n對原變數進行了簡單的備份,並且通用性更強,即不限定原變數的名稱。另外,使用%n還有一個非常大的好處,就是可以通過%~*i來加強處理變數的能力。關於%~*i,詳細內容參見for/?。
針對二者的差別,可以根據情況決定使用哪種傳遞方式:
--1.作為參數的變數名固定、且在子函式中不需要對其進行備份的情況下,使用直接傳遞法;
--2.若將子函式作為一個通用的程式模組,以適應於對不同變數的處理,或者作為參數的變數不需要備份時,使用間接傳遞法。
具體使用哪種方法,還需根據實際情況或使用習慣進行選擇。

四返回值

有些命令在執行之後將會返回一定的錯誤值(errorlevel),可以通過errorlevel的值判斷命令執行的狀況。這點類似於C語言裡面的exit(num),num就是錯誤代碼。
獲取返回值errorlevel的方法就是,在執行命令後,立馬調用返回值errorlevel,如echo%errorlevel%或者if%errorlevel%==1等命令。
errorlevel舉例:
===============================================
@echooff
regaddHKCU/vtry/f>nul
regdeleteHKCU/vtry/f
iferrorlevel0(echo刪除成功!)else(echo刪除失敗!)
regdeleteHKCU/vtry/f
if%errorlevel%==0(echo刪除成功!)else(echo刪除失敗!)
pause>nul
===============================================
上面例子中,由於第一成功的刪除了註冊表,導致第二次因為找不到註冊表而宣告失敗。同時我們也看到了errorlevel的使用方法,即iferrorlevel0和if%errorlevel%==0是一樣的。也許你注意到了,裡面還有個笑臉呢~O(∩_∩)O哈哈~這就是ASCII碼啦,後面跟你講啊…
一般情況下,程式或命令成功執行時,返回的errorlevel是0,錯誤時返回1或更高的值。當然,有些命令是沒有返回值的,這點需要注意。
嗯,有沒有想起前面有個類似的東西啊?對了,那就是||和&&;了,這兩個符號就是根據errorlevel的值來進行邏輯判斷的。

五ASCII碼

前面的例子中,我們已經使用過一次ASCII碼了,也就是那個笑臉。ASCII碼是圖形化的符號,可以用來點綴我們的批處理的。
在cmd視窗中我們可以通過任意一個字元的ASCII碼來輸入該字元,比如Ctrl+G、Ctrl+N等,字母a-z對應ASCII碼的97-122。對於ASCII碼大於26的字元,可以通過這個方法來輸入:按住Alt鍵不松,通過小鍵盤輸入ASCII碼的十進制值,鬆開Alt鍵即可。
ArcGIS中的批處理
可別告訴我您不知道什麼是批處理,當面對一大堆需要重複操作的數據時,往往讓我們感到頭大,這時候我們會想到批處理 ,那ArcGIS給大家提供了哪些批處理的方法呢,讓我們拭目以待。
假設我們需要給道路建立緩衝區,設計到的工具為Buffer。
第一種情況,一個圖層中不同要素建立不同大小的緩衝區
不同類型的道路,我們需要建立不同大小的緩衝區,比如,一級道路建立10米的緩衝區,二級道路建立15米的緩衝區,三級道建立20米的緩衝區。
步驟:
1、首先應該保證你的道路數據裡面有一個屬性欄位是用來存儲Buffer寬度信息的。
2、套用Buffer工具,在對應的參數位置選擇相應欄位即可。
第二種情況,不同的圖層建立不同大小的緩衝區
假設還有其他不同的數據,不僅僅是道路,這些圖層都需要建立緩衝區。
步驟:
1、找到Buffer工具,右鍵,選擇Batch,打開批處理面板。從該面板上我們可以發現,參數與我們打開Buffer的參數是一樣的,這個時候是不是可以考慮在EXCEL中批量編輯好,然後複製過來呢
2、在Excel中編輯需要的數據。
3、將在Excel中編輯的數據複製到Buffer的批處理面板中來。此處需要注意,如果要複製10行數據,需要在批處理面板中先選中10行,右鍵單擊,選擇“paste”。
4、點擊OK即可。
如果想要每個圖層中每種類型的數據的緩衝區寬度都不一樣,該怎樣處理的?這個留給您來嘗試吧,原理很簡單,就是找到參數位置,寫上對應的欄位即可。
第三種情況,Python實現批處理
如果您覺得上面的方法比較麻煩,而且要求也比較嚴格,您可以考慮套用Python來處理。
步驟:
1、編寫代碼
importarcpy,os
inFCs=arcpy.GetParameterAsText(0)
outWS=arcpy.GetParameterAsText(1)
dist=arcpy.GetParameterAsText(2)
inFCs=inFCs.split(";")
forinFCininFCs:
fileName=os.path.split(inFC)[1]
arcpy.Buffer_analysis(inFC,outWS+"\\"+fileName,str(dist)+"meter")
上面這段代碼,要求用戶自己設定輸入數據、輸出數據、緩衝區寬度(單位為米)。這裡輸出緩衝區數據的名稱和輸入數據的名稱一樣,如果不想要這樣,可以進一步修改代碼。
2、接下來將該代碼增加到ArcToolbox中,步驟比較簡單,這裡不再贅述。
需要注意的地方為最後的參數設定部分,”輸入數據”的“MutiValue”屬性設定為”Yes”。(此部分的參數設定較條條框框較多,需要與你的代碼相互對照)
3、完成後,工具將會添加到您自己的工具箱中。打開該工具,您會看到界面像普通工具的界面一樣,輸入數據可以設定很多個,但是這個工具所有圖層的緩衝區大小必須一樣。

可別告訴我您不知道什麼是批處理,當面對一大堆需要重複操作的數據時,往往讓我們感到頭大,這時候我們會想到批處理 ,那ArcGIS給大家提供了哪些批處理的方法呢,讓我們拭目以待。
假設我們需要給道路建立緩衝區,設計到的工具為Buffer。

原理

批處理批處理與在線上處理

把要處理的信息分成組,成批地交給信息系統自動處理。在以計算機為主的信息系統中,信息的輸入、輸出速度與信息處理的速度不相匹配。為了減少人工操作時間和改善機器的利用情況,把要處理的信息(例如工資卡、庫存記錄等)按一定周期收集在一起,成批地交給系統進行處理。所有的作業也可適當地分批,系統啟動後自動地處理第一個作業,處理完後不需操作員干預而自動地過渡到處理下一個作業,直至一批作業處理完畢為止。

早期的批處理對作業的輸入輸出採取在線上處理,高速的中央處理機要等待低速的在線上輸入、輸出設備,不能發揮應有的效率。後來採用脫機處理:先把若干個作業輸入到磁帶上,中央處理器從磁帶上把作業調入並執行,作業完成後把結果記錄在磁帶上,再由外圍機將磁帶上的信息輸出。這樣中央處理機得以擺脫低速的輸入、輸出設備的牽制,提高處理能力。

如果數據是在遠方收集,通過終端送入數據採集器,數據採集器先將一段時間內的信息存儲起來,再通過傳輸線路將它們成批地送入系統進行處理,則這種處理方式稱為遠程批處理。

批處理能有效地提高計算機的利用率,是最經濟的處理方法。但是在批處理中,用戶提交作業後便失去了對作業的控制和修改能力,用戶必須以作業說明書的形式向系統提供控制信息,還需要估計運行過程中可能出現的問題,並把處理方法事先告訴系統。對新的處理作業,用戶無法預測可能出現的事件,所以希望系統有與用戶互動作用的能力(見互動式處理)。這種情況不適合採用批處理。另外,在批處理系統中,用戶提交作業後通常要經過幾小時甚至幾天的時間才能得到所需要的結果,這樣長的周轉時間對那些僅計算一個很小的題目,或只對已存檔案作幾行修改的短作業用戶非常不便,尤其對時間緊迫的作業更不宜選用批處理方式。在大型處理系統中,批處理經常是後台作業,前台作業採用分時處理

分類

批處理順序批處理

批處理按作業的處理次序可以分為順序批處理和隨機批處理。

順序批處理 

對成批的信息按規定的順序自動地依次進行處理。傳統的處理方法是父-子方法。按信息處理要求對原來的主檔案(父)進行修改,建立新的主檔案(子),將它作為下一次運行的父檔案,而原來的父檔案自動地成為後備檔案。這種處理方式的優點是主記錄的插入、刪除容易,新老檔案可以選用同一類型的外圍設備,平均訪問時間短。缺點是老檔案中不常用的部分也必須寫入新檔案。

順序批處理中,信息輸入的順序必須與檔案的順序嚴格一致。事先把信息經過分類和排序,記錄在磁帶或卡片上,批處理一旦開始,在一個預定的時間內,所有適當的信息都進入系統,順序地進行處理。

隨機批處理

對成批的信息僅處理需要的部分,而對其他無關部分不加任何處理(見隨機存取)。

功能

批處理批處理功能界面

其用處非常大,使用也比較廣泛。比如每次都執行一些相同的命令,您一定會覺得非常麻煩,而放在批處理檔案中執行的話則輕鬆得多。AUTOEXEC.BAT 就是一個特殊的批處理檔案,它在DOS的啟動時自動運行,在系統的配置中發揮著非常大的作用。

批處理使用方便,只要新建一個文本文檔,把批處理語句添加進去,保存後修改檔案擴展名為.bat即可雙擊使用。

擴展名是bat(在nt/2000/xp/2003下也可以是cmd)的檔案就是批處理檔案。

首先批處理檔案是一個文本檔案,這個檔案的每一行都是一條DOS命令(大部分時候就好象我們在DOS提示符下執行的命令行一樣),你可以使用DOS下的Edit或者Windows記事本(notepad)等任何文本檔案編輯工具創建和修改批處理檔案。

其次,批處理檔案是一種簡單的程式,可以通過條件語句(if)和流程控制語句(goto)來控制命令運行的流程,在批處理中也可以使用循環語句(for)來循環執行一條命令。當然,批處理檔案的編程能力與C語言等編程語句比起來是十分有限的,也是十分不規範的。批處理的程式語句就是一條條的DOS命令(包括內部命令和外部命令),而批處理的能力主要取決於你所使用的命令。

第三,每個編寫好的批處理檔案都相當於一個DOS的外部命令,你可以把它所在的目錄放到你的DOS搜尋路徑(path)中來使得它可以在任意位置運行。一個良好的習慣是在硬碟上建立一個bat或者batch目錄(例如C:\BATCH),然後將所有你編寫的批處理檔案放到該目錄中,這樣只要在path中設定上c:\batch,你就可以在任意位置運行所有你編寫的批處理程式

第四,在DOS和Win9x/Me系統下,C:盤根目錄下的AUTOEXEC.BAT批處理檔案是自動運行批處理檔案,每次系統啟動時會自動運行該檔案,你可以將系統每次啟動時都要運行的命令放入該檔案中,例如設定搜尋路徑,調入滑鼠驅動和磁碟快取,設定系統環境變數等。

實例

批處理常見批處理案例

簡單的說,批處理的作用就是自動的連續執行多條命令。

這裡先講一個最簡單的套用:在啟動wps軟體時,每次都必須執行( >前面內容表示DOS提示符):

C:\>cd wps

C:\WPS>spdos

C:\WPS>py

C:\WPS>wbx

C:\WPS>wps

如果每次用WPS之前都這樣執行一遍,您是不是覺得很麻煩呢?

好了,用批處理,就可以實現將這些麻煩的操作簡單化,首先我們編寫一個runwps.bat批處理檔案,內容如下:

@echo off

c:

cd\wps

spdos

py

wbx

wps

cd\

以後,每次進入wps,只需要運行runwps這個批處理檔案即可。

命令簡介

echo命令

打開回顯或關閉請求回顯功能,或顯示訊息。如果沒有任何參數,echo
命令將顯示當前回顯設定。
語法
echo[{on|off}][message]
Sample:@echooff/echohelloworld
在實際套用中我們會把這條命令和重定向符號(也稱為管道符號,一般用>>>^)結合來實現輸入一些命令到特定的檔案中。

rem命令

注釋命令,類似於在C語言中的/*--------*/,它並不會被執行,只是起一個注釋的作用,只有在編輯批處理時才會被看到,主要用於方便修改。
::也具有rem的功能
但::和rem還是有區別的,當關閉回顯時,rem和::後的內容都不會顯示。
但是當打開回顯時,rem
後的內容會顯示出來,然而::後的內容仍然不會顯示。
Rem[注釋內容]
示例:Rem你好。
pause命令
暫停命令。運行Pause命令時,將顯示下面的訊息:
Pressanykeytocontinue...(或:請按任意鍵繼續...)
示例:
@echooff
:begin
copyG:*.*d:\back
echo請插入另一張光碟...
pause
gotobegin
在這個例子中,驅動器G中磁碟上的所有檔案均複製到d:\back中。顯示的注釋提示您將另一張光碟
盤放入驅動器G時,pause命令會使程式掛起,以便您更換光碟,然後按任意鍵繼續處理。

call命令

從一個批處理程式調用另一個批處理程式,並且不終止父批處理程式。call
批處理功能界面
批處理功能界面
命令接受用作調用目標的
標籤。如果在腳本或批處理檔案外使用Call,它將不會在命令行起作用。
語法
call[路徑檔案名稱][標籤]]
參數
[Drive:}[Path]FileName
指定要調用的批處理程式的位置和名稱。

start命令

調用外部程式,所有的DOS命令和命令行程式都可以由start命令來調用。
如:startcalc.exe即可打開Windows的計算器。
常用參數:
MIN開始時視窗最小化
SEPARATE在分開的空間內開始16位Windows程式
HIGH在HIGH優先權類別開始應用程式
REALTIME在REALTIME優先權類別開始應用程式
WAIT啟動應用程式並等候它結束
parameters這些為傳送到命令/程式的參數
執行的應用程式是32-位GUI應用程式時,CMD.EXE不等應用程式
終止就返回命令提示。如果在命令
腳本內執行,該新行為則不會發生。

goto命令

跳轉命令。程式指針跳轉到指定的標籤,從標籤後的第一條命令開始繼續執行批處理程式。
語法:gotolabel(label是參數,指定所要轉向的批處理程式中的行。)
示例:
:1
start
goto1
運行以上這段命令,就會打開很多個視窗(用來整人相當不錯)。這段命令的意思是,先用start命令打開視窗,再用goto1命令轉到1標籤,即第一行後面的命令。注意標籤名字前面要加上英文的冒號。
標籤的名字可以隨便起,但是最好是有意義的字母啦,字母前加個:
用來表示這個字母是標籤,goto
命令就是根據這個:來尋找下一步跳到到那裡。最好有一些說明這樣別人看起來才會理解你的意圖啊。

set命令

顯示、設定或刪除變數。
顯示變數:set或sets前者顯示批處理當前已定義的所有變數及其值,後者顯示所有以s開頭的變數及值。
設定和調用變數:例如setaa=abcd,就是把aa定義為abcd。如果要調用這個變數,就把aa兩邊加上個百分號。
例如:
setaa=abcd
echo%aa%
pause
運行這段命令就會顯示“abcd”。
刪除變數:setaa=此句命令即可刪除變數aa。若變數aa已被定義,則刪除變數aa;若aa尚未定義,則此句命令無實質意義。
需要說明的是,批處理中的變數是不區分類型的,不需要像C語言中的變數那樣還要區分int、float、char等。比如執行setaa=345後,變數aa的值既可以被視為數字345,也可以被視為字元串345。
set命令具有擴展功能,如用作互動輸入、字元串處理、數值計算等,屬於高級命令範疇。

符號簡介

回顯禁止@

批處理選擇批處理

表示不顯示@後面的命令,在入侵過程中(例如使用批處理來格式化敵人
的硬碟)自然不能讓對方看到你使用的命令啦。
@用法舉例:通過運行批處理檔案對比pause和@pause命令即可明了@的效果。

重定向1>

將輸出信息重定向到指定的設備或檔案。系統默認輸出到顯示器。
如:echoaaaaa>a.txt即可將本在顯示器上顯示的信息aaaaa輸出到檔案a.txt中,螢幕上沒有任何顯示。如果檔案a.txt本來已經存在,該命令將首先擦除a.txt中的所有信息,然後寫入信息aaaaa;若a.txt本來就不存在,該命令即可新建一個a.txt檔案,並寫入信息aaaaa。
echoaaaaa>>a.txt類似於echoaaaaa>a.txt。區別在於:如果a.txt本已存在,>a.txt會擦除a.txt中的原有內容,而>>a.txt並不擦除原有內容,僅在a.txt檔案的末尾添加信息aaaaa。a.txt不存在時,二者沒有差別。
需要注意的是,因為數字的特殊性,在echo輸出數字時,請在後面加上空格,例如:echo9313>a.txt,否則有可能造成輸出不完整。

重定向2<

將輸入信息來源重定向為指定的設備或檔案。系統默認從顯示器讀取輸入信息。
重定向使用舉例:
@echooff
echoabcdefg——這是檔案a.txt中的信息>a.txt
echo請任意輸入字元,以回車結束:
set/pifo=
cls
echo【從螢幕獲得的輸入信息】
echo%ifo%
set/pifo=<a.txt
echo【從檔案a.txt獲得的輸入信息】
echo%ifo%
pause>nul
讀者觀察命令與輸出即可體會到重定向的功能和效果。

管道符號|

將管道符號前面命令的輸出結果重定向輸出到管道符號後面的命令中去,作為後面命令的輸入。使用格式為:command_1|command_2
管道符號使用舉例:
@echooff
echoaaaa>a.txt
del/pa.txt
pause
@echooff
echoaaaa>a.txt
echoy|del/pa.txt
pause
對比以上兩個批處理執行結果,讀者即可明白管道符的用法和效果。
需要說明的是,上面del命令添加開關/p只是為了讓讀者明白管道符號的使用方法,實際刪除檔案時不加/p開關即可實現無提示直接刪除。

轉義符^

將特殊符號轉化為一般符號,即剝離特殊符號的特殊地位。特殊符號指:|&><
比如,如果我們想輸出符號“>;”,直接用命令echo>是不行的,必須修改為echo^>;。其餘幾個特殊符號類似需要有同樣的處理。
轉義字元使用舉例:
@echooff
echoaaaa>a.txt
echo第一句echo執行完畢
echoaaaa^>a.txt
echo第二句echo執行完畢
pause
比較上面的兩句echo,第一句echo將信息aaaa輸出到了檔案a.txt,而第二句echo則在直接螢幕上顯示出aaaa>a.txt

邏輯命令符

邏輯命令符包括:&
&-它的作用是用來連線n個DOS命令,並把這些命令按順序執行,而不管是否有命令執行失敗;
&&-當&&;前面的命令成功執行時,執行&&;後面的命令,否則不執行;
||-當||前面的命令失敗時,執行||後面的命令,否則不執行。
@echooff
echo^|^|
regaddHKCU/vtry/f||echo**失敗**
regaddHKCU1/vtry/f||echo**成功**
echo^&^&
regdeleteHKCU/vtry/f&&echo**成功**
regdeleteHKCU/vtry/f&&echo**失敗**
echo^&
regdeleteHKCU/vtry/f&echo**也許成功**
regdeleteHKCU/vtry/f&echo**也許失敗**
pause
執行regadd或regdelete後,系統會給出執行結果;我們通過echo命令也給出了“執行結果”。對比系統和我們自己給出的結果,既可以驗證邏輯命令的判斷機理。

命令釋義

資料夾管理

cd顯示當前目錄名或改變當前目錄。
md創建目錄。
rd刪除一個目錄。
dir顯示目錄中的檔案和子目錄列表。
tree以圖形顯示驅動器或路徑的資料夾結構。
path為執行檔顯示或設定一個搜尋路徑。
copy複製檔案和目錄樹。

檔案管理

type顯示文本檔案的內容。
copy將一份或多份檔案複製到另一個位置。
del刪除一個或數個檔案。
move移動檔案並重命名檔案和目錄。(WindowsXPHomeEdition中沒有)
ren重命名檔案。
replace替換檔案。
attrib顯示或更改檔案屬性。
find搜尋字元串。
fc比較兩個檔案或兩個檔案集並顯示它們之間的不同

網路命令

ping進行網路連線測試、名稱解析
ftp檔案傳輸
net網路命令集及用戶管理
telnet遠程登入
ipconfig顯示、修改TCP/IP設定
msg給用戶傳送訊息
arp顯示、修改區域網路的IP位址-物理地址映射列表

系統管理

at安排在特定日期和時間運行命令和程式
shutdown立即或定時關機或重啟
tskill結束進程
taskkill結束進程(比tskill高級,但WinXPHome版中無該命令)
tasklist顯示進程列表(WindowsXPHomeEdition中沒有)
sc系統服務設定與控制
reg註冊表控制台工具
powercfg控制系統上的電源設定
對於以上列出的所有命令,在cmd中輸入命令+/?即可查看該命令的幫助信息。如find/?

語句結構

類似於C語言,批處理也有它的語句結構。批處理的語句結構主要有選擇結構(if語句)、循環結構(for語句)等。

選擇結構

if語句實現條件判斷,包括字元串比較、存在判斷、定義判斷等。通過條件判斷,if語句即可以實現選擇功能。
1.字元串比較
if語句僅能夠對兩個字元(串)是否相同、先後順序進行判斷等。其命令格式為:
IF[not]string1compare-opstring2command1[elsecommand2]
其中,比較操作符compare-op有以下幾類:
==-等於
EQU-等於
NEQ-不等於
LSS-小於
LEQ-小於或等於
GTR-大於
GEQ-大於或等於
選擇開關/i則不區分字元串大小寫;選擇not項,則對判斷結果進行邏輯非。
字元串比較示例:
=
@echooff
setstr1=abcd1233
setstr2=ABCD1234
if%str1%==%str2%(echo字元串相同!)else(echo字元串不相同!)
if/i%str1%LSS%str2%(echostr1^<str2)else(echostr1^>=str2)
echo.
set/pchoice=是否顯示當前時間?(y/n)
if/inot%choice%EQUnecho當前時間是:%date%%time%
pause>nul
對於最後一個if判斷,當我們輸入n或N時的效果是一樣的,都不會顯示時間。如果我們取消開關/i,則輸入N時,依舊會顯示時間。
另外請注意一下幾個細節:1-echostr1^<str2和echostr1^>=str2;2-echo.。
2.存在判斷
存在判斷的功能是判斷檔案或資料夾是否存在。其命令格式為:
IF[NOT]EXISTfilenamecommand1[elsecommand2]
@echooff
ifexist%0echo檔案%0是存在的!
ifnotexist%~df0(
echo資料夾%~df0不存在!
)elseecho資料夾%~df0存在!
pause>nul
這裡注意幾個地方:
1-存在判斷既可以判斷檔案也可以判斷資料夾;
2-%0即代表該批處理的全稱(包括驅動器盤符、路徑、檔案名稱和擴展類型);
3-%~df0是對%0的修正,只保留了其驅動器盤符和路徑,詳情請參考for/?,屬高級批處理範疇;
4-注意if語句的多行書寫,多行書寫要求command1的左括弧必須和if在同一行、else必須和command1的右括弧同行、command2的左括弧必須與else同行、command1和command2都可以有任意多行,即command可以是命令集。
3.定義判斷
定義判斷的功能是判斷變數是否存在,即是否已被定義。其命令格式為:
IF[not]DEFINEDvariablecommand1[elsecommand2]
存在判斷舉例:
@echooff
setvar=111
ifdefinedvar(echovar=%var%)elseechovar尚未定義!
setvar=%%
ifdefinedvar(echovar=%var%)elseechovar尚未定義!
pause>nul
對比可知,"setvar="可以取消變數,收回變數所占據的記憶體空間。
4.結果判斷
masm%1.asm
iferrorlevel1pause&edit%1.asm
link%1.obj
先對原始碼進行彙編,如果失敗則暫停顯示錯誤信息,並在按任意鍵後自動進入編輯界面;否則用link程式連線生成的obj檔案,這種用法是先判斷前一個命令執行後的返回碼(也叫錯誤碼,DOS程式在運行完後都有返回碼),如果和定義的錯誤碼符合(這裡定義的錯誤碼為1),則執行相應的操作(這裡相應的操作為pause&edit%1.asm部分)。
另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,代碼變為:
masm%1.asm
ifnoterrorlevel1link%1.obj
pause&edit%1.asm

循環結構

for語句可以實現類似於C語言裡面的循環結構,當然for語句的功能要更強大一點,通過不同的開關可以實現更多的功能。for語句有多個開關,不同開關將會實現不同的功能。
1.無開關
無開關的for語句能夠對設定的範圍內進行循環,是最基本的for循環語句。其命令格式為:
FOR%%variableIN(set)DOcommand
其中,%%variable是批處理程式裡面的書寫格式,在DOS中書寫為%variable,即只有一個百分號(%);set就是需要我們設定的循環範圍,類似於C語言裡面的循環變數;do後面的command就是循環所執行的命令,即循環體。
無開關for語句舉例:
===============================================
@echooff
for%%iin(a,"bc",d)doecho%%i
pause>nul
===============================================
2.開關/L
含開關/L的for語句,可以根據set裡面的設定進行循環,從而實現對循環次數的直接控制。其命令格式為:
FOR/L%%variableIN(start,step,end)DOcommand
其中,start為開始計數的初始值,step為每次遞增的值,end為結束值。當end小於start時,step需要設定為負數。
含開關/L的for語句舉例(創建5個資料夾):
===============================================
@echooff
for/l%%iin(1,2,10)domd%%i
pause
===============================================
上例將新建5個資料夾,資料夾名稱依次為1.3.5.7.9。可以發現,%%i的結束值並非end的值10,而是不大於end的一個數。
3.開關/F
含開關/F的for語句具有最強大的功能,它能夠對字元串進行操作,也能夠對命令的返回值進行操作,還可以訪問硬碟上的ASCII碼檔案,比如txt文檔等。其命令格式為:
FOR/F["options"]%%variableIN(set)DOcommand
其中,set為("string"、'command'、file-set)中的一個;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一個或多個的組合。各選項的意義參見for/f。一般情況下,使用較多的是skip、tokens、delims三個選項。
含開關/F的for語句舉例:
===============================================
@echooff
echo**NoOptions:
for/f%%ain("1,2,10")doechoa=%%a
echo**Optionstokens^&delims:
for/f"tokens=1-3delims=,"%%ain("1,2,10")doechoa=%%ab=%%bc=%%c
pause
===============================================
@echooff
echo本資料夾裡面的檔案有:
for/f"skip=5tokens=3*delims="%%ain('dir')do(fnot"%%a"=="<DIR>"ifnot"%%b"=="位元組"ifnot"%%b"=="可用位元組"echo%%b
pause
===============================================
@echooff
echo本資料夾裡面的檔案有:
dir>c:\file.txt
for/f"skip=5tokens=3*delims="%%ain(c:\file.txt)do(fnot"%%a"=="<DIR>"ifnot"%%b"=="位元組"ifnot"%%b"=="可用位元組"echo%%b
delc:\file.txt
pause
===============================================
對於後面的兩個例子,其中options裡面的delims=是可以刪除的,因為只要添加了/F開關係統就將delims的值默認為空格。
符號字元串中的最後一個字元星號,
那么額外的變數將在最後一個符號解析之後
分配並接受行的保留文本。本例中也可以改為4,不過檔案名稱中有空格的檔案,只能顯示空格以前部分
同時我們也看到了,for語句的do後面的command也是可以分行的,只需要保證command的左括弧和do在同一行就可以了。
4.開關/D或/R
含開關/D或/R的for語句是與目錄或檔案有關的命令,一般情況下很少使用。含開關/R的命令有時候被用於通過遍歷資料夾來查找某一個檔案或資料夾,故而列舉此例。
含開關/R的for語句舉例(資料夾遍歷):
===============================================
@echooff
setlocalenabledelayedexpansion
FOR/Rd:%%iIN(.)DO(setdd=%%iet"dd=!dd:~0,-1!"cho!dd!
pause
exit
===============================================
上例即可以羅列出D糟下的所有資料夾,其速度要比命令"treed:"慢多了,不過其返回結果的實用性則遠遠超過了tree命令。
一般情況下我們不推薦通過遍歷資料夾來查找檔案,特別是在查找某些程式(比如QQ.exe)的位置時。推薦通過reg命令查找註冊表來查找QQ的路徑,以保證查找效率。
上例中也出現了幾個新面孔,如setlocal、感嘆號等。其中,感嘆號其實就是變數百分號(%)的強化版。之所以要用!而不用%,是因為在for循環中,當一個變數被多次賦值時,%dd%所獲取的僅僅是dd第一次被賦予的值;要想刷新dd的值,就必須首先通過命令"setlocalenabledelayedexpansion"來開啟延遲變數開關,然後用!dd!來獲取dd的值。
for語句是批處理裡面功能最強大、使用最普遍卻又最難掌握的一套命令,這也是批處理菜鳥和批處理高手最明顯的一個分水嶺,一旦掌握了這套命令,那么你就離批處理達人不遠了!

字元串

批處理有著具有非常強大的字元串處理能力,其功能絕不低於C語言裡面的字元串函式集。批處理中可實現的字元串處理功能有:截取字元串內容、替換字元串特定欄位、合併字元串、擴充字元串等功能。下面對這些功能一一進行講解。

截取字元串

截取字元串可以說是字元串處理功能中最常用的一個子功能了,能夠實現截取字元串中的特定位置的一個或多個字元。舉例說明其基本功能:
=========================================
@echooff
setifo=abcdefghijklmnopqrstuvwxyz0123456789
echo原字元串(第二行為各字元的序號):
echo%ifo%
echo123456789012345678901234567890123456
echo截取前5個字元:
echo%ifo:~0,5%
echo截取最後5個字元:
echo%ifo:~-5%
echo截取第一個到倒數第6個字元:
echo%ifo:~0,-5%
echo從第4個字元開始,截取5個字元:
echo%ifo:~3,5%
echo從倒數第14個字元開始,截取5個字元:
echo%ifo:~-14,5%
pause
=========================================
當然,上面的例子只是將字元串處理的基本功能展示出來了,還看不出字元串處理具體有什麼用處。下面這個例子是對時間進行處理。
=========================================
@echooff
echo當前時間是:%time%即%time:~0,2%點%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
pause
=========================================

替換字元串

替換字元串,即將某一字元串中的特定字元或字元串替換為給定的字元串。舉例說明其功能:
=========================================
@echooff
setaa=偉大的中國!我為你自豪!
echo替換前:%aa%
echo替換後:%aa:中國=中華人民共和國%
echoaa=%aa%
set"aa=%aa:中國=中華人民共和國%"
echoaa=%aa%
pause
=========================================
對於上面的例子有一點說明,對比兩個echoaa=%aa%可以發現,如果要修改變數aa的內容的話,就需要將修改結果“%aa:中國=中華人民共和國%”賦值給變數aa。上面的字元串截取也有著同樣的特點。

字元串合併

其實,合併字元串就是將兩個字元串放在一起就可以了。舉例說明:
=========================================
@echooff
setaa=偉大的中國!
setbb=我為你自豪!
echo%aa%%bb%
echoaa=%aa%
echobb=%bb%
set"aa=%aa%%bb%"
echoaa=%aa%
pause
=========================================
同樣,如果要改變變數aa的內容的話,就需要將合併結果“%aa%%bb%”賦值給變數aa。

擴充字元串

“擴充”這個辭彙來自於微軟自己的翻譯,意思就是對表示檔案路徑的字元串進行特殊的處理,具體功能羅列如下:
=========================================
~I-刪除任何引號("),擴充%I
%~fI-將%I擴充到一個完全合格的路徑名
%~dI-僅將%I擴充到一個驅動器號
%~pI-僅將%I擴充到一個路徑
%~nI-僅將%I擴充到一個檔案名稱
%~xI-僅將%I擴充到一個檔案擴展名
%~sI-擴充的路徑只含有短名
%~aI-將%I擴充到檔案的檔案屬性
%~tI-將%I擴充到檔案的日期/時間
%~zI-將%I擴充到檔案的大小
%~$PATH:I-查找列在路徑環境變數的目錄,並將%I擴充
到找到的第一個完全合格的名稱。如果環境變數名
未被定義,或者沒有找到檔案,此組合鍵會擴充到

空字元串

可以組合修飾符來得到多重結果:
%~dpI-僅將%I擴充到一個驅動器號和路徑
%~nxI-僅將%I擴充到一個檔案名稱和擴展名
%~fsI-僅將%I擴充到一個帶有短名的完整路徑名
%~dp$PATH:i-查找列在路徑環境變數的目錄,並將%I擴充
到找到的第一個驅動器號和路徑。
%~ftzaI-將%I擴充到類似輸出線路的DIR
=========================================
以上內容引用於for/?幫助信息。其中的I代表變數I,不過需要說明的是,不是所有的變數都能夠進行擴充的,有兩個條件:1.該字元串代表一個檔案路徑;2.變數要用%x來表示,x可取a-zA-Z0-9共62個字元中的任意一個。舉例說明:
=========================================
@echooff
echo正在運行的這個批處理:
echo完全路徑:%0
echo去掉引號:%~0
echo所在分區:%~d0
echo所處路徑:%~p0
echo檔案名稱:%~n0
echo擴展名:%~x0
echo檔案屬性:%~a0
echo修改時間:%~t0
echo檔案大小:%~z0
pause
=========================================
其中的%0是批處理裡面的參數,代表當前運行的批處理的完全路徑。類似的還有%1-%9,分別代表傳遞來的第1-9個參數。例子如下:
===============================================
@echooff
setaa=C:\Windows\PPP\a.btx
call:dealaaa%aa%"cc"dddeee
pause>nul
exit
:deal
echo%%0=%0
echo%%1=%1
echo%%2=%2
echo%%3=%3
echo%%4=%4
echo%%5=%5
===============================================
其中,變數aa在之前是不可以擴充的,通過call命令並將aa作為參數傳遞給子函式:deal,將aa變數轉換成了變數%1,即符合%x格式,從而可以進行字元串擴充。
至於%x中x取a-zA-Z的形式,可以複習一下for語句,for語句裡面的變數就是用%x來表示的,因而可以直接進行擴充。

參數

批處理批處理過程

批處理檔案還可以像C語言函式一樣使用參數(相當於DOS命令的命令行參數),這需要用到一個參數表示符“%”。

%[1-9]表示參數,參數是指在運行批處理檔案時在檔案名稱後加的以空格(或者Tab)分隔的字元串。變數可以從%0到%9,%0表示批處理命令本身,其它參數字元串用%1到%9順序表示。

參數列表

/C choices 指定要創建的選項列表。默認列表是 "YN"。

/N 在提示符中隱藏選項列表。提示前面的訊息得到顯示,

選項依舊處於啟用狀態。

/CS 允許選擇分大小寫的選項。在默認情況下,這個工具

是不分大小寫的。

/T timeout 做出默認選擇之前,暫停的秒數。可接受的值是從 0

到 9999。如果指定了 0,就不會有暫停,默認選項

會得到選擇。

/D choice 在 nnnn 秒之後指定默認選項。字元必須在用 /C 選

項指定的一組選擇中; 同時,必須用 /T 指定 nnnn。

/M text 指定提示之前要顯示的訊息。如果沒有指定,工具只

顯示提示。

/? 顯示幫助訊息。

相關詞條

相關搜尋

熱門詞條

聯絡我們