bat进阶命令-for循环

for

for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。

1.1  for 普通用法

语法格式:
for
{%variable | %%variable} in (set) do command [command-parameters]
1.变量名称是区分大小写的,所以 %i 不同于 %I 2.在批处理文件中使用
FOR 命令时,指定变量建议用 %%variable而不要用 %variable。 3.(set) 指定一个或一组文件。可以使用通配符。 4.command 指定对每个文件执行的命令。 5.command-parameters 为特定命令指定参数或命令行开关。

forindofor语句的关键字,它们三个缺一不可
set是任何序列,可以只有一个元素。元素可以是变量、字符串,元素之间用空格键、tab键、逗号、分号或等号分隔
set必须用()包围,即使只有一个元素
%%variable是形式变量,即使没有在command中被使用,也不能省略
为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%variable替换为%%0~%%9中的任意一个
for语句依次提取(set)中的每一个元素,把它的值赋予形式变量variable,带到do后的command中参与命令的执行;当执行完一次do后的语句之后,再提取(set)中的下一个元素,再执行一次command,如此循环,直到(set)中的所有元素都已经被提取完毕,该for语句才宣告执行结束
例子:

@echo off
chcp 65001
title=for普通用法
for %%i in (1,2,3) do (
echo %%i)
pause

运行结果:

 1.2 for 带选项参数用法

1.2.1  for /d

for /d用于搜索目录或文件夹(不搜索文件),而且只搜索指定目录,不搜索子目录

语法格式:

for /d %%variable in (set) do command [command-parameters]

例子:

@echo off
chcp 65001
title=for-/d用法窗口
set url=C:\*
for /d %%i in (%url%) do (
echo %%i)
pause

运行结果:

 1.2.2 for /r 

for /r主要用于搜索指定路径及其所有子目录中符合要求的文件(/r后如果没有指定目录,则使用当前目录)

命令格式:

for /r [[drive :]path] %%variable in (set) do command [command-parameters]

进入根目录树[drive:]path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则假定为当前目录。如果 set 只是一个句号 (.) 字符,则只列举目录树。

例子1:

@echo off
chcp 65001
title=for循环窗口
set url=E:\Download
for /r  %url% %%i in (*.doc) do (
echo %%i)
pause

运行结果:

 例子2:

@echo off
chcp 65001
title=for循环窗口
rem set url=E:\Download
for /r   %%i in (*.bat) do (
echo %%i)
pause

运行结果:

 1.2.3  for /l 

for /l %variable in (start,step,end) do command [command-parameters]

该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

例子:

@echo off
chcp 65001 title=for窗口 for /l %%i in (1,2,10) do ( echo %%i ) pause

运行结果:

 

 1.2.4 for -f

for /f [<parsingkeywords>] [%%|%]variable in (set) do command [command-parameters]]
for /f 这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果
命令格式:
(1).FOR /F [“options”] %%i IN (file) DO command2).FOR /F [“options”] %%i IN (“string”) DO command–注意双引号
(3).FOR /F [“options”] %%i IN (‘command’) DO command–注意单引号

/f 表示读取文件file内容,以行为单位赋给%%i

  • 默认情况下,每行以空格键作为分隔符分割为第1节、第2节。。。默认只读取第1节赋值给%%i
  • 默认情况下,忽略以分号;打头的行

1.2.4.1 for /f %%i in (file) do command

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

例子:

1.txt

11111111  1111
2222222222 111
333333333 3333


444444444444
55555555555

代码:

@echo off
chcp 65001
title=for窗口
set url=E:\bat\1.txt
for /f %%i in (%url%) do (
echo %%i)
pause

for会先打开1.txt,然后读出1.txt里面的所有内容,把它作为一个集合,并且以每一行(文件中无分隔符情况下)作为一个元素,用%%i依次代替每个元素,然后执行do后面的命令。

运行结果:

 

 

 如果遇到有分隔符的情况的话,就无法将所有的内容显示出来,因为命令默认是以空格和TAB为分隔符,所以它遇到分隔符之后,默认只取第一个,就将分隔符后面的都丢掉了。

