04-CMD_for命令详解_参数

一、基本格式 

    格式:
        FOR %%variable IN (set) DO command [command-parameters] 
    说明:
        %%variable    指定一个单一字母表示可替换的参数。 
        (set)         指定一个或一组文件。可以使用通配符。 
        command       指定对每个文件执行的命令。 
        command-parameters 
                    为特定命令指定参数或命令行开关。 
    参数: 
        /d   /l   /r   /f    
    注意:
        IN (set) , "in" 和 "(set)" 之间有空格
        在 bat文件中, 使用 %%variable, 
        在 MS-DOS中, 使用 %variable


二, 参数 /d

    概念:
        主要用于目录搜索,不会搜索文件
        只能显示当前目录下的目录名字.
    格式:
        FOR /D %%variable IN (set) DO command [command-parameters] 
            如果集(set)中包含通配符,则指定与目录名匹配,而不与文件名匹配。 
            如果  Set (也就是我上面写的 " 相关文件或命令")  包含通配符(*  和 ? ),
            将对与 Set  相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command 。        
    举例:
        1, 搜索目录
           3.bat => 显示匹配 c:\*的目录
            @echo off 
            for /d %%i in (c:\*) do echo %%i 
            pause 
        2, 打印 当前目录下 名字只有1-3个字母的目录
           4.bat =>
            @echo off
            for /d %%i in (???) do echo %%i
            pause
           说明:
                * 号表示任意 N 个字符 ,
                ?号只表示任意一个字符 
        3, 打印 当前目录下 window? 的目录
           5.bat => 
            @echo off
            rem 当前目录, 然后切换到 c:\ 目录
            pushd c:\
            for /d %%i in (windows?) do echo %%i
            rem 切换到栈顶目录
            popd
            pause


三, 参数 /R

    格式:
        FOR /R [[drive:]path] %%variable IN  (set) DO command [c ommand-parameters] 
            [[drive:]path] : 搜索 以指定目录为跟的目录树; 如果没有指定则使用当前目录的目录树.
    说明:   
        /D, 只能显示当前目录下的目录名字.
        /R, 能把 指定目录 下的文件名取出来.
    注意:
        1, set 中包含通配符(?或者*)的文件名
            列举出所有真实存在的文件的绝对路径
        2, set 中不包含通配符,而是具体的文件名  
            将所有目录及其子目录 与 指定文件名 拼接,然后列出


    举例:
       1, 6.bat => 列举 d:\cmd下所有.txt文件 (绝对路径)
            @echo off
            rem for /r d:\cmd %%i in (*.txt) do echo %%i
            for /r d:\cmd %%i in (*.txt) do if exist %%i echo %%i
            pause
       2, 7.bat => 
            @echo off
            for /r d:\cmd %%i in (1.txt) do echo %%i
            echo ====================================
            for /r d:\cmd %%i in (1.txt) do if exist %%i echo %%i 
            pause
            结果:
                d:\cmd\1.txt             // 不存在
                d:\cmd\01\1.txt          // 不存在
                d:\cmd\01\autorun\1.txt  // 不存在
                d:\cmd\02\1.txt             // 存在
                d:\cmd\03\1.txt          // 不存在
                =========================
                d:\cmd\02\1.txt             // 存在
                请按任意键继续. . .


四, 参数 /L

    概念:
        该集表示以增量形式从开始到结束的一个数字序列。
    作用:
        重复执行某个命令
    格式:
        FOR /L %%variable IN (start,step,end) DO command [command-parameters] 
    举例:
       8.bat =>
        @echo off
        for /L %%i in (1, 1, 5) do echo %%i
        pause        
        结果:
            1
            2
            3
            4
            5
            请按任意键继续. . .       
            

