Batch批處理中的 參數 路徑和字符串 處理詳解


1、截取字符串

  截取字符串可以說是字符串處理功能中最常用的一個子功能了,能夠實現截取字符串中的特定位置的一個或多個字符。舉例說明其基本功能:

  1.   @ echo off
  2.    set ifo=abcdefghijklmnopqrstuvwxyz0123456789
  3.    echo 原字符串(第二行為各字符的序號):
  4.    echo %ifo%
  5.    echo 123456789012345678901234567890123456
  6.    echo 截取前5個字符:
  7.    echo %ifo:~0,5%
  8.    echo 截取最后5個字符:
  9.    echo %ifo:~-5%
  10.    echo 截取第一個到倒數第6個字符:
  11.    echo %ifo:~0,-5%
  12.    echo 從第4個字符開始,截取5個字符:
  13.    echo %ifo:~3,5%
  14.    echo 從倒數第14個字符開始,截取5個字符:
  15.    echo %ifo:~-14,5%
  16.   pause


 當然,上面的例子只是將字符串處理的基本功能展示出來了,還看不出字符串處理具體有什么用處。下面這個例子是對時間進行處理。

  1.   @echo off
  2.   echo 當前時間是:%time% 即 %time:~ 0, 2%點%time:~ 3, 2%分%time:~ 6, 2%秒%time:~ 9, 2%厘秒
  3.   pause

2、替換字符串
  替換字符串,即將某一字符串中的特定字符或字符串替換為給定的字符串。舉例說明其功能:

  1.   @ echo off
  2.    set aa=偉大的中國!我為你自豪!
  3.    echo 替換前:%aa%
  4.    echo 替換后:%aa:中國=中華人民共和國%
  5.    echo aa = %aa%
  6.    set "aa=%aa:中國=中華人民共和國%"
  7.    echo aa = %aa%
  8.   pause

對於上面的例子有一點說明,對比兩個echo aa = %aa%可以發現,如果要修改變量aa的內容的話,就需要將修改結果“%aa:中國=中華人民共和國%”賦值給變量aa。上面的字符串截取也有着同樣的特點。

  1. echo % var: 0=kkk% ; 0替換為kkk
  2. echo % var: 10=kkk% ; 10替換為kkk
  3. echo % var: 20=kkk%
  4. echo % var:* 20=kkk% ; 20之前包括 20字符串都替換為kkk

 

 

3、字符串合並

  其實,合並字符串就是將兩個字符串放在一起就可以了。舉例說明:

  1.   @ echo off
  2.    set aa=偉大的中國!
  3.    set bb=我為你自豪!
  4.    echo %aa%%bb%
  5.    echo aa=%aa%
  6.    echo bb=%bb%
  7.    set "aa=%aa%%bb%"
  8.    echo aa=%aa%
  9.   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個字符中的任意一個。舉例說明:

  1. @ echo off
  2. echo 正在運行的這個批處理:
  3. echo 完全路徑:% 0
  4. echo 去掉引號:%~ 0
  5. echo 所在分區:%~d0
  6. echo 所處路徑:%~p0
  7. echo 文件名:%~n0
  8. echo 擴展名:%~x0
  9. echo 文件屬性:%~a0
  10. echo 修改時間:%~t0
  11. echo 文件大小:%~z0
  12. pause
       其中的%0是批處理里面的真正的第一個參數,代表當前運行的批處理的完全路徑。
       類似的還有%1-%9,
  分別代表傳遞來的第1-9個參數,
  可以替換上面的%0
       例子如下: 
  1.   @echo off
  2.   set aa=C:\Windows\PPP\a.btx
  3.   call :deal aaa %aa% "c c" ddd eee
  4.   pause>nul
  5.    exit
  6. :deal
  7.   echo %% 0 = %0
  8.   echo %% 1 = %1
  9.   echo %% 2 = %2
  10.   echo %% 3 = %3
  11.   echo %% 4 = %4
  12.   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 目標字符串=%源字符串%

示例:

  1. @ echo off
  2. ::關閉屏幕回顯(可選)
  3. set str1=This is old string
  4. ::設置str1中存儲的字符串,注意沒有雙引號,這點與C語言等不同!
  5. set str2=This is new string
  6. ::設置str2中存儲的字符串
  7. echo 執行字符串拷貝以前:
  8. echo str1=%str1%
  9. echo str2=%str2%
  10. ::先輸出一次原有的字符串
  11. set str1=%str2%
  12. ::字符串拷貝
  13. echo 執行字符串拷貝以后:
  14. echo str1=%str1%
  15. echo str2=%str2%
  16. ::輸出執行完字符串拷貝后的字符串
  17. echo 輸出完畢,按任意鍵退出&&pause>nul&& exit
  18. ::輸出信息,當用戶按任意鍵時,結束該批處理。


 

2、C語中的strcat函數,將一個字符串連接到另一個字符型指針或字符數組的末尾。

C語言中的調用方法:strcat(目標字符串,源字符串)

在批處理中的實現方法:

