批處理有着具有非常強大的字符串處理能力,其功能絕不低於C語言里面的字符串函數集。批處理中可實現的字符串處理功能有:截取字符串內容、替換字符串特定字段、合並字符串、擴充字符串等功能
下面對這些功能一一進行講解。
1、截取字符串
截取字符串可以說是字符串處理功能中最常用的一個子功能了,能夠實現截取字符串中的特定位置的一個或多個字符。舉例說明其基本功能:
@echo off set ifo=abcdefghijklmnopqrstuvwxyz0123456789 echo 原字符串(第二行為各字符的序號): echo %ifo% echo 123456789012345678901234567890123456 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
2、替換字符串
替換字符串,即將某一字符串中的特定字符或字符串替換為給定的字符串。舉例說明其功能:
@echo off set aa=偉大的中國!我為你自豪! echo 替換前:%aa% echo 替換后:%aa:中國=中華人民共和國% echo aa = %aa% set "aa=%aa:中國=中華人民共和國%" echo aa = %aa% pause
對於上面的例子有一點說明,對比兩個echo aa = %aa%可以發現,如果要修改變量aa的內容的話,就需要將修改結果“%aa:中國=中華人民共和國%”賦值給變量aa。上面的字符串截取也有着同樣的特點。
3、字符串合並
其實,合並字符串就是將兩個字符串放在一起就可以了。舉例說明:
@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。
4、擴充字符串
“擴充”這個詞匯來自於微軟自己的翻譯,意思就是對表示文件路徑的字符串進行特殊的處理,具體功能羅列如下:
=========================================
~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來表示的,因而可以直接進行擴充。
下面是其它網友的補充:注意是與c語言做了一些對比
首先說一下,批處理和高級語言不同,沒有字符串處理函數,比如strcat之類的,但是卻可以利用環境變量來實現這些函數的功能。
本文對照C語言中的字符串處理函數,講解在批處理中的實現方法。
首先說一下字符串的存儲,在C語言中,采用字符數組或者字符指針來存儲字符串,而BAT中沒有這些東東,所以要依靠環境變量來存儲。
設置環境變量的語句為set語句,本文不詳細介紹了,參考set /?語句。
1、C語中的strcpy函數,將一個字符串復制到另一個字符型指針或字符數組,覆蓋原來的字符串。
C語言中的調用方法:strcpy(目標字符串,源字符串)
在批處理中的實現方法:
set 目標字符串=%源字符串%
示例:
@echo off ::關閉屏幕回顯(可選) set str1=This is old string ::設置str1中存儲的字符串,注意沒有雙引號,這點與C語言等不同! set str2=This is new string ::設置str2中存儲的字符串 echo 執行字符串拷貝以前: echo str1=%str1% echo str2=%str2% ::先輸出一次原有的字符串 set str1=%str2% ::字符串拷貝 echo 執行字符串拷貝以后: echo str1=%str1% echo str2=%str2% ::輸出執行完字符串拷貝后的字符串 echo 輸出完畢,按任意鍵退出&&pause>nul&&exit ::輸出信息,當用戶按任意鍵時,結束該批處理。
2、C語中的strcat函數,將一個字符串連接到另一個字符型指針或字符數組的末尾。
C語言中的調用方法:strcat(目標字符串,源字符串)
在批處理中的實現方法:
set 目標字符串=%目標字符串%%源字符串%
示例:
@echo off set str1=This is string1 set str2=This is string2 ::設置str1和str2中存儲的字符串 echo 連接字符串以前: echo str1=%str1% echo str2=%str2% ::先輸出一次原有的字符串 set str1=%str1%%str2% ::字符串連接 echo 連接字符串以后: echo str1=%str1% echo str2=%str2% ::輸出執行完字符串連接后的兩個字符串 echo 輸出完畢,按任意鍵退出&&pause>nul&&exit
3、字符串截取,C中沒有這種函數,不過可以通過語句實現,不再介紹,直接說批處理的。
set 目標字符串=%源字符串:~起始值,截取長度%
注意,起始值從0開始!
截取長度是可選的,如果省略逗號和截取長度,將會從起始值一直截取到字符串的結尾。
示例:
@echo off set str1=This is string1 ::設置str1中存儲的字符串 set str2=%str1:~8,6% set str3=%str1:~0,4% set str4=%str1:~5% ::字符串截取 echo 原字符串: echo str1=%str1% echo 截取得到的字符串: echo str2=%str2% echo str3=%str3% echo str4=%str4% ::輸出執行結果 echo 輸出完畢,按任意鍵退出&&pause>nul&&exit
4、C語中的strlen函數,取得字符串的長度。
C語言中的調用方法:strlen(字符串)
在批處理中的實現方法是利用goto和標簽,形成循環結構,不斷將字符串截短1字符,並用變量記錄截短的次數,直到字符串變成空串。
示例:
@echo off set str1=This is a test string set str2=Hello World ::設置兩個字符串 set str=%str1% ::將str1復制到str :next1 ::標簽,用於goto跳轉 ::注意與注釋語句的區別,注釋用兩個冒號開頭,標簽則為一個冒號 if not "%str%"=="" ( ::判斷str是不是空串,如果不是則執行下邊的語句 set /a num+=1 ::算術運算,使num的值自增1,相當於num++或者++num語句 set "str=%str:~1%" ::截取字符串,賦給自身 goto next1 ::跳轉到next1標簽 ::這里利用goto和標簽,構成循環結構 ) ::當以上循環結構執行完畢時,會執行下邊的語句 echo str1=%str1% echo str1的長度為:%num% ::輸出結果 set num=0 ::將記和用的環境變量num置0,以便開始下一次運算。 set str=%str2% ::將str2復制到str :next2 ::定義一個新的標簽 ::注意不能與已有的標簽同名,否則會出錯! if not "%str%"=="" ( set /a num+=1 set "str=%str:~1%" goto next2 ) ::和上一個循環相似,不再介紹 echo str2=%str2% echo str2的長度為:%num% ::輸出結果 echo 輸出完畢,按任意鍵退出&&pause>nul&&exit
5、C語中的strchr函數,在一個字符串中查找一個字符的首次出現位置,找到時返回所在位置,找不到時返回0值。
批處理中的思路:不斷截短字符串,並取截短后字符串中的首字符,和要求的字符比較,如果相同就利用goto語句跳出循環,輸出結果,如果沒有相同的字符,執行到最后就輸出0值。
示例:
@echo off Setlocal ENABLEDELAYEDEXPANSION ::啟用命令擴展,參加setlocal /?命令 set str1=This is a test string set ch1=t ::注意,這里是區分大小寫的! set str=%str1% ::復制字符串,用來截短,而不影響源字符串 :next if not "%str%"=="" ( set /a num+=1 if "!str:~0,1!"=="%ch1%" goto last ::比較首字符是否為要求的字符,如果是則跳出循環 set "str=%str:~1%" goto next ) set /a num=0 ::沒有找到字符時,將num置零 :last echo 字符'%ch1%'在字符串"%str1%"中的首次出現位置為%num% echo 輸出完畢,按任意鍵退出&&pause>nul&&exit
引用:
最后出幾道題,看看大家學習的怎么樣!
(1)如何實現C語言中strstr函數的功能?
提示:strstr函數的功能是在字符串1中查找字符串2,找到時返回串2首次出現的位置,否則返回0值。與strchr區別就是,第二個參數是字符串,而不是字符了。
(2)如何用批處理構建while循環?
提示:while循環一般格式為:
while(表達式)
{
循環體
[break|continue;]
循環體
}
其中,循環體為0條或多條語句,break用於跳出循環,continue用於直接判斷表達式並決定是否進入下一次循環。
一般執行順序:首先判斷表達式,如果成立則進入循環,循環體執行完畢后再次判斷表達式的值,決定是否再次循環。
(3)如何用批處理構建do-while循環?
提示:do-while循環一般格式為:
do
{
循環體
[break|continue;]
循環體
}while(表達式);
各個語句的解釋參照while循環。
一般執行順序:首先進入循環,循環體執行完畢后判斷表達式的值,表達式成立則再次進入循環。