五, 参数 /F

    概念:
        迭代 及 文件解析.
    格式:
        FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters] 
        FOR /F ["options"] %%variable IN ("string") DO command [command-parameters] 
        FOR /F ["options"] %%variable IN (`command`) DO command [command-parameters]        
    说明:
        fileset 为一个或多个文件名。
        继续到 fileset 中的下一个文件之前,每份文件都被打开、读取并经过处理。
        处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。
        然后用已找到的符号字符串变量值调用 For 循环。
        以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
        您可通过指定可选 "options" 参数替代默认解析操作。
        这个带引号的字符串包括一个或多个指定不同解析选项的关键字。
        这些关键字为:        


        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                          默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                          的 for 本身。这会导致额外变量名称的分配。m-n
                          格式为一个范围。通过 nth 符号指定 mth。如果
                          符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后
                          分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:
                          在作为命令执行一个后引号的字符串并且一个单
                          引号字符为文字字符串命令并允许在 file-set
                          中使用双引号扩起文件名称。
    范例:
    1, FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters] 
        FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k


        会分析 myfile.txt 中的每一行.
        "eol=;" : 忽略以分号打头的那些行.
        "delims=, " : 每一行可以有多个符号, 符号之间用 逗号以及空格隔开.
        符号: 默认以逗号隔开每一行的符号.
        "tokens=2,3*" : 将每行中的第二个和第三个符号传递给 for 函数体.
                        此 for 函数体的语句引用:
                            1) %i 来获得第二个符号
                            2) %j 来获得第三个符号
                            3) %k 来获得后面的所有剩余符号
        myfile.txt : 对于带有空格的文件名,您需要用双引号将文件名括起来。
                     为了用这种方式来使用双引号,还需要使用 usebackq 选项,
                     否则,双引号会被理解成是用作定义某个要分析的字符串的。
        %i,%j,%k : %i 在 for 语句中显式声明,
                   %j 和 %k 是通过tokens= 选项隐式声明的。
                   i,j,k 是顺序的.
                   可以通过 tokens= 一行指定最多 26 个符号,
                   只要不试图声明一个高于字母 "z" 或"Z" 的变量。
                   请记住,FOR 变量是单一字母、分大小写和全局的变量,
                   而且,不能同时使用超过 52 个。
        测试:
         myfile.txt=>
            1A 1B 1C 1D 1E 1F 1G 1H
            2A 2B 2C 2D 2E 2F 2G 2H
            3A 3B 3C 3D 3E 3F 3G 3H
         d:\cmd\02>for /f "tokens=2,3*" %i in (myfile.txt) do @echo %i %j %k                                    
            1B 1C 1D 1E 1F 1G 1H
            2B 2C 2D 2E 2F 2G 2H
            3B 3C 3D 3E 3F 3G 3H
         注意: 将 %k 换成其他字符 会显示不出来剩下的.


    2, FOR /F ["options"] %%variable IN ("string") DO command [command-parameters] 
       说明:
            用单(双)引号将括号之间的 file-set 括起来。
            这样,该字符串会被当作一个文件中的一个单一输入行进行解析。
       举例:
        d:\cmd\02>for /f "tokens=1,2,*" %i in ("1B 1C 1D 1E 1F") do @echo %i %j %k
        1B 1C 1D 1E 1F


    3, FOR /F ["options"] %%variable IN (`command`) DO command [command-parameters]
       说明:        
            用 FOR /F 命令来分析命令的输出。
            将括号之间的 file-set 变成一个反括字符串。
            该字符串会被当作命令行,传递到一个子 CMD.EXE,
            其输出会被捕获到内存中,并被当作文件分析。
       举例:
            FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
            以"="作为分隔符,会枚举当前环境中的环境变量名称。


            @echo off & for /f "usebackq delims== tokens=1,2" %i in (`set`) do if /i %i==path echo %j
            打印出 path 环境变量的值, 类似于:
            set | find /i "path"


            FOR /F "usebackq delims=" %i IN (`net user`) DO @echo %i

            FOR /F "delims=" %i IN ('net user') DO @echo %i

            "delims=" 去掉分隔符,即每行第一个符号为整行数据.
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值