【Batch批处理】for循环全参数详解和实例演示

上一篇文章中,我们知道了用goto加标签的方式实现了简单的while循环。但是对于一些比较复杂的循环,例如对特定命名规则的文件或文件夹批量删除,多个文件的内容批量读取和处理等等,while循环是捉襟见肘的,这个时候就需要for循环来帮忙了。这一节我们就来看看for循环都有哪些用法。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

简单介绍

for /?可以看到官方文档是这样定义for的:对一系列文件中的每一个文件依次跑一个命令

Runs a specified command for each file in a set of files.

所以常规情况下,for循环是用来处理一堆文件的。但是不同的参数又赋予了for循环非常强大的附加功能,下面我们会看到。

使用方法详解

常规使用

还是根据官方文档,不加任何额外参数的情况下,语法如下

FOR %variable IN (set) DO command [command-parameters]

  %variable  Specifies a single letter replaceable parameter.
  (set)      Specifies a set of one or more files.  Wildcards may be used.
  command    Specifies the command to carry out for each file.
  command-parameters
             Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %%variable instead
of %variable.  Variable names are case sensitive, so %i is different
from %I.

需要注意的是,在命令行中使用一个%表示变量,在批处理文件中需要两个%和批处理中大多数参数一样,这里的变量名或者参数大小写都不敏感

例如:将所有temp开头的文件都移动到folder1中

::for loop test
@echo off
for %%a in (temp*) do copy %%a folder1
exit /b

批处理中的通配符有俩个,*表示多个字符,?表示单个字符

这里没加任何参数,表示的只是当前目录下的文件,并不会进入子文件夹进行查找。想要进入子文件进行遍历需要用到后面介绍的参数。

执行效果如下

c:\Batch\test>for.bat
        1 file(s) copied.
        1 file(s) copied.

如果想要执行的命令有多个,需要用小括号围起来

例如:移动之前显示一下文件名字

::for loop test
@echo off
for %%a in (temp*) do (
echo %%a
copy %%a folder1)
exit /b

执行效果如下

c:\Batch\test>for.bat
temp1.txt
        1 file(s) copied.
temp2.txt
        1 file(s) copied.

参数详解

for循环的参数还是相当多的,对照着官方文档我们一个个来看,这里省略了一些说明文字

If Command Extensions are enabled, the following additional
forms of the FOR command are supported:

FOR /D %variable IN (set) DO command [command-parameters]

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

FOR /L %variable IN (start,step,end) DO command [command-parameters]

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]

/D参数

如果(set)是文件夹,而非文件时,需要用到这个参数

例如:删除所有temp开头的文件夹

::for loop test
@echo off
for /d %%a in (temp*) do (
echo %%a
rd %%a)
exit /b

/D /R参数

加上/R表示进入子文件夹进行遍历查找

例如:将所有temp开头的文件夹移动到最外层目录的外面

::for loop test
@echo off
for /d /r %%a in (temp*) do (
echo %%a
move %%a ..)
exit /b

执行效果如下,可以看到子目录里面的文件夹也被移动了

c:\Batch\test>for.bat
c:\Batch\test\temp2
        1 dir(s) moved.
c:\Batch\test\folder1\temp1
        1 dir(s) moved.

/R参数

单独使用/R表示指定路径

例如:删除目录c:\Batch\test\folder2下面所有temp开头的文件

::for loop test
@echo off
for /r c:\Batch\test\folder2 %%a in (temp*) do (
echo %%a
del %%a)
exit /b

如果/r后面不接任何路径,就会遍历当前目录以及所有子目录下所有文件

例如:将本目录以及子目录中所有log文件复制到外层目录

::for loop test
@echo off
for /r %%a in (*.log) do (
echo %%a
copy %%a ..)
exit /b

删除子目录下的文件可能会遇到报错 the system cannot find the file specified,建议用del *.log /s去完成删除

/L参数

如果(set)是一串数字需要用到/L参数,(set)的格式为(起始值,步长,结束值)

例如:打印0-30的所有偶数

::for loop test
@echo off
for /l %%a in (0,2,30) do (
echo %%a)
exit /b

运行结果如下

c:\Batch\test>for.bat
0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30

/F参数

这个参数官方文档给了3种应用场景,但是总结起来其实就是一个,那就是处理字符串。要么(set)直接就是一个字符串;要么(set)就是几个文件,会将文件内容读取出来做为多行字符串来处理;要么(set)是一个命令,会将命令的结果做为多行字符串进行处理

  • 不带参数
    不带参数的情况下,以空格做为分隔符,将一个长的字符串分割为多个子字符串,官方文档叫token,获取从左往右第一个token赋值给变量,例如
c:\Batch\test>for /f %a in ("life is wonderful") do echo %a

c:\Batch\test>echo life
life

读取文件内容,处理多行字符串。需要注意的是这里的文件名不支持通配符

c:\Batch\test>type temp1.txt
life is wonderful
c:\Batch\test>type temp2.txt
today is Sunday
c:\Batch\test>for /f %a in (temp1.txt temp2.txt) do echo %a

c:\Batch\test>echo life
life

c:\Batch\test>echo today
today

c:\Batch\test>

获取命令结果,进行再次处理

c:\Batch\test>for /f %a in ('dir /b') do echo %a
  • 带参数
    这应该是for循环比较难理解的地方。参数常用的有两个,一个叫tokens,后面接从1开始的整数,表示取第几个token传递给变量;还有一个叫delims,后面接一个符号用来代替默认的空格做为分隔符。这里面需要注意的是token数目多于一个的时候,变量名需要按照字母顺序表的方式去依次往后排来获取下一个token,例如%a表示第一个token,那么%b用来表示第二个token,依次类推。例如
c:\Batch\test>type temp1.txt
life is wonderful
c:\Batch\test>type temp2.txt
today is Sunday
c:\Batch\test>for /f "tokens=1,3,4" %a in (temp1.txt temp2.txt) do echo %a+%b+%c

c:\Batch\test>echo life+wonderful+
life+wonderful+

c:\Batch\test>echo today+Sunday+
today+Sunday+

从上面的例子可以看出三点:和很多编程语言不同,token是从1开始取值的;当token不是连续的时候,变量名还是要连续;变量名没有内容的时候不会报错,而是返回空值

再例如打印所有环境变量的内容

for /f "tokens=1-2 delims==" %a in ('set') do echo %b

这里就是以等号做为分隔符,返回两个token,然后打印出第二个token。这里也用了tokens的第二种表达方式,用短线表示取值范围

实测这里的命令不支持管道符号

使用场景

其实对参数的总结也基本就是所有的应用场景了

  • 对文件或者文件夹进行遍历处理
  • 类似while循环对数字进行循环处理(但是只针对明确的数字集合)
  • 字符串的分割处理
  • 多个文件内容的按行遍历处理

总结

for循环算是批处理中比较难懂的一个语法,主要是因为和其他语言的格式区别太大,只有通过多多练习才能熟练掌握。

我这里抛砖引玉,希望大家能通过这一节的总结获得帮助。

发布了25 篇原创文章 · 获赞 2 · 访问量 1689

猜你喜欢

转载自blog.csdn.net/Victor2code/article/details/103555832