zoukankan      html  css  js  c++  java
  • 浅显易懂的win批处理指令--for指令入门

     for的基本用法是:

    for 变量 in (目标) do 执行行为

    不带参数的for命令

    @echo off
    for %%i in (1 2 3 4 5) do echo %%i
    pause

    输出结果:

    注意上面的临时变量%%i中的i,可以换成别的字母,但只能是一位。

    带参数 /L 的for

    参数/L 可以理解为 "list" 的意思,大小写均可。代表一个数列,下面脚本的意思是: 就是以 1 开始,步长为1 ,结束值为2的一个等差数列

    @echo off
    for /l %%i in (1 1 5) do echo %%i
    pause

    输出结果:

    带参数 /F 的for

    参数/F可以理解为“file”的意思,代码处理对象为文本串, 常用的参数有skip,tokens,delims,看示例:

    @echo off
    for /f "skip=1 tokens=1,2* delims= " %%a in (test.txt) do echo %%a %%b %%c
    pause

    test.txt的内容如下:

    A1
    A2 
    A3+111,222.333-444/555
    A4
    A5

    skip

    for循环文本内容是以行为单位,从上至下进行的,skip=1意识就是跳过文本的第一行,即不循环第一行, 那么skip=2 自然就是跳过前两行了,依次类推...

    @echo off
    for /f "skip=1" %%a in (test.txt) do echo %%a %%b %%c
    pause

    delims

    delims=后面的字符的意识是,将文本每一行的内容以delims=后面的字符分割成若干列.for默认是以,;和空格作分割符的, 所以一般要取得整行内容通常会用"delims="这样的形式来取消for的默认分割符。如果使用空格,要将空格放到最后

    @echo off
    for /f "tokens=1-3 delims=+./-" %%a in (test.txt) do echo %%a %%b %%c
    pause

    tokens

    tokens=1-5,1-5很好理解就1至5,前面我们用delims=后面的字符为分割符,将文本内容分成了多列,需要的是哪些列, 用它指定,默认是1列

    @echo off
    for /f "tokens=1-5 delims=+./-" %%a in (test.txt) do echo %%a %%b %%c %%d %%e
    pause

    代码中前面有个%%a, 这里的%%a就是代表第一列, 第二列就是%%b, 第三列就是%%c 依此类推
    那么我们如果把

    echo %%a %%b %%c %%d %%e 

    改为 

    echo %%e %%d %%c %%b %%a

    会如何呢? 会显示

    444 333 222 111  A3

     若是第一个%%a把它改为%%i也是一样,那么第二列就是%%j...%%k...依此类推,就是按英文字母的顺序依此类推的。

    如果用tokens=1,2*  有什么区别呢?

    代表从几至几
    , 代表单一的,如 tokens=1,5 就是代表第一列和第五列
    * 代表剩下的所有的列.  如:tokens=1,2*   代表%%a为第一列,  %%b为第二列,  %%c代表后面所有的列.
    @echo off
    for /f "tokens=1,2* delims=+./- " %%a in (test.txt) do echo %%a %%b %%c %%d %%e
    pause

     for /F 不但可以循环文本内容还可以循环字符串,如:

    @echo off
    for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
    pause

     

    for的 /D 参数

    /D参数(常用来查询当前目录或者指定目录的下的文件夹)

    基本用法:for /d %variable in (set) do command [command-parameters]

    @echo off
    for /d %%i in (d:A*) do echo %%i
    pause>nul

    如果省略 括号中的 "d:A*",则会直接查询批处理所在目录的文件夹
    假设本批处理文件保存在:d: t下
    运行以下批处理代码,将会 查询 d: t下的文件夹

    @echo off
    for /d %%i in (*) do echo %%i
    pause>nul

     For /R参数

    基本用法:

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    检查以 [drive:]path 为根的目录树中,所有符合(set)的文件或者文件夹。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。


    @echo off
    for /r d:	t %%i in (*) do echo %%i
    pause>nul

     枚举d: t下所有的 .bat文件(包括子目录)

    @echo off
    for /r d:	t %%i in (*.bat) do echo %%i
    pause>nul

     

    如果省略以上代码中的d: t,则会列举当前目录 所有符合(set)的文件
    如:列举批处理所在目录的所有批处理文件(包括子目录)

     

    @echo off
    for /r %%i in (*.bat) do echo %%i
    pause>nul

     for遍历文件或目录时,你一定看不懂%%~anx之类的东西,它的含义如下:

    @echo off
    for /r d:	t %%a in (*) do (
      echo        a:   文件完整信息                             %%a
      echo      ~da:  保留文件所在驱动器信息                   %%~da
      echo      ~pa:  保留文件所在路径信息                     %%~pa
      echo      ~na:  保留文件名信息                           %%~na
      echo      ~xa:  保留文件后缀信息                         %%~xa
      echo      ~za:  保留文件大小信息                         %%~za
      echo      ~ta:  保留文件修改时间信息                     %%~ta
      echo     ~dpa:  保留文件所在驱动器和所在路径信息         %%~dpa
      echo     ~nxa:  保留文件名及后缀信息                     %%~nxa
      echo    ~pnxa:  保留文件所在路径及文件名和后缀信息       %%~pnxa
      echo    ~dpna:  保留文件驱动器、路径、文件名信息         %%~dpna
      echo   ~dpnxa:  保留文件驱动器、路径、文件名、后缀信息   %%~dpnxa
    )
    pause>nul

     

    只要记住d-盘符 p-路径 n-文件名 x-文件后缀 t -修改时间 z-文件大小 这些字符分别是代表的是什么意思就可以了,些字符是可以互相任意搭配的。

     批处理指令片段

    @echo off 
    setlocal
    
    set sourcedir=D:	t
    set keepDir=.git node_modules
    
    rem 删除根目录下的文件夹
    for /d %%a in (%sourcedir%*) do (
      set isDel=1
      for %%b in (%keepDir%) do (
        if %%~nxa == %%b set isDel=
      )
      if defined isDel (
         rd /s /q %%a
      )
    )
    rem 删除根目录下的文件
    for %%a in (%sourcedir%*) do del %%a

    参考文章:

    [1] 浅谈批处理for命令中的变量扩展

  • 相关阅读:
    Leetcode Valid Sudoku
    Leetcode Surrounded Regions
    LeetCode Sqrt
    LeetCode POW
    LeetCode Next Permutation
    ACK-Ackermann, 阿克曼函数
    再不懂时序就 OUT 啦!,DBengine 排名第一时序数据库,阿里云数据库 InfluxDB 正式商业化!
    阿里云提供全托管 ZooKeeper
    性能压测中的SLA,你知道吗?
    第一个入驻阿里云自营心选商城,如今它已经是营收过亿的SaaS独角兽
  • 原文地址:https://www.cnblogs.com/wangpenghui522/p/14729870.html
Copyright © 2011-2022 走看看