1.2.4.1.1  delims和tokens

如果我们还想把每一行再分解更小的内容,该怎么办呢?for命令提供了更多的参数,它们就是:delims和tokens

delims :告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键

for /f %%i in (%url%) do (echo %%i)
for /f "delims= " %%i in (%url%) do (echo %%i)
这两行的效果是一样的

如果我们想要每一行的后面的元素,那又如何呢?这个时候就可以利用tokens参数,它的作用就是当你通过delims将每一行分为更小的元素时,由tokens来控制要取哪一个或哪几个。
显示第二列,示例如下:

2.txt

第一列   第二列   第三列    第四列
111111   2222222  333333    44444444
111111   2222222  333333    44444444
222222   3333333  444444    55555555
555555   6666666  777777    66666666
555555   7777777  888888    99999999
@echo off
chcp 65001
title=窗口
set inp=E:\bat\2.txt
for /f "tokens=2 delims= "  %%i in (%inp%) do (echo %%i )
pause

运行结果:

 

 如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,全部显示则使用通配符tokens=*。

注意:如果显示多个元素(非*),比如这里的tokens=2-3,语句应该写成这样:

@echo off
chcp 65001
title=窗口
set inp=E:\bat\2.txt
for /f "tokens=2,3 delims= "  %%i in (%inp%) do (echo %%i %%j)
pause

运行结果:

 

 怎么多出一个%%j
这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。
并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j

显示从第二列到最后的一列,命令如下:

@echo off
chcp 65001
title=窗口
set inp=E:\bat\2.txt
for /f "tokens=2,* delims= "  %%i in (%inp%) do (echo %%i %%j)
pause

1.2.4.1.2 skip,eol和usebackq

skip
表示跳过第1到第n行,从n+1行开始读取,默认n=0,就是告诉for忽略前n行
示例如下:

@echo off
chcp 65001
title=窗口
set inp=E:\bat\2.txt
for /f "skip=2 tokens=* delims= "  %%i in (%inp%) do (echo %%i %%j)
pause

eol
用来指定当一行以什么符号开始时,就忽略它
示例如下:

2.txt

第一列 第二列 第三列 第四列
111111 2222222 333333 44444444
#111111 2222222 333333 44444444
222222 3333333 444444 55555555
#555555 6666666 777777 66666666
555555 7777777 888#888 99999999

脚本:

@echo off
chcp 65001
title=窗口
set inp=E:\bat\2.txt
for /f "eol=# tokens=* delims= "  %%i in (%inp%) do (echo %%i )
pause

运行结果:

 usebackq

usebackq 是一个增强型参数,当使用了这个参数之后,原来的for语句中第一个括号内的写法要做如下变动:如果第一个括号里的对象是一条命令语句的话,原来的单引号 ’ 要改为后引号 ` ;如果第一个括号里的对象是字符串的话,原来的双引号 " 要改为单引号 ’ ;如果第一个括号里的对象是文件名的话,要用双引号 " 括起来。
(1)命令语句示例如下:

@echo off
chcp 65001
title=窗口
for /f usebackq %%i in (`set`) do (echo %%i)
pause

运行结果:

 (2)文件名示例如下:

@echo off
chcp 65001
title=脚本执行窗口
for /f usebackq %%i in ("E:/bat/echo.bat") do (echo %%i)
pause

执行结果:

 (3)字符串示例如下:

@echo off
chcp 65001
title=脚本执行窗口
for /f  "tokens=* usebackq" %%i in ('Hello usebachq') do (echo %%i)
pause

运行结果:

 1.2.4.2 for /f %%i in (“string”) do command

@echo off
for /f "tokens=2,* delims= " %%i in ("this is an example!") do echo %%i %%j
pause

运行结果:

 

 1.2.4.3 for /f %%i in (‘command’) do command

@echo off
for /f "tokens=2,* delims==" %%i in ('set') do echo %%i
pause

运行结果:

 

 1.2.5 路径补充

 

 还有组合增强语法:

 

posted @ 2023-02-08 15:27  家乐福的搬砖日常  阅读(6138)  评论(0编辑  收藏  举报