1. 程式人生 > >windows批處理中的字串處理詳解

windows批處理中的字串處理詳解

轉載:https://www.jb51.net/article/52744.htm

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迴圈。
一般執行順序:首先進入迴圈,迴圈體執行完畢後判斷表示式的值,表示式成立則再次進入迴圈。