set 目標字符串=%目標字符串%%源字符串%

示例: 

  1. @ echo off
  2. set str1=This is string1
  3. set str2=This is string2
  4. ::設置str1和str2中存儲的字符串
  5. echo 連接字符串以前:
  6. echo str1=%str1%
  7. echo str2=%str2%
  8. ::先輸出一次原有的字符串
  9. set str1=%str1%%str2%
  10. ::字符串連接
  11. echo 連接字符串以后:
  12. echo str1=%str1%
  13. echo str2=%str2%
  14. ::輸出執行完字符串連接后的兩個字符串
  15. echo 輸出完畢,按任意鍵退出&&pause>nul&& exit 

3、字符串截取,C中沒有這種函數,不過可以通過語句實現,不再介紹,直接說批處理的。

set 目標字符串=%源字符串:~起始值,截取長度%

注意,起始值從0開始!
截取長度是可選的,如果省略逗號和截取長度,將會從起始值一直截取到字符串的結尾。

示例:

  1. @ echo off
  2. set str1=This is string1
  3. ::設置str1中存儲的字符串
  4. set str2=%str1:~8,6%
  5. set str3=%str1:~0,4%
  6. set str4=%str1:~5%
  7. ::字符串截取
  8. echo 原字符串:
  9. echo str1=%str1%
  10. echo 截取得到的字符串:
  11. echo str2=%str2%
  12. echo str3=%str3%
  13. echo str4=%str4%
  14. ::輸出執行結果
  15. echo 輸出完畢,按任意鍵退出&&pause>nul&& exit


 

4、C語中的strlen函數,取得字符串的長度。

C語言中的調用方法:strlen(字符串)

在批處理中的實現方法是利用goto和標簽,形成循環結構,不斷將字符串截短1字符,並用變量記錄截短的次數,直到字符串變成空串。

示例:

  1. @echo off
  2. set str1=This is a test string
  3. set str2=Hello World
  4. ::設置兩個字符串
  5. set str=%str1%
  6. ::將str1復制到 str
  7. :next1
  8. ::標簽,用於 goto跳轉
  9. ::注意與注釋語句的區別,注釋用兩個冒號開頭,標簽則為一個冒號
  10. if not "%str%"== "" (
  11. ::判斷 str是不是空串,如果不是則執行下邊的語句
  12. set /a num+= 1
  13. ::算術運算,使 num的值自增 1,相當於 num++或者++ num語句
  14. set "str=%str:~1%"
  15. ::截取字符串,賦給自身
  16. goto next1
  17. ::跳轉到next1標簽
  18. ::這里利用 goto和標簽,構成循環結構
  19. )
  20. ::當以上循環結構執行完畢時,會執行下邊的語句
  21. echo str1=%str1%
  22. echo str1的長度為:% num%
  23. ::輸出結果
  24. set num= 0
  25. ::將記和用的環境變量 num0,以便開始下一次運算。
  26. set str=%str2%
  27. ::將str2復制到 str
  28. :next2
  29. ::定義一個新的標簽
  30. ::注意不能與已有的標簽同名,否則會出錯!
  31. if not "%str%"== "" (
  32. set /a num+= 1
  33. set "str=%str:~1%"
  34. goto next2
  35. )
  36. ::和上一個循環相似,不再介紹
  37. echo str2=%str2%
  38. echo str2的長度為:% num%
  39. ::輸出結果
  40. echo 輸出完畢,按任意鍵退出&&pause>nul&& exit 

5、C語中的strchr函數,在一個字符串中查找一個字符的首次出現位置,找到時返回所在位置,找不到時返回0值。

批處理中的思路:不斷截短字符串,並取截短后字符串中的首字符,和要求的字符比較,如果相同就利用goto語句跳出循環,輸出結果,如果沒有相同的字符,執行到最后就輸出0值。

示例: 

  1. @echo off
  2. Setlocal ENABLEDELAYEDEXPANSION
  3. ::啟用命令擴展,參加setlocal /?命令
  4. set str1=This is a test string
  5. set ch1=t
  6. ::注意,這里是區分大小寫的!
  7. set str=%str1%
  8. ::復制字符串,用來截短,而不影響源字符串
  9. : next
  10. if not "%str%"== "" (
  11. set /a num+= 1
  12. if "!str:~0,1!"== "%ch1%" goto last
  13. ::比較首字符是否為要求的字符,如果是則跳出循環
  14. set "str=%str:~1%"
  15. goto next
  16. )
  17. set /a num= 0
  18. ::沒有找到字符時,將 num置零
  19. : last
  20. echo 字符 '%ch1%'在字符串 "%str1%"中的首次出現位置為% num%
  21. echo 輸出完畢,按任意鍵退出&&pause>nul&& exit

問題1:

(1)如何實現C語言中strstr函數的功能?
提示:strstr函數的功能是在字符串1中查找字符串2,找到時返回串2首次出現的位置,否則返回0值。與strchr區別就是,第二個參數是字符串,而不是字符了。


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM