釋義,命令簡介,echo 命令,rem 命令,pause 命令,call 命令,start 命令,goto 命令,set 命令,符號簡介,回顯禁止 @,重定向1 >;與>>,重定向2 <,管道符號 |,轉義符 ^,邏輯命令符,命令釋義,資料夾管理,檔案管理,網路命令,系統管理,語句結構,if語句(選擇結構),for語句(循環結構),字元串,截取字元串,替換字元串,字元串合併,擴充字元串,數值計算,批處理,一環境變數,二用戶變數,三參數,四返回值,五ASCII碼,ArcGIS中的批處理,
釋義 批處理是一種簡化的
腳本語言 ,也稱作宏。它套用於DOS和Windows系統中,它是由DOS或者Windows系統內嵌的命令
解釋器 (通常是COMMAND. COM或者CMD.EXE)解釋運行。類似於Unix中的
Shell腳本 。批處理檔案具有.
bat 或者.cmd的擴展名,其最簡單的例子,是逐行書寫在命令行中會用到的各種命令。更複雜的情況,需要使用if,for,goto等命令控制程式的運行過程,如同C,Basic等中高級語言一樣。如果需要實現更複雜的套用,利用外部程式是必要的,這包括系統本身提供的
外部命令 和第三方提供的工具或者
軟體 。批處理檔案,或稱為
批處理程式 ,是由一條條的DOS命令組成的普通文本檔案,可以用
記事本 直接編輯或用DOS命令創建,也可以用DOS下的
文本編輯器 Edit.exe來編輯。在“命令提示”下鍵入批處理檔案的名稱,或者雙擊該批處理檔案,系統就會調用Cmd.exe運行該
批處理程式 。一般情況下,每條命令占據一行;當然也可以將多條命令用特定符號(如:&;、&&;、|、||等)分隔後寫入同一行中;還有的情況就是像if、for等較高級的命令則要占據幾行、幾十甚至幾百行的空間。系統在解釋運行
批處理程式 時,首先掃描整個批處理程式,然後從第一行代碼開始向下逐句執行所有的命令,直至程式結尾或遇見exit命令或出錯意外退出。
批處理檔案圖示 命令行視窗 命令簡介 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
pause
goto begin
在這個例子中,驅動器 G 中磁碟上的所有檔案均複製到d:\back中。顯示的注釋提示您將另一張
光碟 盤放入驅動器 G 時,pause 命令會使程式掛起,以便您更換
光碟 ,然後按
任意鍵 繼續處理。
call 命令 從一個
批處理程式 調用另一個批處理程式,並且不終止父批處理程式。call命令接受用作調用目標的
批處理功能界面 標籤。如果在
腳本 或批處理檔案外使用 Call,它將不會在命令行起作用。
語法
參數
[Drive:}[Path] FileName
start 命令 調用外部程式,所有的DOS命令和命令行程式都可以由start命令來調用。
常用參數:
MIN 開始時視窗最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程式
REALTIME 在 REALTIME 優先權類別開始
應用程式 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命令具有擴展功能,如用作互動輸入、字元串處理、數值計算等,屬於高級命令範疇。
符號簡介 回顯禁止 @ 表示不顯示@後面的命令,在入侵過程中(例如使用批處理來格式化敵人的硬碟)自然不能讓對方看到你使用的命令啦。
批處理過程 @用法舉例:通過運行批處理檔案對比pause和@pause命令即可明了@的效果。
重定向1 >;與>> 將輸出信息重定向到指定的設備或檔案。系統默認輸出到顯示器。
如:echo aaaaa>a.txt 即可將本在顯示器上顯示的信息aaaaa輸出到檔案a.txt中,
螢幕 上沒有任何顯示。如果檔案a.txt本來已經存在,該命令將首先擦除a.txt中的所有信息,然後寫入信息aaaaa;若a.txt本來就不存在,該命令即可新建一個a.txt檔案,並寫入信息aaaaa。
echo aaaaa>>a.txt 類似於echo aaaaa>a.txt。區別在於:如果a.txt本已存在,>a.txt會擦除a.txt中的原有內容,而>>a.txt並不擦除原有內容,僅在a.txt檔案的末尾添加信息aaaaa。a.txt不存在時,二者沒有差別。
需要注意的是,因為數字的特殊性,在echo輸出數字時,請在後面加上空格,例如:echo 9313 >a.txt,否則有可能造成輸出不完整。
重定向2 < 將輸入信息來源重定向為指定的設備或檔案。系統默認從顯示器讀取輸入信息。
重定向使用舉例:
=========================================
@echo off
echo abcdefg——這是檔案a.txt中的信息>a.txt
set /p ifo=
cls
echo %ifo%
set /p ifo=<a.txt
echo 【 從檔案a.txt獲得的輸入信息 】
echo %ifo%
pause>nul
=========================================
讀者觀察命令與輸出即可體會到重定向的功能和效果。
管道符號 | 將管道符號前面命令的輸出結果重定向輸出到管道符號後面的命令中去,作為後面命令的輸入。使用格式為:command_1|command_2
管道符號使用舉例:
=========================================
@echo off
echo aaaa>a.txt
del /p a.txt
pause
=========================================
@echo off
echo aaaa>a.txt
echo y|del /p a.txt
pause
=========================================
對比以上兩個批處理執行結果,讀者即可明白管道符的用法和效果。
需要說明的是,上面del命令添加開關/p只是為了讓讀者明白管道符號的使用方法,實際
刪除檔案 時不加/p開關即可實現無提示直接刪除。
轉義符 ^ 將特殊符號轉化為一般符號,即剝離特殊符號的特殊地位。特殊符號指:| & > <
比如,如果我們想輸出符號“>;”,直接用命令 echo > 是不行的,必須修改為 echo ^>;。其餘幾個特殊符號類似需要有同樣的處理。
=========================================
@echo off
echo aaaa>a.txt
echo 第一句echo執行完畢
echo aaaa^>a.txt
echo 第二句echo執行完畢
pause
=========================================
比較上面的兩句echo,第一句echo將信息aaaa輸出到了檔案a.txt,而第二句echo則在直接螢幕上顯示出aaaa>a.txt
邏輯命令符 邏輯命令符包括:&;、&&;、||
&-它的作用是用來連線n個DOS命令,並把這些命令按
順序執行 ,而不管是否有命令執行失敗;
&&-當&&;前面的命令成功執行時,執行&&;後面的命令,否則不執行;
||-當||前面的命令失敗時,執行||後面的命令,否則不執行。
=========================================
@echo off
echo ^|^|
reg add HKCU /v try /f||echo **失敗**
reg add HKCU1 /v try /f||echo **成功**
echo ^&^&
reg delete HKCU /v try /f&&echo **成功**
reg delete HKCU /v try /f&&echo **失敗**
echo ^&
reg delete HKCU /v try /f&echo **也許成功**
reg delete HKCU /v try /f&echo **也許失敗**
pause
=========================================
執行reg add或reg delete後,系統會給出執行結果;我們通過echo命令也給出了“執行結果”。對比系統和我們自己給出的結果,既可以驗證邏輯命令的判斷機理。
命令釋義 資料夾管理 md 創建目錄。
rd 刪除一個目錄。
dir 顯示目錄中的檔案和子目錄列表。
tree 以圖形顯示驅動器或路徑的資料夾結構。
copy 複製檔案和目錄樹。
檔案管理 type 顯示文本檔案的內容。
copy 將一份或多份檔案複製到另一個位置。
del 刪除一個或數個檔案。
move 移動檔案並
重命名 檔案和目錄。(Windows XP Home Edition中沒有)
replace 替換檔案。
find 搜尋字元串。
fc 比較兩個檔案或兩個檔案集並顯示它們之間的不同
網路命令 ping 進行網路連線測試、名稱解析
net 網路命令集及用戶管理
ipconfig顯示、修改TCP/IP設定
msg 給用戶傳送訊息
arp 顯示、修改區域網路的IP位址-
物理地址 映射列表
系統管理 at 安排在特定日期和時間運行命令和程式
shutdown立即或定時關機或重啟
tskill 結束進程
taskkill結束進程(比tskill高級,但WinXPHome版中無該命令)
tasklist顯示進程列表(Windows XP Home Edition中沒有)
sc 系統服務設定與控制
reg 註冊表控制台工具
powercfg控制系統上的電源設定
對於以上列出的所有命令,在cmd中輸入命令+/?即可查看該命令的幫助信息。如find /?
語句結構 類似於C語言,批處理也有它的語句結構。批處理的語句結構主要有
選擇結構 (if語句)、
循環結構 (for語句)等。
if語句(選擇結構) if語句實現條件判斷,包括字元串比較、存在判斷、定義判斷等。通過條件判斷,if語句即可以實現選擇功能。
1.字元串比較
if語句僅能夠對兩個字元(串)是否相同、先後順序進行判斷等。其命令格式為:
IF [not] string1 compare-op string2 command1 [else command2]
其中,比較操作符compare-op有以下幾類:
== - 等於
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
選擇開關/i則不區分字元串大小寫;選擇not項,則對判斷結果進行
邏輯非 。
字元串比較示例:
=
@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字元串相同!) else (echo 字元串不相同!)
if /i %str1% LSS %str2% (echo str1^<str2) else (echo str1^>=str2)
echo.
set /p choice=是否顯示當前時間?(y/n)
if /i not %choice% EQU n echo 當前時間是:%date% %time%
pause>nul
對於最後一個if判斷,當我們輸入n或N時的效果是一樣的,都不會顯示時間。如果我們取消開關/i,則輸入N時,依舊會顯示時間。
另外請注意一下幾個細節:1-echo str1^<str2和echo str1^>=str2;2-echo.。
2.存在判斷
存在判斷的功能是判斷檔案或資料夾是否存在。其命令格式為:
IF [NOT] EXIST filename command1 [else command2]
@echo off
if exist %0 echo 檔案%0是存在的!
if not exist %~df0 (
echo 資料夾%~df0不存在!
) else echo 資料夾%~df0存在!
pause>nul
這裡注意幾個地方:
1-存在判斷既可以判斷檔案也可以判斷資料夾;
2-%0即代表該批處理的全稱(包括驅動器盤符、
路徑 、檔案名稱和擴展類型);
3-%~df0是對%0的修正,只保留了其驅動器盤符和路徑,詳情請參考for /?,屬高級批處理範疇;
4-注意if語句的多行書寫,多行書寫要求command1的左括弧必須和if在同一行、else必須和command1的右括弧同行、command2的左括弧必須與else同行、command1和command2都可以有任意多行,即command可以是命令集。
3.定義判斷
定義判斷的功能是判斷
變數 是否存在,即是否已被定義。其命令格式為:
IF [not] DEFINED variable command1 [else command2]
存在判斷舉例:
@echo off
set var=111
if defined var (echo var=%var%) else echo var尚未定義!
set var=% %
if defined var (echo var=%var%) else echo var尚未定義!
pause>nul
對比可知,"set var="可以取消
變數 ,收回變數所占據的記憶體空間。
4.結果判斷
masm %1.asm
if errorlevel 1 pause & edit %1.asm
link %1.obj
先對
原始碼 進行彙編,如果失敗則暫停顯示
錯誤信息 ,並在按
任意鍵 後自動進入編輯界面;否則用link
程式連線 生成的obj檔案,這種用法是先判斷前一個命令執行後的返回碼(也叫
錯誤碼 ,DOS程式在運行完後都有返回碼),如果和定義的錯誤碼符合(這裡定義的錯誤碼為1),則執行相應的操作(這裡相應的操作為pause & edit %1.asm部分)。
另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,代碼變為:
masm %1.asm
if not errorlevel 1 link %1.obj
pause & edit %1.asm
for語句(循環結構) for語句可以實現類似於C語言裡面的循環結構,當然for語句的功能要更強大一點,通過不同的開關可以實現更多的功能。for語句有多個開關,不同開關將會實現不同的功能。
1.無開關
無開關的for語句能夠對設定的範圍內進行循環,是最基本的for
循環語句 。其命令格式為:
FOR %%variable IN (set) DO command
其中,%%variable是
批處理程式 裡面的書寫格式,在DOS中書寫為%variable,即只有一個
百分號 (%);set就是需要我們設定的循環範圍,類似於C語言裡面的循環
變數 ;do後面的command就是循環所執行的命令,即循環體。
無開關for語句舉例:
===============================================
@echo off
for %%i in (a,"b c",d) do echo %%i
pause>nul
===============================================
2.開關/L
含開關/L的for語句,可以根據set裡面的設定進行循環,從而實現對循環次數的直接控制。其命令格式為:
FOR /L %%variable IN (start,step,end) DO command
其中,start為開始計數的初始值,step為每次遞增的值,end為結束值。當end小於start時,step需要設定為負數。
含開關/L的for語句舉例(創建5個資料夾):
===============================================
@echo off
for /l %%i in (1,2,10) do md %%i
pause
===============================================
上例將新建5個資料夾,資料夾名稱依次為1.3.5.7.9。可以發現,%%i的結束值並非end的值10,而是不大於end的一個數。
3.開關/F
含開關/F的for語句具有最強大的功能,它能夠對字元串進行操作,也能夠對命令的返回值進行操作,還可以訪問硬碟上的ASCII碼檔案,比如txt文檔等。其命令格式為:
FOR /F ["options"] %%variable IN (set) DO command
其中,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語句舉例:
===============================================
@echo off
echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c
pause
===============================================
@echo off
echo 本資料夾裡面的檔案有:
for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (
if not "%%a"=="<DIR>" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b
)
pause
===============================================
@echo off
echo 本資料夾裡面的檔案有:
dir>c:\file.txt
for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (
if not "%%a"=="<DIR>" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b
)
del c:\file.txt
pause
===============================================
對於後面的兩個例子,其中options裡面的delims= 是可以刪除的,因為只要添加了/F開關係統就將delims的值默認為空格。
那么額外的變數將在最後一個符號解析之後
分配並接受行的保留文本。本例中也可以改為4,不過檔案名稱中有空格的檔案,只能顯示空格以前部分
同時我們也看到了,for語句的do後面的command也是可以分行的,只需要保證command的左括弧和do在同一行就可以了。
4.開關/D或/R
含開關/D或/R的for語句是與目錄或檔案有關的命令,一般情況下很少使用。含開關/R的命令有時候被用於通過遍歷資料夾來查找某一個檔案或資料夾,故而列舉此例。
含開關/R的for語句舉例(資料夾遍歷):
===============================================
@echo off
setlocal enabledelayedexpansion
FOR /R d: %%i IN (.) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
pause
exit
===============================================
上例即可以羅列出D糟下的所有資料夾,其速度要比命令"tree d:"慢多了,不過其返回結果的實用性則遠遠超過了tree命令。
一般情況下我們不推薦通過遍歷資料夾來查找檔案,特別是在查找某些程式(比如
QQ.exe )的位置時。推薦通過reg命令查找註冊表來查找QQ的路徑,以保證查找效率。
上例中也出現了幾個新面孔,如setlocal、感嘆號等。其中,感嘆號其實就是變數
百分號 (%)的強化版。之所以要用!而不用%,是因為在for循環中,當一個變數被多次賦值時,%dd%所獲取的僅僅是dd第一次被賦予的值;要想刷新dd的值,就必須首先通過命令"setlocal enabledelayedexpansion"來開啟延遲變數開關,然後用!dd!來獲取dd的值。
for語句是批處理裡面功能最強大、使用最普遍卻又最難掌握的一套命令,這也是批處理菜鳥和批處理高手最明顯的一個分水嶺,一旦掌握了這套命令,那么你就離批處理達人不遠了!
字元串 批處理有著具有非常強大的字元串處理能力,其功能絕不低於C語言裡面的字元串函式集。批處理中可實現的字元串處理功能有:截取字元串內容、替換字元串特定欄位、合併字元串、擴充字元串等功能。下面對這些功能一一進行講解。
截取字元串 截取字元串可以說是字元串處理功能中最常用的一個子功能了,能夠實現截取字元串中的特定位置的一個或多個字元。舉例說明其基本功能:
=========================================
@echo off
set ifo=abcdefghijklmnopqrstuvwxyz0 12 3456789
echo %ifo%
echo 1234567890123 45678901234567890123456
echo %ifo:~0,5%
echo %ifo:~-5%
echo %ifo:~0,-5%
echo %ifo:~3,5%
echo %ifo:~-14,5%
pause
=========================================
當然,上面的例子只是將字元串處理的基本功能展示出來了,還看不出字元串處理具體有什麼用處。下面這個例子是對時間進行處理。
=========================================
@echo off
echo 當前時間是:%time% 即 %time:~0,2%點%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
pause
=========================================
替換字元串 替換字元串,即將某一字元串中的特定字元或字元串替換為給定的字元串。舉例說明其功能:
=========================================
@echo off
echo 替換前:%aa%
echo aa = %aa%
set "aa=%aa:中國=中華人民共和國%"
echo aa = %aa%
pause
=========================================
對於上面的例子有一點說明,對比兩個echo aa = %aa%可以發現,如果要修改
變數 aa的內容的話,就需要將修改結果“%aa:中國=
中華人民共和國 %”賦值給變數aa。上面的字元串截取也有著同樣的特點。
字元串合併 其實,合併字元串就是將兩個字元串放在一起就可以了。舉例說明:
=========================================
@echo off
set bb=我為你自豪!
echo %aa%%bb%
echo aa=%aa%
echo bb=%bb%
set "aa=%aa%%bb%"
echo aa=%aa%
pause
=========================================
同樣,如果要改變
變數 aa的內容的話,就需要將合併結果“%aa%%bb%”賦值給變數aa。
擴充字元串 “擴充”這個辭彙來自於
微軟 自己的翻譯,意思就是對表示檔案
路徑 的字元串進行特殊的處理,具體功能羅列如下:
=========================================
~I - 刪除任何引號("),擴充 %I
%~fI - 將 %I 擴充到一個完全合格的路徑名
%~dI - 僅將 %I 擴充到一個驅動器號
%~pI - 僅將 %I 擴充到一個路徑
%~nI - 僅將 %I 擴充到一個檔案名稱
%~sI - 擴充的路徑只含有短名
%~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-z A-Z 0-9共62個字元中的任意一個。舉例說明:
=========================================
@echo off
echo 正在運行的這個批處理:
echo 完全路徑:%0
echo 去掉引號:%~0
echo 所在分區:%~d0
echo 所處路徑:%~p0
echo 檔案名稱:%~n0
echo 擴展名:%~x0
echo 修改時間:%~t0
echo 檔案大小:%~z0
pause
=========================================
其中的%0是批處理裡面的參數,代表當前運行的批處理的完全路徑。類似的還有%1-%9,分別代表傳遞來的第1-9個參數。例子如下:
===============================================
@echo off
set aa=C:\Windows\PPP\a.btx
call :deal aaa %aa% "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
===============================================
其中,
變數 aa在之前是不可以擴充的,通過call命令並將aa作為
參數傳遞 給子函式:deal,將aa變數轉換成了變數%1,即符合%x格式,從而可以進行字元串擴充。
至於%x中x取a-z A-Z的形式,可以複習一下for語句,for語句裡面的
變數 就是用%x來表示的,因而可以直接進行擴充。
數值計算 批處理裡面的數值計算功能較弱,只能夠進行整型計算,忽略浮點數的小數部分;同時數值計算的範圍也受限於系統位數,對於目前較為常見的32位機來說,數值計算能處理的數值範圍為0x80000000h~0x7FFFFFFFh,即-2147483648~+2147483647。
數值計算需要使用set命令,具體格式為“set /a expression”。其中,expression代表計算
表達式 ,計算表達式跟C語言裡面的表達式基本上完全一致。set支持的
運算符 也跟C語言裡面的一樣,只是沒有了増一減一。set支持的
運算符 及優先權排序如下:
=========================================
() - 分組
* / % - 算數運算符(乘、除得商、除得餘數,即取余)
+ - - 算數運算符(加、減)
<< >> - 邏輯移位(左移一位、右移一位)
& - 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
=========================================
我們知道,批處理中取
變數 的值是需要用%或者!的,而在set /a 中,直接用變數名稱即可取得變數的值。另外,set支持
八進制 (數字前綴0)、十進制(數字無前綴)和十六進制(數字前綴0x),且支持不同進制之間的計算,如set /a a=123+0123+0x123,計算及顯示結果為十進制。
批處理 學習有關批處理的一些比較瑣碎、但又比較有價值的一些知識,運用這些知識後,才有條件更好的實現的批處理的功能,並能使批處理擺脫黑白世界而顯得更加多姿多彩。
一環境變數 所謂“環境變數”,實際上就是C語言裡面的“變數”的意思。批處理的
變數 可以分為兩類,由
系統定義 的
系統變數 和由用戶根據需要自定義的用戶變數。
批處理的一些變數是由
作業系統 事先定義好的,可以適用於任何批處理,我們稱這些特殊的變數為“
系統變數 ”。系統變數有很多個,包括硬體類、
作業系統 類、檔案路徑類、系統時間類等。要查看所有的系統變數,請新打開一個cmd視窗,輸入set回車即可。對幾個比較常用的
變數 解釋如下:
ComputerName 計算機名,即右鍵
我的電腦 --屬性--計算機名 選項卡中的“完整的計算機名稱”
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 /?,本教程也會在後面對其進行講解。
前面的幾節課裡面,我們已經看到了如何
引用變數 ,即直接用變數名操作變數,通過"%"或"!"來獲取變數的值。其中,只有在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中的批處理 可別告訴我您不知道什麼是批處理,當面對一大堆需要重複操作的數據時,往往讓我們感到頭大,這時候我們會想到批處理,那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")
上面這段代碼,要求用戶自己設定輸入數據、輸出數據、緩衝區寬度(單位為米)。這裡輸出緩衝區數據的名稱和輸入數據的名稱一樣,如果不想要這樣,可以進一步修改代碼。
2、 接下來將該代碼增加到ArcToolbox中,步驟比較簡單,這裡不再贅述。
需要注意的地方為最後的參數設定部分,”輸入數據”的“MutiValue”屬性設定為”Yes”。(此部分的參數設定較條條框框較多,需要與你的代碼相互對照)
3、 完成後,工具將會添加到您自己的工具箱中。打開該工具,您會看到界面像普通工具的界面一樣,輸入數據可以設定很多個,但是這個工具所有圖層的緩衝區大小必須一樣。