时间:2021-05-22
批处理 字符串分割 实例
使用for命令可以对字符串进行分段处理。
分割字符串
@echo off::定义一个以分号作为分隔的字符串set str=AAA;BBB;CCC;DDD;EEE;FFF::str的副本set remain=%str%:loopfor /f "tokens=1* delims=;" %%a in ("%remain%") do ( ::输出第一个分段(令牌) echo %%a rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关 set remain=%%b)::如果还有剩余,则继续分割if defined remain goto :looppause主要解释for语句:
delims=;表示以分号作为分隔符,对remain字符串进行分割处理。
tokens=1*,tokens表示分段的方式,tokens=1*表示第一个分隔符;之前的作为一部分,剩下的(*表示)作为一部分。这两部分在循环体总可以用%%a表示第一部分,%%b表示第二部分。
批处理 遍历path环境变量
我们知道path环境变量也是以分号作为分隔符的,批处理中,所以同样可以用上面的代码来遍历path环境变量。
@echo offsetlocal enabledelayedexpansion ::定义一个以分号作为分隔的字符串set str=%path%::str的副本set remain=%str%:loopfor /f "tokens=1* delims=;" %%a in ("%remain%") do ( ::输出第一个分段(令牌) echo %%a rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关 set remain=%%b)::如果还有剩余,则继续分割if defined remain goto :looppause运行结果:
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 offsetlocal enabledelayedexpansion ::定义一个以分号作为分隔的字符串::set str=AAA;BBB;CCC;DDD;EEE;FFFset str=%path%::str的副本set remain=%str%set toFind=D:\dev\workspace\MarkdownToolsset isFind=false:loopfor /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:findedecho %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 & setlocalrem 注意这里的s定义,其值不是使用双引号引起来的rem also works for comma-separated lists, e.g. ABC,DEF,GHI,JKLset s=AAA BBB CCC DDD EEE FFFfor %%a in (%s%) do echo %%a方案二:is the best for (most) arbitrary delimiter characters.
@echo off & setlocalset s=AAA BBB CCC DDD EEE FFFset t=%s%:loopfor /f "tokens=1*" %%a in ("%t%") do ( echo %%a rem 将截取剩下的部分赋给t,其实这里可以使用延迟变量开关 set t=%%b )if defined t goto :loop有个老兄给了个更完整的(用到了延迟变量):
@echo offsetlocal ENABLEDELAYEDEXPANSIONREM Set a string with an arbitrary number of substrings separated by semi colonsset teststring=The;rain;in;spainREM 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):ENDendlocal还有这样的:
set input=AAA BBB CCC DDD EEE FFFset nth=4for /F "tokens=%nth% delims= " %%a in ("%input%") do set nthstring=%%aecho %nthstring%其实Powershell里可能有更多的内置函数可以使用:
PS C:\> "AAA BBB CCC DDD EEE FFF".Split()
还有人提出用vbscrip代替bat:
Set objFS = CreateObject("Scripting.FileSystemObject")Set objArgs = WScript.Argumentsstr1 = objArgs(0)s=Split(str1," ")For i=LBound(s) To UBound(s) WScript.Echo s(i) WScript.Echo s(9) ' get the 10th elementNextusage:c:\test> cscript /nologo test.vbs "AAA BBB CCC"最后来一个bat中的小难点: 变量延迟(自上而下,逐条(简单语句、复合语句(for、if 语句块只算一条))执行,而非逐行执行)
变量延迟详解 call setlocal
以上就是批处理中字符串分割实现代码的详细内容,更多关于批处理字符串分割的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
批处理判断是否为特殊字符用于判断输入的一个字符是否为"&^>中的符号。注意,匹配字符串中的空格不可省略!批处理代码:复制代码代码如下:@echooffsetIn
1:split函数将字符串按某个字符分割,将分割后的结果存入字符串数组中复制代码代码如下:functionSplitUsersInformation(users
我想做META关键字,比如我的标题显示ASP代码是:如果最终显示的标题如“字符串分割如何实现?”我想把字符串按两个汉字分割,如“字符,符串,串分,分割,割如,如
split()分割字符串1.不同环境下的区分Java:分割字符串不能写成split(“$”)//$为要分割的字符Android:分割字符串需要加上中括号spli
shell如何用指定的分隔符来分割字符串让结果为一个字符串数组,类似java中的split,而split关键字已经留给文件分割了,故字符串就分割处理就不能在使用