1. <s id="4jtld"></s>
    1. <span id="4jtld"><meter id="4jtld"></meter></span>

        <span id="4jtld"></span>
      1. <s id="4jtld"><noscript id="4jtld"><i id="4jtld"></i></noscript></s>
        溫馨提示×

        批處理中字符串分割的方法

        發布時間:2020-08-15 10:04:47 來源:億速云 閱讀:1726 作者:小新 欄目:開發技術

        這篇文章主要介紹了批處理中字符串分割的方法,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

        批處理 字符串分割 實例

        使用for命令可以對字符串進行分段處理。

        分割字符串

        @echo off
        ::定義一個以分號作為分隔的字符串
        set str=AAA;BBB;CCC;DDD;EEE;FFF
        ::str的副本
        set remain=%str%
        :loop
        for /f "tokens=1* delims=;" %%a in ("%remain%") do (
        	::輸出第一個分段(令牌)
        	echo %%a
        	rem 將截取剩下的部分賦給變量remain,其實這里可以使用延遲變量開關
        	set remain=%%b
        )
        ::如果還有剩余,則繼續分割
        if defined remain goto :loop
        pause

        主要解釋for語句:

        delims=;表示以分號作為分隔符,對remain字符串進行分割處理。
        tokens=1*,tokens表示分段的方式,tokens=1*表示第一個分隔符;之前的作為一部分,剩下的(*表示)作為一部分。這兩部分在循環體總可以用%%a表示第一部分,%%b表示第二部分。

        批處理 遍歷path環境變量

        我們知道path環境變量也是以分號作為分隔符的,批處理中,所以同樣可以用上面的代碼來遍歷path環境變量。

        @echo off
        setlocal enabledelayedexpansion 
        ::定義一個以分號作為分隔的字符串
        set str=%path%
        ::str的副本
        set remain=%str%
        :loop
        for /f "tokens=1* delims=;" %%a in ("%remain%") do (
        	::輸出第一個分段(令牌)
        	echo %%a
        	rem 將截取剩下的部分賦給變量remain,其實這里可以使用延遲變量開關
        	set remain=%%b
        )
        ::如果還有剩余,則繼續分割
        if defined remain goto :loop
        pause

        運行結果:

        D:\dev\workspace\MarkdownTools
        ......
        C:\windows\system32
        D:\dev\java\jdk1.8.0_91\bin
        F:\Program Files\nodejs\node_global
        F:\Program Files\Git\bin
        D:\dev\apache-maven-3.5.4\bin
        ......
        請按任意鍵繼續. . .

        批處理 判斷path環境變量中是否有某個目錄

        例如查找系統path環境變量中是否存在D:\dev\workspace\MarkdownTools這個目錄:

        @echo off
        setlocal enabledelayedexpansion 
        ::定義一個以分號作為分隔的字符串
        ::set str=AAA;BBB;CCC;DDD;EEE;FFF
        set str=%path%
        ::str的副本
        set remain=%str%
        set toFind=D:\dev\workspace\MarkdownTools
        set isFind=false
        :loop
        for /f "tokens=1* delims=;" %%a in ("%remain%") do (
        	if "%toFind%"=="%%a" (
        		::設置標記,以便后續使用
        		set isFind=true
        		::找到了就不找了
        		goto :finded
        	)
        	rem 將截取剩下的部分賦給變量remain,其實這里可以使用延遲變量開關
        	set remain=%%b
        )
        ::如果還有剩余,則繼續分割
        if defined remain goto :loop
        :finded
        echo %isFind%
        pause

        運行結果:

        true

        請按任意鍵繼續. . .

        參考資料

        最近有有個小需求需要將shell 腳本的功能挪到windows中,但發現shell中有數組概念,但windows中卻沒有,同時shell中有很多方式處理字符串分割,但bat中就顯得比較雞肋,經過一番查找,終于有了方案(Stack Overflow:http://stackoverflow.com/questions/1707058/how-to-split-a-string-in-a-windows-batch-file):

        方案: 通過for循環處理,而處理的方式又可以分兩種,一種是普通for,一種是for的文件處理方式:

        方案一:

        @echo off & setlocal
        rem 注意這里的s定義,其值不是使用雙引號引起來的
        rem also works for comma-separated lists, e.g. ABC,DEF,GHI,JKL
        set s=AAA BBB CCC DDD EEE FFF
        for %%a in (%s%) do echo %%a

        方案二:is the best for (most) arbitrary delimiter characters.

        @echo off & setlocal
        set s=AAA BBB CCC DDD EEE FFF
        set t=%s%
        :loop
        for /f "tokens=1*" %%a in ("%t%") do (
         echo %%a
         rem 將截取剩下的部分賦給t,其實這里可以使用延遲變量開關
         set t=%%b
         )
        if defined t goto :loop

        有個老兄給了個更完整的(用到了延遲變量):

        @echo off
        setlocal ENABLEDELAYEDEXPANSION
        
        REM Set a string with an arbitrary number of substrings separated by semi colons
        set teststring=The;rain;in;spain
        
        REM Do something with each substring
        :stringLOOP
         REM Stop when the string is empty
         if "!teststring!" EQU "" goto END
        
         for /f "delims=;" %%a in ("!teststring!") do set substring=%%a
        
          REM Do something with the substring - 
          REM we just echo it for the purposes of demo
          echo !substring!
        
        REM Now strip off the leading substring
        :striploop
         set stripchar=!teststring:~0,1!
         set teststring=!teststring:~1!
        
         if "!teststring!" EQU "" goto stringloop
        
         if "!stripchar!" NEQ ";" goto striploop
        
         goto stringloop
        )
        
        :END
        endlocal

        還有這樣的:

        set input=AAA BBB CCC DDD EEE FFF
        set nth=4
        for /F "tokens=%nth% delims= " %%a in ("%input%") do set nthstring=%%a
        echo %nthstring%

        其實Powershell里可能有更多的內置函數可以使用:

        PS C:\> "AAA BBB CCC DDD EEE FFF".Split()

        還有人提出用vbscrip代替bat:

        Set objFS = CreateObject("Scripting.FileSystemObject")
        Set objArgs = WScript.Arguments
        str1 = objArgs(0)
        s=Split(str1," ")
        For i=LBound(s) To UBound(s)
         WScript.Echo s(i)
         WScript.Echo s(9) ' get the 10th element
        Next
        usage:
        c:\test> cscript /nologo test.vbs "AAA BBB CCC"

        最后來一個bat中的小難點: 變量延遲(自上而下,逐條(簡單語句、復合語句(for、if 語句塊只算一條))執行,而非逐行執行)

        變量延遲詳解 call setlocal

        感謝你能夠認真閱讀完這篇文章,希望小編分享批處理中字符串分割的方法內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

        免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

        主題地圖

        欧美午夜理伦三级在线观看,欧美午夜乱伦片,欧美午夜乱色视频在线观看,欧美午夜免费一区二区,欧美午夜片欧美片在线观看