计算机网络中如何批处理中字符串分割实现代码

这篇文章将为大家详细讲解有关计算机网络中如何批处理中字符串分割实现代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

批处理 字符串分割 实例

计算机网络中如何批处理中字符串分割实现代码

使用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\system32D:\dev\java\jdk1.8.0_91\binF:\Program Files\nodejs\node_globalF:\Program Files\Git\binD:\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中就显得比较鸡肋,经过一番查找,终于有了方案(Stack Overflow: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

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

@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里可能有更多的内置函数可以使用:

PS C:\> "AAA BBB CCC DDD EEE FFF".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 语句块只算一条))执行,而非逐行执行)

变量延迟详解 call setlocal

关于“计算机网络中如何批处理中字符串分割实现代码”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

发布于 2021-03-21 22:36:41
收藏
分享
海报
0 条评论
168
上一篇:Html5如何实现webview元素定位工具 下一篇:AmazeUI面板怎么实现
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码