批處理(Batch),也稱為批處理腳本。顧名思義,批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言,它應用于DOS和Windows系統中。批處理文件的擴展名為bat 。目前比較常見的批處理包含兩類:DOS批處理和PS批處理。PS批處理是基于強大的圖片編輯軟件Photoshop的,用來批量處理圖片的腳本;而DOS批處理則是基于DOS命令的,用來自動地批量地執行DOS命令以實現特定操作的腳本。更復雜的情況,需要使用if、for、goto等命令控制程式的運行過程,如同C、Basic等高級語言一樣。如果需要實現更復雜的應用,利用外部程式是必要的,這包括系統本身提供的外部命令和第三方提供的工具或者軟件。批處理程序雖然是在命令行環境中運行,但不僅僅能使用命令行軟件,任何當前系統下可運行的程序都可以放在批處理文件中運行。
有些人認為批處理語言的含義要比上面的描述更廣泛,還包括許多軟件自帶的批處理語言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所內置的批處理語言的功能,用戶可通過它們讓相應的軟件執行自動化操作(例如調整某個資料夾所有 PSD 圖檔的解析度)。 而這類批處理語言也大多提供把一系列操作錄制為批處理文件的功能,這樣用戶不必寫程式就能得到批處理程序。
批處理系統(batch processing system)中,一個作業可以長時間地占用cpu。而分時系統中,一個作業只能在一個時間片(Time Slice,一般取100ms)的時間內使用cpu。
批處不是嚴格意義上的操作系統,雖然可用Monitor監督,可用匯編語言開發,但也只是操作系統的原型。
所謂批處理(batch processing )就是將作業按照它們的性質分組(或分批),然后再成組(或成批)地提交給計算機系統,由計算機自動完成后再輸出結果,從而減少作業建立和結束過程中的時間浪費。根據在內存中允許存放的作業數,批處理系統又分為單道批處理系統和多道批處理系統。早期的批處理系統屬于單道批處理系統,其目的是減少作業間轉換時的人工操作,從而減少CPU的等待時間。它的特征是內存中只允許存放一個作業,即當前正在運行的作業才能駐留內存,作業的執行順序是先進先出,即按順序執行。
由于在單道批處理系統中,一個作業單獨進入內存并獨占系統資源,直到運行結束后下一個作業才能進入內存,當作業進行I/O操作時,CPU只能處于等待狀態,因此,CPU利用率較低,尤其是對于I/O操作時間較長的作業。為了提高CPU的利用率,在單道批處理系統的基礎上引入了多道程序設計(multiprogramming)技術,這就形成了多道批處理系統,即在內存中可同時存在若干道作業,作業執行的次序與進入內存的次序無嚴格的對應關系,因為這些作業是通過一定的作業調度算法來使用CPU的,一個作業在等待I/O處理時,CPU調度另外一個作業運行,因此CPU的利用率顯著地提高了。
現在的批處理系統主要指多道批處理系統,它通常用在以科學計算為主的大中型計算機上,由于多道程序能交替使用CPU,提高了CPU及其他系統資源的利用率,同時也提高了系統的效率。多道批處理系統的缺點是延長了作業的周轉時間,用戶不能進行直接干預,缺少交互性,不利于程序的開發與調試。
批處理系統的特點:
多道-在內存中同時存放多個作業,使之同時處于運行狀態,這些作業共享CPU和外部設備等資源。
成批-用戶和他的作業之間沒有交互性。用戶自己不能干預自己的作業的運行,發現作業錯誤不能及時改正。
批處理系統的目的是提高系統吞吐量和資源的利用率。
多道處理系統的優點是由于系統資源為多個作業所共享,其工作方式是作業之間自動調度執行。并在運行過程中用戶不干預自己的作業,從而大大提高了系統資源的利用率和作業吞吐量。其缺點是無交互性,用戶一旦提交作業就失去了對其運行的控制能力,而且是批處理的,作業周轉時間長,用戶使用不方便。
echo 命令
打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo
批處理與聯機處理
批處理與聯機處理
命令將顯示當前回顯設置。
語法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在實際應用中我們會把這條命令和重定向符號(也稱為管道符號,一般用> >> ^)結合來實現輸入一些命令到特定的文件中。
rem 命令
注釋命令,類似于在C語言中的/*--------*/,它并不會被執行,只是起一個注釋的作用,只有在編輯批處理時才會被看到,主要用于方便修改。
:: 也具有rem的功能
但::和rem還是有區別的,當關閉回顯時,rem和::后的內容都不會顯示。
順序批處理
順序批處理
但是當打開回顯時,rem
后的內容會顯示出來,然而::后的內容仍然不會顯示。
Rem [注釋內容]
示例:Rem 你好。
pause 命令
暫停命令。運行 Pause 命令時,將顯示下面的消息:
Press any key to continue. . .(或:請按任意鍵繼續. . .)
示例:
@echo off
:begin
copy G:*.* d:\back
echo 請插入另一張光盤...
pause
goto begin
在這個例子中,驅動器 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 命令
跳轉命令。程序指針跳轉到指定的標簽,從標簽后的第一條命令開始繼續執行批處理程序。
語法:goto label (label是參數,指定所要轉向的批處理程序中的行。)
示例:
:1
start
goto 1
運行以上這段命令,就會打開很多個窗口(用來整人相當不錯)。這段命令的意思是,先用start命令打開窗口,再用goto 1命令轉到1標簽,即第一行后面的命令。注意標簽名字前面要加上英文的冒號。
標簽的名字可以隨便起,但是最好是有意義的字母啦,字母前加個:
選擇批處理
選擇批處理
用來表示這個字母是標簽,goto
命令就是根據這個:來尋找下一步跳到到那里。最好有一些說明這樣別人看起來才會理解你的意圖啊。
set 命令
顯示、設置或刪除變量。
顯示變量:set 或 set s 前者顯示批處理當前已定義的所有變量及其值,后者顯示所有以s開頭的變量及值。
設置和調用變量:例如set aa=abcd,就是把aa定義為abcd。如果要調用這個變量,就把aa兩邊加上個百分號。
例如:
set aa=abcd
echo %aa%
pause
運行這段命令就會顯示“abcd”。
刪除變量:set aa= 此句命令即可刪除變量aa。若變量aa已被定義,則刪除變量aa;若aa尚未定義,則此句命令無實質意義。
需要說明的是,批處理中的變量是不區分類型的,不需要像C語言中的變量那樣還要區分int、float、char等。比如執行set aa=345后,變量aa的值既可以被視為數字345,也可以被視為字符串345。
set命令具有擴展功能,如用作交互輸入、字符串處理、數值計算等,屬于高級命令范疇。
學習有關批處理的一些比較瑣碎、但又比較有價值的一些知識,運用這些知識后,才有條件更好的實現的批處理的功能,并能使批處理擺脫黑白世界而顯得更加多姿多彩。
一環境變量
所謂“環境變量”,實際上就是C語言里面的“變量”的意思。批處理的變量可以分為兩類,由系統定義的系統變量和由用戶根據需要自定義的用戶變量。
【 1.系統變量】
批處理的一些變量是由操作系統事先定義好的,可以適用于任何批處理,我們稱這些特殊的變量為“系統變量”。系統變量有很多個,包括硬件類、操作系統類、文件路徑類、系統時間類等。要查看所有的系統變量,請新打開一個cmd窗口,輸入set回車即可。對幾個比較常用的變量解釋如下:
ComputerName 計算機名,即右鍵我的電腦--屬性--計算機名 選項卡中的“完整的計算機名稱”
ComSpeccmd.exe完整路徑名
HomeDrive系統分區盤符,一般都是C盤,故而HomeDrive=C:
Path可執行文件默認搜索路徑。這個東東非常重要!待會兒單獨講解…
ProgramFiles 就是系統的Program Files的路徑啦,一般都是C:\Program Files,這就是安裝軟件時默認的安裝路徑了
Prompt 個性化設置cmd提示符的必備武器!不過,我沒怎么用過~
SystemDrive 包含系統根目錄的分區,其實就是HomeDrive了
SystemRoot 系統根目錄路徑,一般都是C:\WINDOWS
Temp、Tmp 文件、程序等可使用的臨時目錄,默認是C:\WINDOWS\Temp或Tmp。幾乎所有的程序在運行時都會在這個目錄里面“臨時”寫入文件。一般情況下,程序寫入的臨時文件都應該被該程序刪除,可惜的是,大部分的程序都很健忘,導致這個文件夾占據的空間越來越大,自然也就使我們的系統增肥嘍。所以,我們要把它修改到其他分區,并且時時的清理里面的臨時文件。
UserName 當前用戶名,即所登陸的賬戶名
UserProfile 當前用戶的配置目錄,一般都是C:\Documents and Settings\%UserName%。默認情況下,我們的桌面就是這個目錄下面的“桌面”文件夾;我的文檔就是這個目錄下面的“My Documents”文件夾。所以啦,往桌面上或我的文檔里面放東西就是放到這個文件夾下面了,也就是放到C盤了,重裝系統時要覆蓋C盤內容的,所以桌面上或我的文檔里面的東西當然就會Gone with the Wind了~解決方法有兩個,一是保持良好的習慣,不把重要文件放到這兩個地方;二是,修改默認設置,將這兩個文件夾都移到其他分區。
WinDir操作系統路徑,其實就是SystemRoot了
二用戶變量
編寫批處理程序時,用戶根據需要自己定義的變量稱之為用戶變量。用戶變量類似于C語言里面的變量,僅僅在定義該變量的程序中有效。
用戶變量由set命令定義,這是批處理中非常非常重要的一個操作,從而使set命令成為批處理里面使用頻率最高的幾個命令之一。關于set命令的使用,參考set /?,本教程也會在后面對其進行講解。
【 3.變量引用 】
前面的幾節課里面,我們已經看到了如何引用變量,即直接用變量名操作變量,通過"%"或"!"來獲取變量的值。其中,只有在for語句里面重復對同一變量多次賦值時才需要使用"!",并且在使用"!"調用變量時,要首先“啟用延遲環境變量擴充”,啟動命令為:SetLocal EnableDelayedExpansion。另外需要說明的是,“啟用延遲環境變量擴充”后,所有的"!"都將被視為“取變量值”的特殊符號,即使用"^!"也不能輸出符號"!"。若要輸出"!",則需要“停用延遲環境變量擴充”,命令為:SetLocal DisableDelayedExpansion
三參數
跟C語言類似,在調用函數或其他批處理時可能需要傳遞參數。批處理的參數傳遞分為直接和間接兩種傳遞參數的方法。
【 1.直接傳遞 】
直接傳遞參數,即在使用call命令時,不使用任何參數,在子函數或子批處理里面直接對主函數(也稱父批處理)里面的變量進行修改。這跟匯編語言里面的參數傳遞方式類似。
直接傳遞參數舉例:
===============================================
@echo off
setlocal enabledelayedexpansion
set var=aCdehiM,?mnrstW y
echo %var%
call :deal
setlocal disabledelayedexpansion
set var=%var:?=!%
echo %var%
pause>nul
exit
:deal
set tm=!var!
set var=
for %%i in (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 (
set var=!var!!tm:~%%i,1!
)
goto :eof
===============================================
可以發現,當我們把變量var作為參數賦予子函數:deal后,子函數對var的值進行了修改;當子函數返回后,主函數里面的var的值就已經是子函數里面var被修改后的值了。
該例子中,使用了本節課前面講到的setlocal enabledelayedexpansion和setlocal disabledelayedexpansion,前者保證了var在for循環里面能夠根據我們的意愿進行處理,后者保證了能夠正確輸出符號"!"。另外例子中還使用了命令set,利用set對字符串進行了處理。還有一個地方使用了語句goto :eof,該語句相當于C語言里面的return或匯編語言里面的RET,即子程序返回命令。需要說明的是,當子函數本身就在批處理文件的末尾的話,我們是可以省略這句話的,比如將此例的goto :eof刪除是不會產生任何影響的。
【 2.間接傳遞 】
間接傳遞參數,即在使用call命令時,在其后面添加參數,形如call {[:label][ChildBatch]} Parameter1 Parameter2 ... ParameterN。這跟C語言里面傳遞參數的格式類似。不同于C語言,批處理中的子函數不需要定義形參,更不需要指定參數的個數。傳遞過來的參數,在子函數或子批處理里面是以%1~%9的形式表示的,即%1~%9分別表示傳遞過來的第1~9個參數。
===============================================
@echo off
call :deal aaa bbb "c c" ddd eee
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舉例:
===============================================
@echo off
reg add HKCU /v try /f>nul
reg delete HKCU /v try /f
if errorlevel 0 (echo刪除成功!) else (echo 刪除失敗!)
reg delete HKCU /v try /f
if %errorlevel%==0 (echo 刪除成功!) else (echo 刪除失敗!)
pause>nul
===============================================
上面例子中,由于第一成功的刪除了注冊表,導致第二次因為找不到注冊表而宣告失敗。同時我們也看到了errorlevel的使用方法,即if errorlevel 0和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中的批處理
可別告訴我您不知道什么是批處理,當面對一大堆需要重復操作的數據時,往往讓我們感到頭大,這時候我們會想到批處理[1] ,那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、 編寫代碼
import arcpy,os
inFCs = arcpy.GetParameterAsText(0)
outWS = arcpy.GetParameterAsText(1)
dist = arcpy.GetParameterAsText(2)
inFCs = inFCs.split(";")
for inFC in inFCs:
fileName =os.path.split(inFC)[1]
arcpy.Buffer_analysis(inFC,outWS + "\\" + fileName, str(dist) + "meter")
上面這段代碼,要求用戶自己設置輸入數據、輸出數據、緩沖區寬度(單位為米)。這里輸出緩沖區數據的名稱和輸入數據的名稱一樣,如果不想要這樣,可以進一步修改代碼。