批处理中字符串分割实现代码
- 作者: 我的它舔着她的它
- 来源: 51数据库
- 2021-07-05
批处理 字符串分割 实例
使用for命令可以对字符串进行分段处理。
分割字符串
@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环境变量。
@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这个目录:
@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的文件处理方式:
方案一:
@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,其实这里可以使用延迟变量开关
set t=%%b
)
if defined t goto :loop
有个老兄给了个更完整的(用到了延迟变量):
@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%
其实powershell里可能有更多的内置函数可以使用:
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"
最后来一个bat中的小难点: 变量延迟(自上而下,逐条(简单语句、复合语句(for、if 语句块只算一条))执行,而非逐行执行)
以上就是批处理中字符串分割实现代码的详细内容,更多关于批处理字符串分割的资料请关注其它相关文章!
