溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Bat 處理字符串分割 (split功能)

發(fā)布時(shí)間:2020-07-21 15:25:29 來源:網(wǎng)絡(luò) 閱讀:33765 作者:lianhuayu420 欄目:開發(fā)技術(shù)

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

方案: 通過for循環(huán)處理,而處理的方式又可以分兩種,一種是普通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,其實(shí)這里可以使用延遲變量開關(guān)
   set t=%%b
   )
if defined t goto :loop

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

@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%

其實(shí)Powershell里可能有更多的內(nèi)置函數(shù)可以使用:

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"


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

http://blog.csdn.net/icebergsnowfox/article/details/8047613


http://cndos.fam.cx/forum/    

http://ss64.com/   -  哎吆,不錯(cuò)哦

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI