注册 登录

清河洛

bat脚本中的for循环

qingheluo2020-06-29清河洛364
bat脚本的for语句基本形态如下:在cmd窗口中:for option %variable in (set) do command在批处理文件中:for option %%variable in (set) do command variable:是一个单字母(区分大小写)可替换的参数 set:指定一个或一组元素(可以使用通配符),多个元素之间,用空格键、tab、逗号、分号或等号分隔 command:指定每次循环执行的命令 option:指定参数或某个功能开关 在cmd窗口和批处理文件两种环境下的差异是:在cmd窗口中,形式变量variable必须使用单百...

bat脚本的for语句基本形态如下:

在cmd窗口中:for option %variable in (set) do command

在批处理文件中:for option %%variable in (set) do command

    variable:是一个单字母(区分大小写)可替换的参数
    set:指定一个或一组元素(可以使用通配符),多个元素之间,用空格键、tab、逗号、分号或等号分隔
    command:指定每次循环执行的命令
    option:指定参数或某个功能开关

在cmd窗口和批处理文件两种环境下的差异是:在cmd窗口中,形式变量variable必须使用单百分号引用;而在批处理文件中,必须使用双百分号

for语句的基本要素:

    for、in和do是语句的关键字,三个缺一不可;
    %%variable是对形式变量的引用,即使在do后的语句中没有参与语句的执行,也是必须出现的;
    set外面的括号不能省略;

set的应用:

简单的多元素:

for %%i in (a,b) do echo %%i
运行显示:
a
b

遍历目录(默认会递归的遍历所有子目录):

for %%i in (*.txt) do echo %%i
    该语句会遍历当前所在目录下及所有子目录下的txt文件

option选项:

/D :只遍历目录,忽略不显示文件
/R "path" :指定要遍历的目录(默认为"."表示当前目录)
/L :使用该选项则set应该是一个表示以增量形式从开始到结束(start,step,end)的数字序列
    如for /L %%i in (1,2,5) do echo %%i 表示1,3,5
    for /L %%i in (5,-1,2) do echo %%i 表示5,4,3,2
/F :用来处理文件和命令的输出结果
    当set为多个文件集合时:for会依次将set中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行为一个元素,忽略空白的行。用%%variable依次代替每个元素,然后执行do后面的命令
    当set为反单引号括起来时,作为系统命令执行,其输出会被捕获到内存中,并被当作文件分析
    当set为多个单引号包含的字符串集合时,每个字符串作为一行,依次全部读取到内存,并被当作文件分析
    eol=x :忽略以指定字符(只能指定一个)开头的行
    skip=n :指在文件开始时忽略的行数
    delims=xxx :指定分隔符(可以指定多个),默认为空格和tab
    tokens=a,b,...[*] :指定每行由分隔符分割完之后要显示的列,一般和delims配合使用
        遇到分割符之后,会自动分配变量
            如variable为i,则会把第一个要显示的列(第a列)分配给%%i,第b列分配给i字母后面的一个字母即%%j,以此类推
            如variable为m,则第a列分配给%%m,第b列分配给m字母后面的一个字母即%%n
            如果最后一个是星号(*),显示列里面最大的数字之后的所有列以一个整体全部显示(不在分割)
    usebackq :
        1.把反单引号(英文输入状态下按tab上面数字键1左边的按键)包含的字符串作为命令;
        2.允许使用双引号扩起文件名称。不加此选项双引号会被理解文件名的字符

如11.txt文件内容为:

11-12-13-14-15-16-17
#21 22 23 24 25 26 27
31 32 33-34 35 36 37
41-42-43-44-45-46-47

for语句:

for /F "eol=# delims=- tokens=3,1,4,*" %%a in (11.txt) do echo (1)%%a (2)%%b (3)%%c (4)%%d
显示结果为:
(1)11 (2)13 (3)14 (4)15-16-17
(1)31 32 33 (2) (3) (4)
(1)41 (2)43 (3)44 (4)45-46-47

解析:

1、eol=#表示以井号开头的行忽略,所以没有显示第2行
2、delims=-表示以减号作为分隔符
3、tokens=3,1,4,*表示显示第3,1和4列,显示列里面最大的数字4之后的列以一个整体全部显示,第2列不会显示出来
4、tokens后面的数字顺序不重要,显示会按照数字大小排列
5、第1分配给变量%%a(由for语句指定),那么后面要显示的第3列和第4列会自动分配给变量%%b和%%c(字母a后面紧跟着的字母),最后星号表示的列继续向后分配给变量%%d


网址导航