批處理

批處理

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

有些人認為批處理語言的含義要比上面的描述更廣泛,還包括許多軟體自帶的批處理語言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所內置的批處理語言的功能,用戶可通過它們讓相應的軟體執行自動化操作(例如調整某個資料夾所有 PSD 圖檔的解析度)。而這類批處理語言也大多提供把一系列操作錄製為批處理文件的功能,這樣用戶不必寫程式就能得到批處理程序。

簡介


批處理,也稱為批處理腳本,英文譯為BATCH,批處理文件後綴BAT就取的前三個字母。它的構成沒有固定格式,遵守以下這條:每一行可視為一個命令,每個命令里可以含多條子命令,從第一行開始執行,直到最後一行結束,它運行的平台是DOS。批處理有一個很鮮明的特點:使用方便、靈活,功能強大,自動化程度高。

原理


把要處理的信息分成組,成批地交給信息系統自動處理。在以計算機為主的信息系統中,信息的輸入、輸出速度與信息處理的速度不相匹配。為了減少人工操作時間和改善機器的利用情況,把要處理的信息(例如工資卡、庫存記錄等)按一定周期收集在一起,成批地交給系統進行處理。所有的作業也可適當地分批,系統啟動后自動地處理第一個作業,處理完后不需操作員干預而自動地過渡到處理下一個作業,直至一批作業處理完畢為止。
早期的批處理對作業的輸入輸出採取聯機處理,高速的中央處理機要等待低速的聯機輸入、輸出設備,不能發揮應有的效率。後來採用離線處理:先把若干個作業輸入到磁帶上,中央處理器從磁帶上把作業調入並執行,作業完成後把結果記錄在磁帶上,再由外圍機將磁帶上的信息輸出。這樣中央處理機得以擺脫低速的輸入、輸出設備的牽制,提高處理能力。
如果數據是在遠方收集,通過終端送入數據採集器,數據採集器先將一段時間內的信息存儲起來,再通過傳輸線路將它們成批地送入系統進行處理,則這種處理方式稱為遠程批處理。
批處理能有效地提高計算機的利用率,是最經濟的處理方法。但是在批處理中,用戶提交作業后便失去了對作業的控制和修改能力,用戶必須以作業說明書的形式向系統提供控制信息,還需要估計運行過程中可能出現的問題,並把處理方法事先告訴系統。對新的處理作業,用戶無法預測可能出現的事件,所以希望系統有與用戶交互作用的能力(見互動式處理)。這種情況不適合採用批處理。另外,在批處理系統中,用戶提交作業后通常要經過幾小時甚至幾天的時間才能得到所需要的結果,這樣長的周轉時間對那些僅計算一個很小的題目,或只對已存文件作幾行修改的短作業用戶非常不便,尤其對時間緊迫的作業更不宜選用批處理方式。在大型處理系統中,批處理經常是後台作業,前台作業採用分時處理。

分類


批處理按作業的處理次序可以分為順序批處理和隨機批處理。
順序批處理
對成批的信息按規定的順序自動地依次進行處理。傳統的處理方法是父-子方法。按信息處理要求對原來的主文件(父)進行修改,建立新的主文件(子),將它作為下一次運行的父文件,而原來的父文件自動地成為後備文件。這種處理方式的優點是主記錄的插入、刪除容易,新老文件可以選用同一類型的外圍設備,平均訪問時間短。缺點是老文件中不常用的部分也必須寫入新文件。
順序批處理中,信息輸入的順序必須與文件的順序嚴格一致。事先把信息經過分類和排序,記錄在磁帶或卡片上,批處理一旦開始,在一個預定的時間內,所有適當的信息都進入系統,順序地進行處理。
隨機批處理
對成批的信息僅處理需要的部分,而對其他無關部分不加任何處理(見隨機存取)。

功能


其用處非常大,使用也比較廣泛。比如每次都執行一些相同的命令,您一定會覺得非常麻煩,而放在批處理文件中執行的話則輕鬆得多。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、@、call、pause、rem 是批處理文件最常用的幾個命令。
echo 表示顯示此命令后的字元
echo off 表示在此語句后所有運行的命令都不顯示命令行本身
@與echo off相象,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。
call 調用另一個批處理文件(如果不用call而直接調用別的批處理文件,那麼執行完那個批處理文件后將無法返回當前文件並執行當前文件的後續命令)。
pause 運行此句會暫停批處理的執行並在屏幕上顯示Press any key to continue...的提示,等待用戶按任意鍵後繼續
rem 表示此命令后的字元為解釋行(註釋),不執行,只是給自己今後參考用的(相當於程序中的註釋)。

特殊命令


if goto choice for是批處理文件中比較高級的命令。
一、if 是條件語句,用來判斷是否符合規定的條件,從而決定執行不同的命令。有三種格式:
1、if [not] "參數" == "字元串" 待執行的命令
參數如果等於(not表示不等,下同)指定的字元串,則條件成立,運行命令,否則運行下一句。
例:if "%1"=="a" format a:
2、if [not] exist [路徑\]文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
如: if exist c:\config.sys type c:\config.sys
表示如果存在c:\config.sys文件,則顯示它的內容。
3、if errorlevel 數字 待執行的命令
很多DOS程序在運行結束後會返回一個數字值用來表示程序運行的結果(或者狀態),通過if errorlevel命令可以判斷程序的返回值,根據不同的返回值來決定執行不同的命令(返回值必須按照從大到小的順序排列)。如果返回值等於指定的數字,則條件成立,運行命令,否則運行下一句。
如if errorlevel 2 goto x2
二、goto 批處理文件運行到這裡將跳到goto所指定的標號(標號即label,標號用:後跟標準字元串來定義)處,goto語句一般與if 配合使用,根據不同的條件來執行不同的命令組。
如:
goto end
:end
echo this is the end
標號用“:字元串”來定義,標號所在行不被執行。
三、choice 使用此命令可以讓用戶輸入一個字元(用於選擇),從而根據用戶的選擇返回不同的errorlevel,然後於if errorlevel配合,根據用戶的選擇運行不同的命令。
注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令語法會稍有不同,請用choice /?查看用法。
choice的命令語法(該語法為Windows 2003中choice命令的語法,其它版本的choice的命令語法與此大同小異):
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
該工具允許用戶從選擇列表選擇一個項目並返回所選項目的索引。
四、for循環命令,只要條件符合,它將多次執行同一命令。
語法:
對一組文件中的每一個文件執行某個特定命令。
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters
為特定命令指定參數或命令行開關。
例如一個批處理文件中有一行:
for %%c in (*.bat *.txt) do type %%c
則該命令行會顯示當前目錄下所有以bat和txt為擴展名的文件的內容。

