批處理 字符串分割 實例
使用for命令可以對字符串進行分段處理。
分割字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@
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環境變量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@
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這個目錄:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@
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的文件處理方式:
方案一:
1
2
3
4
5
|
@
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.
1
2
3
4
5
6
7
8
9
10
|
@
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
|
有個老兄給了個更完整的(用到了延遲變量):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
@
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
|
還有這樣的:
1
2
3
4
|
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:
1
2
3
4
5
6
7
8
9
10
|
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 語句塊只算一條))執行,而非逐行執行)
以上就是批處理中字符串分割實現代碼的詳細內容,更多關於批處理字符串分割的資料請關注腳本之家其它相關文章!
出處:https://www.jb51.net/article/193244.htm