• windows批处理之FOR


    FOR

    FOR %%variable IN (set) DO command [command-parameters]

      %variable  指定一个单一字母可替换的参数
      (set)      指定一个或一组文件。可以使用通配符。
      command    指定对每个文件执行的命令。
      command-parameters 为特定命令指定参数或命令行开关。

    在批处理程序中使用 FOR 命令时:

    • 指定变量请使用 %%variable而不要用 %variable
    • 变量名称是区分大小写的,所以 %i 不同于 %I
    • 循环体内有多条语句时,可以在DO后面用小括号包含,但是 "do (" 必须在一行

    1. 基本用法

    for %%i in (0,1,10)  do (
     echo %%i
    )
    
    依次输出数组 0,1,10(这里用空格隔开与,隔开效果一样)
    set list=1,2,3,4,5
    for %%i in (%list%) do (
      echo %%i
    )
    
    定义数组并输出数组中字符(逗号分割也可以用空格)
    for %%i in ("0,1,10")  do (
     echo %%i
    )
    
    若是用引号包含,就会直接输出该字符串,且字符串带引号(若是 echo %%~i 就不会带引号)
    for %%i in (C:\*.*) do (
      echo %%i
    )
    
    遍历c盘下的所有文件,不包括文件夹和文件夹里面的文件,输出绝对路径
    for %%i in (C:\*.txt*) do (
      echo %%i
    )
    
    遍历c盘下的所有txt文件,输出绝对路径
    for %%i in (??.txt) do (
      echo %%i
    )
    
    遍历运行路径下的名称长度为2的txt文件,并输出相对路径(调用的是绝对路径就会输出绝对路径)

    2. 扩展用法(/D)

    只能遍历相对路径下的文件夹(不包括子路径),输出相对路径

    for /d %%p in (*) do (
      echo %%p
    )
    
    输出所有运行路径下的文件夹的相对路径,不包括子文件夹
    for /d %%p in (e*) do (
      echo %%p
    )
    
    输出运行路径下的以e开头的文件夹的相对路径,不包括子文件夹(*e 表示以e结尾)

    2. 扩展用法(/L)

    简单for循环,遍历一个数值集合

    for /L %%i in (0,1,10)  do (
     echo %%i
    )
    
    该集表示以增量形式从开始到结束的一个数字序列。
    (1,1,5)   将产生序列1 2 3 4 5
    (1,2,5)   将产生序列1 3 5
    (5,-1,1)  将产生序列5 4 3 2 1

    3. 扩展用法(/R)

    遍历路径下的文件夹和文件(包括子路径),输出绝对路径

    for /r %%i in (.) do (
      echo %%i
    )
    
    遍历运行路径下的所有文件夹,包括本身和子文件夹(用/和\与.一样的功能),输出绝对路径但是最后会以.结尾
    for /r %%i in (*) do (
      echo %%i
    )
    
    遍历运行路径下的所有文件,包括子文件夹下的文件,并输出绝对路径
    for /r C:\ %%i in (*) do (
      echo %%i
    )
    
    遍历对应文件夹下的所有文件,包括子文件夹下的文件,并输出绝对路径
    for /r C:\ %%i in (*.txt) do (
      echo %%i
    )
    
    遍历对应文件夹下的所有txt文件,包括子文件夹下的文件,并输出绝对路径

    4. 扩展用法(/F)

    遍历文件中的数据,并按要求输出

    for /f %%s in (1.txt) do (
     echo %%s
    )
    
    读取运行路径下的1.txt,并显示每一行的内容(每一行内容遇到空格即终止,即只显示每一行第一个空格之前的字符,空行不输出)
    for /f %%i in (1.txt 2.txt) do (
      echo %%i
    )
    
    依次读取运行路径下的1.txt和2.txt文件
    for /f "eol=s" %%i in (1.txt) do (
      echo %%i
    )
    
    读取运行路径下的1.txt,并显示第一个字符不是s的行信息,每行信息遇到空格终止(eol只能数值一个字符)
    for /f "skip=2" %%i in (1.txt) do (
      echo %%i
    )
    
    读取运行路径下的1.txt,跳过前2行输出
    for /f "delims=," %%i in (1.txt) do (
      echo %%i
    )
    
    读取运行路径下的1.txt,并显示每一行内容(每一行信息遇到,终止)
    for /f "delims=,;" %%i in (1.txt) do (
      echo %%i
    )
    
    读取运行路径下的1.txt,并显示每一行内容(每一行信息遇到,或;终止)
    for /f "tokens=1,2,3" %%a in (1.txt) do (
      echo %%a %%b %%c
    )
    
    读取运行路径下的1.txt,并显示每一行内容(每一行信息以空格分割,第一个为%%a,第二个为%%b,第三个为%%c,小于3个时显示为空)
    例:
    1 2 3       echo 1 2 3
    1 2         echo 1 2
    1 2 3 4     echo 1 2 3
    
    PS:变量名需根据字母表顺序,这里for循环中定义的是a,这表示第二个就是b,第三个是c
    for /f "tokens=1-3" %%a in (1.txt) do (
      echo %%a %%b %%c
    )
    
    1-3 相当于 1,2,3
    for /f "tokens=1-3,*" %%a in (1.txt) do (
      echo %%a %%b %%c %%d
    )
    
    *表示%%d是后续的所有的字段
    例:
    1 2 3 4 5 6    a=1 b=2 c=3 d=4 5 6
    for /f "eol=s delims=; tokens=*" %%a in (1.txt) do (
      echo %%a
    )
    
    组合使用,相互之间以空格隔开
    for /f %%a in ("C:\1.txt") do (
      echo %%a
    )
    
    输出字符串 C:\1.txt
    for /f "usebackq" %%a in ("C:\1.txt") do (
      echo %%a
    )
    
    usebackq指示集中的是文件路径,主要用来处理带空格的文件路径(若是用的是单引号,表示的是字符串)
    for /f "usebackq" %%a in (`set`) do (
      echo %%a
    )
    
    ``中的字符串会被当作命令执行,并遍历执行后的结果

    另外,FOR 变量参照的替换已被增强。你现在可以使用下列选项语法:

         %~I          - 删除任何引号("),扩展 %I
         %~fI        - 将 %I 扩展到一个完全合格的路径名
         %~dI        - 仅将 %I 扩展到一个驱动器号
         %~pI        - 仅将 %I 扩展到一个路径
         %~nI        - 仅将 %I 扩展到一个文件名
         %~xI        - 仅将 %I 扩展到一个文件扩展名
         %~sI        - 扩展的路径只含有短名
         %~aI        - 将 %I 扩展到文件的文件属性
         %~tI        - 将 %I 扩展到文件的日期/时间
         %~zI        - 将 %I 扩展到文件的大小
         %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串

    可以组合修饰符来得到多重结果:

         %~dpI                - 仅将 %I 扩展到一个驱动器号和路径
         %~nxI                - 仅将 %I 扩展到一个文件名和扩展名
         %~fsI                 - 仅将 %I 扩展到一个带有短名的完整路径名
         %~dp$PATH:I    - 搜索列在路径环境变量的目录,并将 %I 扩展到找到的第一个驱动器号和路径。
         %~ftzaI              - 将 %I 扩展到类似输出线路的 DIR

    for /r %%i in (*) do (
      echo %%~xi
    )
    
    输出相对路径下文件的扩展名

    5.变量延迟

    批处理解释代码时,是先读出当前行的代码并解析,for及之后的代码也是一次加载并解释的。这就导致for之后的代码中的变量设置了并没有立即生效。如果想要立即生效,需要启用变量延迟。

    • setlocal enabledelayedexpansion
      启用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
    • setlocal disabledelayedexpansion
      禁用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
    setlocal enabledelayedexpansion
    for /L %%i in (1,2,60) do (
      set /a val=%%i+1
      echo var1=%%i var2=!val!
    )
    endlocal
    setlocal enabledelayedexpansion
    for /L %%i in (1,1,100) do (
      set /a val+=%%i
      echo !val!
    )
    echo %val%
    endlocal
  • 相关阅读:
    毕业设计——第三章 开发方法及系统实现(2)
    毕业设计——第三章 开发方法及系统实现(5)
    毕业设计——第二章 系统总体设计(2)
    Blue Screen Of Death ( BSOD ) 错误信息解析解释
    毕业设计——第三章 开发方法及系统实现(3)
    毕业设计——第三章 开发方法及系统实现(4)
    dvbbs7.1sp1最新漏洞的研究和利用
    毕业设计——第二章 系统总体设计(1)
    一则笑话
    线性代数
  • 原文地址:https://www.cnblogs.com/bridgew/p/16151703.html
Copyright © 2020-2023  润新知