• 【Windows】Windows中解析DOS的for命令使用


    目录结构:

    contents structure [+]

    一.简介

    在DOS窗口中,输入for /?查看官方给出的for命令的用法。

    FOR %variable IN (set) DO command [command-parameters]
    %variable 指定一个单一字母可替换的参数。
    (set)      指定一个或一组文件。可以使用通配符(* 和 ?)。
    command    指定对每个文件执行的命令。
    command-parameters  为特定命令指定参数或命令行开关。 现在开始讲每个参数的意思 


    我们知道了一个for命令的基本格式为:FOR 参数 %变量名 IN (相关文件或命令) DO 执行的命令。这里需要注意在DOS窗口中和在批处理文件中,for命令的格式有一定的差别,在DOS窗口中,变量以单百分号加字母表示,但若是在批处理文件中,变量以双百分号加字母表示,批处理文件中,for命令的基本格式为:FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令
    参数有四种,分别为/d、/r、/L、/f,每一种参数对应的for命令的具体格式也有所不同。接下来以此讲解每一种参数的使用:
    接下来的所有案例,若不是特别说明,都是以批处理文件的方式。

    二.for /d ... in ...

    /d表示目录搜索,它主要用于搜索目录,不会搜索文件。
    for命令的格式为:FOR /D %%variable IN (set) DO command
    如果set包含通配符,将对set想匹配的每个目录执行Command,%%variable代表了每一个目录。

    2.1 案例

    案例:打印C://根目录下所有的文件夹名称

    @echo off
    rem 进入到c盘根目录
    c:
    rem 打印当前目录下的所有文件夹名称
    for /d %%i in (*) do @echo %%i
    pause

    案例:打印当前路径下,只有1-3个字母的文件夹名称

    @echo off
    for /d %%i in (???) do @echo %%i
    pause

    案例:显示所有以window开始的文件夹名称

    @echo off
    rem 进入到C盘
    c:
    rem 显示所有以window开始的文件夹名称
    for /d %%i in (window?) do @echo %%i
    pause

    三.for /r ... in ...

    /r表示递归,以递归的方式对当前目录下的每个目录执行操作。
    for命令的格式为:FOR /R [[drive:]path] %%variable IN (set) DO command
    中括号[]表示可有可无,如果不指定开始递归的根目录,则以当前目录作为递归的根目录。
    这里需要注意,若set为点(.),则只枚举目录树。

    3.1 案例

    案例:显示C盘中所有以.exe结尾的文件名

    @echo off
    for /r c: %%i in (*.exe) do @echo %%i
    pause

    案例:显示当前目录及子目录下的所有以.exe结尾的文件名

    @echo off
    for /r %%i in (*.exe) do @echo %%i
    pause

    案例:显示当前目录及子目录的所有目录名

    @echo off
    for /r  %%i in (.) do @echo %%i
    pause


    现在清楚了/d 和 /r 参数的同异点了,他们都和目录有关,但/d只会检索当前目录下的所有目录,但/r可以以递归的方式检索所有目录。

    四.for /L ... in ...

    /L可以写成小写字母的/l,为了和数字1区分,下面还是用大写的字母L。
    /L表示迭代变量,在给定的起点、步长、终点迭代数据。
    for命令的格式:for /L %%Variable in (Start#,Step#,End#) do Command
    使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。

    4.1案例

    案例:打印1到5

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

    案例:增加5个CMD窗口

    @echo off
    for /L %%i in (1,1,5) do start cmd
    pause


    会发现,新增加了5个CMD窗口,若是(1,1,65535)呢,就会多开启65535个CMD窗口。如果把上面的start cmd换成 md %%i,那么就可以多建立5个文件夹。

    五.for /f ... in ...

    含有/f的for命令使用最多,
    for命令的格式:

    FOR /F ["options"] %%i IN (file) DO command
    FOR /F ["options"] %%i IN ("string") DO command
    FOR /F ["options"] %%i IN (command) DO command
    
    file代表一个或多个文件
    string 代表字符串
    command代表命令
    ["options"] 可选


    对于for命令的三个格式都大通小异,IN(file),IN("string"),IN(command)分别表示从文件、字符串、命令中读取数据。

    file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。

    假如文件a.txt中有如下内容:
    第1行第1列 第1行第2列 第1行第3列
    第2行第1列 第2行第2列 第2行第3列
    第3行第1列 第3行第2列 第3行第3列


    可以使用type命令来显示:

    @echo off
    type a.txt
    pause

    显示如下:

    第1行第1列 第1行第2列 第1行第3列
    第2行第1列 第2行第2列 第2行第3列
    第3行第1列 第3行第2列 第3行第3列

    使用for命令同样也可以完成这个功能:

    @echo off
    for /f "delims=
    " %%i in (a.txt) do echo %%i 
    pause

    其中delims= 表示以换行符分割。

    5.1 常用关键字

    5.1.1 delims关键字

    delims关键字表示分隔符,需要注意若不指定delims那么,默认以空格和Tab键分割。如果按照下面的格式使用空格来显示的话:

    @echo off
    for /f %%i in ("asas    daa") do @echo %%i
    pause

    上面的语句会显示asas。

    @echo off
    for /f "delims= " %%i in (a.txt) do echo %%i 
    pause

    显示:

    第1行第1列
    第2行第1列
    第3行第1列

    可以看出值显示了第一列的值

    5.1.2 tokens关键字

    tokens命令可以指定显示哪一列的数据,该命令还支持通配符(*)

    @echo off
    for /f "tokens=2,3 delims= " %%i in (a.txt) do @echo %%i %%j
    pause

    效果:

    第1行第2列 第1行第3列
    第2行第2列 第2行第3列
    第3行第2列 第3行第3列

    在上面的命令中多了%%j,这是for命令自动添加上的,通过"tokens=2,3 delims= "表示以空格为分割符号,取没行的第2和第3列数据。并且把第列的数据赋值给%%i,把第三列的数据赋值给%%j。如果要把第二列和第三列显示到同一列,那么可以把tokens=2,3换为tokens=2-3。

    对于通配符就是把这一行或是剩下的全部元素作为一列数据

    @echo off
    for /f "tokens=1,*" %%i  in (a.txt) do @echo %%i %%j
    pause

    显示:

    第1行第1列 第1行第2列 第1行第3列
    第2行第1列 第2行第2列 第2行第3列
    第3行第1列 第3行第2列 第3行第3列

    5.1.3 skip和eol关键字

    skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。

    @echo off
    for /f "skip=2 tokens=*" %%i in (a.txt) do @echo %%i
    pause

    5.2 显示当前目下的下的所有文件名

    @echo off
    rem 启用延迟变量
    setlocal enabledelayedexpansion  
    set /a v=1
    for /f "delims=." %%i in ('dir /b/a-d/oN *.*') do (
        set /a v+=1
        set temp=%%i
        @echo 第!v!个文件名:!temp!
    )
    pause
  • 相关阅读:
    A query was run and no Result Maps were found for the Mapped Statement 'com.demo.dao.UserDao.check'. It's likely that neither a Result Type nor a Result Map was specified.
    layui监听input内容变动简单粗暴
    Java多线程中
    Java 对象内存分析
    MySQL重做日志
    并查集-Java实现
    java虚拟机类加载机制
    Java的23种设计模式概述
    redo log 有什么作用?
    什么是redo log ?
  • 原文地址:https://www.cnblogs.com/HDK2016/p/8696082.html
Copyright © 2020-2023  润新知