行業資(zī)訊
   
批處理Batch
發布時間:2017-10-26
浏覽人數:2297

 批處理(Batch),也稱爲批處理腳本。顧名思義,批處理就是對某對象進行批量的處理,通常被認爲是一(yī)種簡化的腳本語言,它應用于DOS和Windows系統中(zhōng)。批處理文件的擴展名爲bat 。目前比較常見的批處理包含兩類:DOS批處理和PS批處理。PS批處理是基于強大(dà)的圖片編輯軟件Photoshop的,用來批量處理圖片的腳本;而DOS批處理則是基于DOS命令的,用來自動地批量地執行DOS命令以實現特定操作的腳本。更複雜(zá)的情況,需要使用if、for、goto等命令控制程式的運行過程,如同C、Basic等高級語言一(yī)樣。如果需要實現更複雜(zá)的應用,利用外(wài)部程式是必要的,這包括系統本身提供的外(wài)部命令和第三方提供的工(gōng)具或者軟件。批處理程序雖然是在命令行環境中(zhōng)運行,但不僅僅能使用命令行軟件,任何當前系統下(xià)可運行的程序都可以放(fàng)在批處理文件中(zhōng)運行。

有些人認爲批處理語言的含義要比上面的描述更廣泛,還包括許多軟件自帶的批處理語言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所内置的批處理語言的功能,用戶可通過它們讓相應的軟件執行自動化操作(例如調整某個資(zī)料夾所有 PSD 圖檔的解析度)。 而這類批處理語言也大(dà)多提供把一(yī)系列操作錄制爲批處理文件的功能,這樣用戶不必寫程式就能得到批處理程序。
批處理系統(batch processing system)中(zhōng),一(yī)個作業可以長時間地占用cpu。而分(fēn)時系統中(zhōng),一(yī)個作業隻能在一(yī)個時間片(Time Slice,一(yī)般取100ms)的時間内使用cpu。
批處不是嚴格意義上的操作系統,雖然可用Monitor監督,可用彙編語言開(kāi)發,但也隻是操作系統的原型。
所謂批處理(batch processing )就是将作業按照它們的性質分(fēn)組(或分(fēn)批),然後再成組(或成批)地提交給計算機系統,由計算機自動完成後再輸出結果,從而減少作業建立和結束過程中(zhōng)的時間浪費(fèi)。根據在内存中(zhōng)允許存放(fàng)的作業數,批處理系統又(yòu)分(fēn)爲單道批處理系統和多道批處理系統。早期的批處理系統屬于單道批處理系統,其目的是減少作業間轉換時的人工(gōng)操作,從而減少CPU的等待時間。它的特征是内存中(zhōng)隻允許存放(fàng)一(yī)個作業,即當前正在運行的作業才能駐留内存,作業的執行順序是先進先出,即按順序執行。
由于在單道批處理系統中(zhōng),一(yī)個作業單獨進入内存并獨占系統資(zī)源,直到運行結束後下(xià)一(yī)個作業才能進入内存,當作業進行I/O操作時,CPU隻能處于等待狀态,因此,CPU利用率較低,尤其是對于I/O操作時間較長的作業。爲了提高CPU的利用率,在單道批處理系統的基礎上引入了多道程序設計(multiprogramming)技術,這就形成了多道批處理系統,即在内存中(zhōng)可同時存在若幹道作業,作業執行的次序與進入内存的次序無嚴格的對應關系,因爲這些作業是通過一(yī)定的作業調度算法來使用CPU的,一(yī)個作業在等待I/O處理時,CPU調度另外(wài)一(yī)個作業運行,因此CPU的利用率顯著地提高了。
現在的批處理系統主要指多道批處理系統,它通常用在以科學計算爲主的大(dà)中(zhōng)型計算機上,由于多道程序能交替使用CPU,提高了CPU及其他系統資(zī)源的利用率,同時也提高了系統的效率。多道批處理系統的缺點是延長了作業的周轉時間,用戶不能進行直接幹預,缺少交互性,不利于程序的開(kāi)發與調試。
批處理系統的特點:
多道-在内存中(zhōng)同時存放(fàng)多個作業,使之同時處于運行狀态,這些作業共享CPU和外(wài)部設備等資(zī)源。
成批-用戶和他的作業之間沒有交互性。用戶自己不能幹預自己的作業的運行,發現作業錯誤不能及時改正。
批處理系統的目的是提高系統吞吐量和資(zī)源的利用率。
多道處理系統的優點是由于系統資(zī)源爲多個作業所共享,其工(gōng)作方式是作業之間自動調度執行。并在運行過程中(zhōng)用戶不幹預自己的作業,從而大(dà)大(dà)提高了系統資(zī)源的利用率和作業吞吐量。其缺點是無交互性,用戶一(yī)旦提交作業就失去(qù)了對其運行的控制能力,而且是批處理的,作業周轉時間長,用戶使用不方便。
echo 命令
打開(kāi)回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo
批處理與聯機處理
批處理與聯機處理
命令将顯示當前回顯設置。
語法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在實際應用中(zhōng)我(wǒ)們會把這條命令和重定向符号(也稱爲管道符号,一(yī)般用> >> ^)結合來實現輸入一(yī)些命令到特定的文件中(zhōng)。
rem 命令
注釋命令,類似于在C語言中(zhōng)的/*--------*/,它并不會被執行,隻是起一(yī)個注釋的作用,隻有在編輯批處理時才會被看到,主要用于方便修改。
:: 也具有rem的功能
但::和rem還是有區别的,當關閉回顯時,rem和::後的内容都不會顯示。
順序批處理
順序批處理
但是當打開(kāi)回顯時,rem
後的内容會顯示出來,然而::後的内容仍然不會顯示。
Rem [注釋内容]
示例:Rem 你好。
pause 命令
暫停命令。運行 Pause 命令時,将顯示下(xià)面的消息:
Press any key to continue. . .(或:請按任意鍵繼續. . .)
示例:
@echo off
:begin
copy G:*.* d:\back
echo 請插入另一(yī)張光盤...
pause
goto begin
在這個例子中(zhōng),驅動器 G 中(zhōng)磁盤上的所有文件均複制到d:\back中(zhōng)。顯示的注釋提示您将另一(yī)張光盤
盤放(fàng)入驅動器 G 時,pause 命令會使程序挂起,以便您更換光盤,然後按任意鍵繼續處理。
call 命令
從一(yī)個批處理程序調用另一(yī)個批處理程序,并且不終止父批處理程序。call
批處理功能界面
批處理功能界面
命令接受用作調用目标的
标簽。如果在腳本或批處理文件外(wài)使用 Call,它将不會在命令行起作用。
語法
call [路徑文件名] [标簽]]
參數
[Drive:}[Path] FileName
指定要調用的批處理程序的位置和名稱。
start 命令
調用外(wài)部程序,所有的DOS命令和命令行程序都可以由start命令來調用。
如:startcalc.exe即可打開(kāi)Windows的計算器。
常用參數:
MIN 開(kāi)始時窗口最小(xiǎo)化
SEPARATE 在分(fēn)開(kāi)的空間内開(kāi)始 16 位 Windows 程序
HIGH 在 HIGH 優先級類别開(kāi)始應用程序
REALTIME 在 REALTIME 優先級類别開(kāi)始應用程序
WAIT 啓動應用程序并等候它結束
parameters 這些爲傳送到命令/程序的參數
執行的應用程序是 32-位 GUI 應用程序時,CMD.EXE 不等應用程序
常見批處理案例
常見批處理案例
終止就返回命令提示。如果在命令
腳本内執行,該新行爲則不會發生(shēng)。
goto 命令
跳轉命令。程序指針跳轉到指定的标簽,從标簽後的第一(yī)條命令開(kāi)始繼續執行批處理程序。
語法:goto label (label是參數,指定所要轉向的批處理程序中(zhōng)的行。)
示例:
:1
start
goto 1
運行以上這段命令,就會打開(kāi)很多個窗口(用來整人相當不錯)。這段命令的意思是,先用start命令打開(kāi)窗口,再用goto 1命令轉到1标簽,即第一(yī)行後面的命令。注意标簽名字前面要加上英文的冒号。
标簽的名字可以随便起,但是最好是有意義的字母啦,字母前加個:
選擇批處理
選擇批處理
用來表示這個字母是标簽,goto
命令就是根據這個:來尋找下(xià)一(yī)步跳到到那裏。最好有一(yī)些說明這樣别人看起來才會理解你的意圖啊。
set 命令
顯示、設置或删除變量。
顯示變量:set 或 set s 前者顯示批處理當前已定義的所有變量及其值,後者顯示所有以s開(kāi)頭的變量及值。
設置和調用變量:例如set aa=abcd,就是把aa定義爲abcd。如果要調用這個變量,就把aa兩邊加上個百分(fēn)号。
例如:
set aa=abcd
echo %aa%
pause
運行這段命令就會顯示“abcd”。
删除變量:set aa= 此句命令即可删除變量aa。若變量aa已被定義,則删除變量aa;若aa尚未定義,則此句命令無實質意義。
需要說明的是,批處理中(zhōng)的變量是不區分(fēn)類型的,不需要像C語言中(zhōng)的變量那樣還要區分(fēn)int、float、char等。比如執行set aa=345後,變量aa的值既可以被視爲數字345,也可以被視爲字符串345。
set命令具有擴展功能,如用作交互輸入、字符串處理、數值計算等,屬于高級命令範疇。
學習有關批處理的一(yī)些比較瑣碎、但又(yòu)比較有價值的一(yī)些知(zhī)識,運用這些知(zhī)識後,才有條件更好的實現的批處理的功能,并能使批處理擺脫黑白(bái)世界而顯得更加多姿多彩。
一(yī)環境變量
所謂“環境變量”,實際上就是C語言裏面的“變量”的意思。批處理的變量可以分(fēn)爲兩類,由系統定義的系統變量和由用戶根據需要自定義的用戶變量。
【 1.系統變量】
批處理的一(yī)些變量是由操作系統事先定義好的,可以适用于任何批處理,我(wǒ)們稱這些特殊的變量爲“系統變量”。系統變量有很多個,包括硬件類、操作系統類、文件路徑類、系統時間類等。要查看所有的系統變量,請新打開(kāi)一(yī)個cmd窗口,輸入set回車(chē)即可。對幾個比較常用的變量解釋如下(xià):
ComputerName 計算機名,即右鍵我(wǒ)的電腦--屬性--計算機名 選項卡中(zhōng)的“完整的計算機名稱”
ComSpeccmd.exe完整路徑名
HomeDrive系統分(fēn)區盤符,一(yī)般都是C盤,故而HomeDrive=C:
Path可執行文件默認搜索路徑。這個東東非常重要!待會兒單獨講解…
ProgramFiles 就是系統的Program Files的路徑啦,一(yī)般都是C:\Program Files,這就是安裝軟件時默認的安裝路徑了
Prompt 個性化設置cmd提示符的必備武器!不過,我(wǒ)沒怎麽用過~
SystemDrive 包含系統根目錄的分(fēn)區,其實就是HomeDrive了
SystemRoot 系統根目錄路徑,一(yī)般都是C:\WINDOWS
Temp、Tmp 文件、程序等可使用的臨時目錄,默認是C:\WINDOWS\Temp或Tmp。幾乎所有的程序在運行時都會在這個目錄裏面“臨時”寫入文件。一(yī)般情況下(xià),程序寫入的臨時文件都應該被該程序删除,可惜的是,大(dà)部分(fēn)的程序都很健忘,導緻這個文件夾占據的空間越來越大(dà),自然也就使我(wǒ)們的系統增肥喽。所以,我(wǒ)們要把它修改到其他分(fēn)區,并且時時的清理裏面的臨時文件。
UserName 當前用戶名,即所登陸的賬戶名
UserProfile 當前用戶的配置目錄,一(yī)般都是C:\Documents and Settings\%UserName%。默認情況下(xià),我(wǒ)們的桌面就是這個目錄下(xià)面的“桌面”文件夾;我(wǒ)的文檔就是這個目錄下(xià)面的“My Documents”文件夾。所以啦,往桌面上或我(wǒ)的文檔裏面放(fàng)東西就是放(fàng)到這個文件夾下(xià)面了,也就是放(fàng)到C盤了,重裝系統時要覆蓋C盤内容的,所以桌面上或我(wǒ)的文檔裏面的東西當然就會Gone with the Wind了~解決方法有兩個,一(yī)是保持良好的習慣,不把重要文件放(fàng)到這兩個地方;二是,修改默認設置,将這兩個文件夾都移到其他分(fēn)區。
WinDir操作系統路徑,其實就是SystemRoot了
二用戶變量
編寫批處理程序時,用戶根據需要自己定義的變量稱之爲用戶變量。用戶變量類似于C語言裏面的變量,僅僅在定義該變量的程序中(zhōng)有效。
用戶變量由set命令定義,這是批處理中(zhōng)非常非常重要的一(yī)個操作,從而使set命令成爲批處理裏面使用頻(pín)率最高的幾個命令之一(yī)。關于set命令的使用,參考set /?,本教程也會在後面對其進行講解。
【 3.變量引用 】
前面的幾節課裏面,我(wǒ)們已經看到了如何引用變量,即直接用變量名操作變量,通過"%"或"!"來獲取變量的值。其中(zhōng),隻有在for語句裏面重複對同一(yī)變量多次賦值時才需要使用"!",并且在使用"!"調用變量時,要首先“啓用延遲環境變量擴充”,啓動命令爲:SetLocal EnableDelayedExpansion。另外(wài)需要說明的是,“啓用延遲環境變量擴充”後,所有的"!"都将被視爲“取變量值”的特殊符号,即使用"^!"也不能輸出符号"!"。若要輸出"!",則需要“停用延遲環境變量擴充”,命令爲:SetLocal DisableDelayedExpansion
三參數
跟C語言類似,在調用函數或其他批處理時可能需要傳遞參數。批處理的參數傳遞分(fēn)爲直接和間接兩種傳遞參數的方法。
【 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
===============================================
可以發現,當我(wǒ)們把變量var作爲參數賦予子函數:deal後,子函數對var的值進行了修改;當子函數返回後,主函數裏面的var的值就已經是子函數裏面var被修改後的值了。
該例子中(zhōng),使用了本節課前面講到的setlocal enabledelayedexpansion和setlocal disabledelayedexpansion,前者保證了var在for循環裏面能夠根據我(wǒ)們的意願進行處理,後者保證了能夠正确輸出符号"!"。另外(wài)例子中(zhōng)還使用了命令set,利用set對字符串進行了處理。還有一(yī)個地方使用了語句goto :eof,該語句相當于C語言裏面的return或彙編語言裏面的RET,即子程序返回命令。需要說明的是,當子函數本身就在批處理文件的末尾的話(huà),我(wǒ)們是可以省略這句話(huà)的,比如将此例的goto :eof删除是不會産生(shēng)任何影響的。
【 2.間接傳遞 】
間接傳遞參數,即在使用call命令時,在其後面添加參數,形如call {[:label][ChildBatch]} Parameter1 Parameter2 ... ParameterN。這跟C語言裏面傳遞參數的格式類似。不同于C語言,批處理中(zhōng)的子函數不需要定義形參,更不需要指定參數的個數。傳遞過來的參數,在子函數或子批處理裏面是以%1~%9的形式表示的,即%1~%9分(fēn)别表示傳遞過來的第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參數表示法的用法。參數列表中(zhōng)包含空格的依舊(jiù)要用雙引号(")引起來;另外(wài),也可以看到,%0已經變成了子函數的标号了,而不是父批處理的文件名全稱。
【 3.區别 】
這兩種參數傳遞方法本質上是沒有區别的,形式上,直接傳遞直接對原變量進行操作,丢失了原變量的值;間接傳遞則通過%n對原變量進行了簡單的備份,并且通用性更強,即不限定原變量的名稱。另外(wài),使用%n還有一(yī)個非常大(dà)的好處,就是可以通過%~*i來加強處理變量的能力。關于%~*i,詳細内容參見for /?。
針對二者的差别,可以根據情況決定使用哪種傳遞方式:
--1.作爲參數的變量名固定、且在子函數中(zhōng)不需要對其進行備份的情況下(xià),使用直接傳遞法;
--2.若将子函數作爲一(yī)個通用的程序模塊,以适應于對不同變量的處理,或者作爲參數的變量不需要備份時,使用間接傳遞法。
具體(tǐ)使用哪種方法,還需根據實際情況或使用習慣進行選擇。
四返回值
有些命令在執行之後将會返回一(yī)定的錯誤值(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
===============================================
上面例子中(zhōng),由于第一(yī)成功的删除了注冊表,導緻第二次因爲找不到注冊表而宣告失敗。同時我(wǒ)們也看到了errorlevel的使用方法,即if errorlevel 0和if %errorlevel%==0是一(yī)樣的。也許你注意到了,裏面還有個笑臉呢~O(∩_∩)O哈哈~這就是ASCII碼啦,後面跟你講啊…
一(yī)般情況下(xià),程序或命令成功執行時,返回的errorlevel是0,錯誤時返回1或更高的值。當然,有些命令是沒有返回值的,這點需要注意。
嗯,有沒有想起前面有個類似的東西啊?對了,那就是||和&&;了,這兩個符号就是根據errorlevel的值來進行邏輯判斷的。
五ASCII碼
前面的例子中(zhōng),我(wǒ)們已經使用過一(yī)次ASCII碼了,也就是那個笑臉。ASCII碼是圖形化的符号,可以用來點綴我(wǒ)們的批處理的。
在cmd窗口中(zhōng)我(wǒ)們可以通過任意一(yī)個字符的ASCII碼來輸入該字符,比如Ctrl+G、Ctrl+N等,字母a-z對應ASCII碼的97-122。對于ASCII碼大(dà)于26的字符,可以通過這個方法來輸入:按住Alt鍵不松,通過小(xiǎo)鍵盤輸入ASCII碼的十進制值,松開(kāi)Alt鍵即可。
ArcGIS中(zhōng)的批處理
可别告訴我(wǒ)您不知(zhī)道什麽是批處理,當面對一(yī)大(dà)堆需要重複操作的數據時,往往讓我(wǒ)們感到頭大(dà),這時候我(wǒ)們會想到批處理[1]  ,那ArcGIS給大(dà)家提供了哪些批處理的方法呢,讓我(wǒ)們拭目以待。
假設我(wǒ)們需要給道路建立緩沖區,設計到的工(gōng)具爲Buffer。
第一(yī)種情況,一(yī)個圖層中(zhōng)不同要素建立不同大(dà)小(xiǎo)的緩沖區
不同類型的道路,我(wǒ)們需要建立不同大(dà)小(xiǎo)的緩沖區,比如,一(yī)級道路建立10米的緩沖區,二級道路建立15米的緩沖區,三級道建立20米的緩沖區。
步驟:
1、 首先應該保證你的道路數據裏面有一(yī)個屬性字段是用來存儲Buffer寬度信息的。
2、 應用Buffer工(gōng)具,在對應的參數位置選擇相應字段即可。
第二種情況,不同的圖層建立不同大(dà)小(xiǎo)的緩沖區
假設還有其他不同的數據,不僅僅是道路,這些圖層都需要建立緩沖區。
步驟:
1、 找到Buffer工(gōng)具,右鍵,選擇Batch,打開(kāi)批處理面闆。從該面闆上我(wǒ)們可以發現,參數與我(wǒ)們打開(kāi)Buffer的參數是一(yī)樣的,這個時候是不是可以考慮在EXCEL中(zhōng)批量編輯好,然後複制過來呢
2、 在Excel中(zhōng)編輯需要的數據。
3、 将在Excel中(zhōng)編輯的數據複制到Buffer的批處理面闆中(zhōng)來。此處需要注意,如果要複制10行數據,需要在批處理面闆中(zhōng)先選中(zhōng)10行,右鍵單擊,選擇“paste”。
4、 點擊OK即可。
如果想要每個圖層中(zhōng)每種類型的數據的緩沖區寬度都不一(yī)樣,該怎樣處理的?這個留給您來嘗試吧,原理很簡單,就是找到參數位置,寫上對應的字段即可。
第三種情況,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")
上面這段代碼,要求用戶自己設置輸入數據、輸出數據、緩沖區寬度(單位爲米)。這裏輸出緩沖區數據的名稱和輸入數據的名稱一(yī)樣,如果不想要這樣,可以進一(yī)步修改代碼。
新聞資(zī)訊
聯系我(wǒ)們

聯系電話(huà):020-87518715

聯系郵箱:services@picusit.com

公司名稱:鄭州易科計算機服務有限公司

公司地址:廣州市天河區龍口西路100号中(zhōng)明大(dà)廈1601

熱線咨詢電話(huà):

020-87518715

公司地址:
廣州市天河區龍口西路100号中(zhōng)明大(dà)廈1601
手機掃碼查看更多
如有問題咨詢請及時與我(wǒ)們溝通,我(wǒ)們會爲您詳細解答!
Copyright © 鄭州易科計算機服務有限公司 地址:廣州市天河區龍口西路100号中(zhōng)明大(dà)廈1601

網站首頁

公司介紹

服務項目

成功案例

技術動态

聯系方式