zoukankan      html  css  js  c++  java
  • 批处理中字符串分割实现循环输出

    批处理 字符串分割 实例

    使用for命令可以对字符串进行分段处理。

    分割字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @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环境变量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @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:devworkspaceMarkdownTools
    ......
    C:windowssystem32
    D:devjavajdk1.8.0_91in
    F:Program Files odejs ode_global
    F:Program FilesGitin
    D:devapache-maven-3.5.4in
    ......
    请按任意键继续. . .

    批处理 判断path环境变量中是否有某个目录

    例如查找系统path环境变量中是否存在D:devworkspaceMarkdownTools这个目录:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @echo off
    setlocal enabledelayedexpansion
    ::定义一个以分号作为分隔的字符串
    ::set str=AAA;BBB;CCC;DDD;EEE;FFF
    set str=%path%
    ::str的副本
    set remain=%str%
    set toFind=D:devworkspaceMarkdownTools
    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的文件处理方式:

    方案一:

    1
    2
    3
    4
    5
    @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.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @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
     

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @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
     

    还有这样的:

    1
    2
    3
    4
    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:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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: est> cscript /nologo test.vbs "AAA BBB CCC"
     

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

    变量延迟详解 call setlocal

    以上就是批处理中字符串分割实现代码的详细内容,更多关于批处理字符串分割的资料请关注脚本之家其它相关文章!

     

    出处:https://www.jb51.net/article/193244.htm

    您的资助是我最大的动力!
    金额随意,欢迎来赏!
    款后有任何问题请给我留言。

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我。(●'◡'●)

    如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,求打             付款后有任何问题请给我留言!!!

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【Jack_孟】!

  • 相关阅读:
    【poj3017】 Cut the Sequence
    【vijos1243】 生产产品
    【bzoj3624】Apio2008—免费道路
    【bzoj1912】 Apio2010—patrol 巡逻
    【bzoj2006】 NOI2010—超级钢琴
    【bzoj1178】 Apio2009—CONVENTION会议中心
    【bzoj1503】 NOI2004—郁闷的出纳员
    【bzoj1499】 NOI2005—瑰丽华尔兹
    【poj2823】 Sliding Window
    【poj3264】 Balanced Lineup
  • 原文地址:https://www.cnblogs.com/mq0036/p/15210303.html
Copyright © 2011-2022 走看看