批处理中字符串分割实现代码
批处理字符串分割实例
使用for命令可以对字符串进行分段处理。
分割字符串
@echooff
::定义一个以分号作为分隔的字符串
setstr=AAA;BBB;CCC;DDD;EEE;FFF
::str的副本
setremain=%str%
:loop
for/f"tokens=1*delims=;"%%ain("%remain%")do(
::输出第一个分段(令牌)
echo%%a
rem将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
setremain=%%b
)
::如果还有剩余,则继续分割
ifdefinedremaingoto:loop
pause
主要解释for语句:
delims=;表示以分号作为分隔符,对remain字符串进行分割处理。
tokens=1*,tokens表示分段的方式,tokens=1*表示第一个分隔符;之前的作为一部分,剩下的(*表示)作为一部分。这两部分在循环体总可以用%%a表示第一部分,%%b表示第二部分。
批处理遍历path环境变量
我们知道path环境变量也是以分号作为分隔符的,批处理中,所以同样可以用上面的代码来遍历path环境变量。
@echooff
setlocalenabledelayedexpansion
::定义一个以分号作为分隔的字符串
setstr=%path%
::str的副本
setremain=%str%
:loop
for/f"tokens=1*delims=;"%%ain("%remain%")do(
::输出第一个分段(令牌)
echo%%a
rem将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
setremain=%%b
)
::如果还有剩余,则继续分割
ifdefinedremaingoto:loop
pause
运行结果:
D:\dev\workspace\MarkdownTools
......
C:\windows\system32
D:\dev\java\jdk1.8.0_91\bin
F:\ProgramFiles\nodejs\node_global
F:\ProgramFiles\Git\bin
D:\dev\apache-maven-3.5.4\bin
......
请按任意键继续...
批处理判断path环境变量中是否有某个目录
例如查找系统path环境变量中是否存在D:\dev\workspace\MarkdownTools这个目录:
@echooff
setlocalenabledelayedexpansion
::定义一个以分号作为分隔的字符串
::setstr=AAA;BBB;CCC;DDD;EEE;FFF
setstr=%path%
::str的副本
setremain=%str%
settoFind=D:\dev\workspace\MarkdownTools
setisFind=false
:loop
for/f"tokens=1*delims=;"%%ain("%remain%")do(
if"%toFind%"=="%%a"(
::设置标记,以便后续使用
setisFind=true
::找到了就不找了
goto:finded
)
rem将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
setremain=%%b
)
::如果还有剩余,则继续分割
ifdefinedremaingoto:loop
:finded
echo%isFind%
pause
运行结果:
true
请按任意键继续...
参考资料
最近有有个小需求需要将shell脚本的功能挪到windows中,但发现shell中有数组概念,但windows中却没有,同时shell中有很多方式处理字符串分割,但bat中就显得比较鸡肋,经过一番查找,终于有了方案(StackOverflow:http://stackoverflow.com/questions/1707058/how-to-split-a-string-in-a-windows-batch-file):
方案:通过for循环处理,而处理的方式又可以分两种,一种是普通for,一种是for的文件处理方式:
方案一:
@echooff&setlocal rem注意这里的s定义,其值不是使用双引号引起来的 remalsoworksforcomma-separatedlists,e.g.ABC,DEF,GHI,JKL sets=AAABBBCCCDDDEEEFFF for%%ain(%s%)doecho%%a
方案二:isthebestfor(most)arbitrarydelimitercharacters.
@echooff&setlocal
sets=AAABBBCCCDDDEEEFFF
sett=%s%
:loop
for/f"tokens=1*"%%ain("%t%")do(
echo%%a
rem将截取剩下的部分赋给t,其实这里可以使用延迟变量开关
sett=%%b
)
ifdefinedtgoto:loop
有个老兄给了个更完整的(用到了延迟变量):
@echooff
setlocalENABLEDELAYEDEXPANSION
REMSetastringwithanarbitrarynumberofsubstringsseparatedbysemicolons
setteststring=The;rain;in;spain
REMDosomethingwitheachsubstring
:stringLOOP
REMStopwhenthestringisempty
if"!teststring!"EQU""gotoEND
for/f"delims=;"%%ain("!teststring!")dosetsubstring=%%a
REMDosomethingwiththesubstring-
REMwejustechoitforthepurposesofdemo
echo!substring!
REMNowstripofftheleadingsubstring
:striploop
setstripchar=!teststring:~0,1!
setteststring=!teststring:~1!
if"!teststring!"EQU""gotostringloop
if"!stripchar!"NEQ";"gotostriploop
gotostringloop
)
:END
endlocal
还有这样的:
setinput=AAABBBCCCDDDEEEFFF
setnth=4
for/F"tokens=%nth%delims="%%ain("%input%")dosetnthstring=%%a
echo%nthstring%
其实Powershell里可能有更多的内置函数可以使用:
PSC:\>"AAABBBCCCDDDEEEFFF".Split()
还有人提出用vbscrip代替bat:
SetobjFS=CreateObject("Scripting.FileSystemObject")
SetobjArgs=WScript.Arguments
str1=objArgs(0)
s=Split(str1,"")
Fori=LBound(s)ToUBound(s)
WScript.Echos(i)
WScript.Echos(9)'getthe10thelement
Next
usage:
c:\test>cscript/nologotest.vbs"AAABBBCCC"
最后来一个bat中的小难点:变量延迟(自上而下,逐条(简单语句、复合语句(for、if语句块只算一条))执行,而非逐行执行)
变量延迟详解callsetlocal
以上就是批处理中字符串分割实现代码的详细内容,更多关于批处理字符串分割的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。