參數


批處理文件還可以像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 指定提示之前要顯示的消息。如果沒有指定,工具只
顯示提示。
/? 顯示幫助消息。

相關教程


紅客黑客聯盟:《批處理專題》http://www.7747.net/Article/Special/all/
華夏黑客聯盟:《批處理完全精通專題》http://hack.77169.com/Special/bat/
有上百篇的技術文章,從入門到精通,面面俱到。

相關下載


網路上有很多的批處理程序可以免費下載。按功能分有這幾類:
文件屬性批處理、音視頻文件批處理、辦公文件批處理、圖像文件批處理。
可在這些著名網站下載:
批處理吧:http://www.pcl8.com/
北大青鳥:http://www.gz-benet.com.cn/bbs/Show.Asp?ID=1498

相關詞條


DOS彙編語言
參數命令
信息C語言

參考資料


[1] 一點通 http://www.sunenze.com/jc/autoexec.asp
[2] 天極網 http://www.yesky.com/it/127/2000127.shtml

符號簡介


回顯屏蔽 @
表示不顯示@後面的命令,在入侵過程中(例如使用批處理來格式化敵人的硬碟)自然不能讓對方看到你使用的命令啦。
@用法舉例:通過運行批處理文件對比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
echo 請任意輸入字元,以回車結束:
set /p ifo=
cls
echo 【從屏幕獲得的輸入信息】
echo %ifo%
set /p ifo=
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
除了 ^ ,如果想要輸出%該怎麼辦呢?在這裡,%就可以當做%的轉義符,例如:
echo 已完成100%%
這段代碼就會輸出:
已完成100%
邏輯命令符
邏輯命令符包括:&;、&&;、||
&-它的作用是用來連接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命令也給出了“執行結果”。對比系統和我們自己給出的結果,既可以驗證邏輯命令的判斷機理。

命令釋義


文件夾管理
cd 顯示當前目錄名或改變當前目錄。
md 創建目錄。
rd 刪除一個目錄。
dir 顯示目錄中的文件和子目錄列表。
tree 以圖形顯示驅動器或路徑的文件夾結構。
path 為可執行文件顯示或設置一個搜索路徑。
copy 複製文件和目錄樹。
文件管理
type 顯示文本文件的內容。
copy 將一份或多份文件複製到另一個位置。
del 刪除一個或數個文件。
move 移動文件並重命名文件和目錄。(Windows XP Home Edition中沒有)
ren文件名重命名。
replace 替換文件。
attrib 顯示或更改文件屬性。
find 搜索字元串。
fc 比較兩個文件或兩個文件集並顯示它們之間的不同
網路命令
ping 進行網路連接測試、名稱解析
ftp文件傳輸
net 網路命令集及用戶管理
telnet遠程登陸
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)
● ● 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;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"=="
)
pause
===============================================
1
2
3
4
5
6
7
8
@echo off
echo 本文件夾裡面的文件有:
dir>c:\file.txt
for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (
if not "%%a"=="" 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 原字元串(第二行為各字元的序號):
echo %ifo%
echo 1234567890123 45678901234567890123456
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
=========================================
當然,上面的例子只是將字元串處理的基本功能展示出來了,還看不出字元串處理具體有什麼用處。下面這個例子是對時間進行處理。
=========================================
@echo off
echo 當前時間是:%time% 即 %time:~0,2%點%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
pause
=========================================
替換字元串
替換字元串,即將某一字元串中的特定字元或字元串替換為給定的字元串。舉例說明其功能:
=========================================
@echo off
set aa=偉大的中國!我為你自豪!
echo 替換前:%aa%
echo 替換后:%aa:中國=中華人民共和國%
echo aa = %aa%
set "aa=%aa:中國=中華人民共和國%"
echo aa = %aa%
pause
=========================================
對於上面的例子有一點說明,對比兩個echo aa = %aa%可以發現,如果要修改變數aa的內容的話,就需要將修改結果“%aa:中國=中華人民共和國%”賦值給變數aa。上面的字元串截取也有著同樣的特點。
字元串合併
其實,合併字元串就是將兩個字元串放在一起就可以了。舉例說明:
=========================================
@echo off
set aa=偉大的中國!
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 擴充到一個文件名
%~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-z A-Z 0-9共62個字元中的任意一個。舉例說明:
=========================================
@echo off
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個參數。例子如下:
===============================================
@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可一次處理多個表達式)
=========================================
我們知道,批處理中取變數的值是需要用%或者!的,而在set /a 中,直接用變數名稱即可取得變數的值。另外,set支持八進位(數字前綴0)、十進位(數字無前綴)和十六進位(數字前綴0x),且支持不同進位之間的計算,如set /a a=123+0123+0x123,計算及顯示結果為十進位。
批處理
批處理