最近有有个小需求需要将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的文件处理方式:


方案一:

@echooff&setlocalrem注意这里的s定义,其值不是使用双引号引起来的remalsoworksforcomma-separatedlists,e.g.ABC,DEF,GHI,JKLsets=AAABBBCCCDDDEEEFFFfor%%ain(%s%)doecho%%a

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

@echooff&setlocalsets=AAABBBCCCDDDEEEFFFsett=%s%:loopfor/f"tokens=1*"%%ain("%t%")do(echo%%arem将截取剩下的部分赋给t,其实这里可以使用延迟变量开关sett=%%b)ifdefinedtgoto:loop

有个老兄给了个更完整的(用到了延迟变量):

@echooffsetlocalENABLEDELAYEDEXPANSIONREMSetastringwithanarbitrarynumberofsubstringsseparatedbysemicolonssetteststring=The;rain;in;spainREMDosomethingwitheachsubstring:stringLOOPREMStopwhenthestringisemptyif"!teststring!"EQU""gotoENDfor/f"delims=;"%%ain("!teststring!")dosetsubstring=%%aREMDosomethingwiththesubstring-REMwejustechoitforthepurposesofdemoecho!substring!REMNowstripofftheleadingsubstring:striploopsetstripchar=!teststring:~0,1!setteststring=!teststring:~1!if"!teststring!"EQU""gotostringloopif"!stripchar!"NEQ";"gotostriploopgotostringloop):ENDendlocal

还有这样的:

setinput=AAABBBCCCDDDEEEFFFsetnth=4for/F"tokens=%nth%delims="%%ain("%input%")dosetnthstring=%%aecho%nthstring%

其实Powershell里可能有更多的内置函数可以使用:

PSC:\>"AAABBBCCCDDDEEEFFF".Split()

还有人提出用vbscrip代替bat:

SetobjFS=CreateObject("Scripting.FileSystemObject")SetobjArgs=WScript.Argumentsstr1=objArgs(0)s=Split(str1,"")Fori=LBound(s)ToUBound(s)WScript.Echos(i)WScript.Echos(9)'getthe10thelementNextusage:c:\test>cscript/nologotest.vbs"AAABBBCCC"


最后来一个bat中的小难点: 变量延迟(自上而下,逐条(简单语句、复合语句(for、if 语句块只算一条))执行,而非逐行执行)

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


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

http://ss64.com/ - 哎吆,不错哦