3.2.3 for循环语句

2022-04-13 15:07 更新

《批处理入门手册》
三.批处理高级语句篇
-----------------------------------------------------------------------------------------------------
3.2.3 学习for循环语句

学习要点:
1.for /d 参数 查询目录
2.for /r 参数 遍历搜索
3.for /l 参数 建立序列
-----------------------------------------------------------------------------------------------------


一、for /d 参数 查询目录
格式:FOR /D %%variable IN (set) DO command [command-parameters]

关于/d 参数,大家要注意!
1,这个参数主要用于目录搜索,不会搜索文件。
2,只能搜索指定目录和缺省情况当前目录下的目录名字,不搜索子目录。
-----------------------------------------------------------------------------------------------------

例1
@echo off
for /d %%i in (c:\*) do echo %%i
pause

执行后会把C盘根目录下的全部目录名字打印出来,而文件则不显示!如果我们要把当前路径下文件夹的名字只有1~3
个字母的打出来,我们可以改成如下的

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

这样的话,如果你当前目录下有目录名字只有 1~3 个字母的,就会显示出来,没有就不显示。这里解释下*号和?号的
作用,*号表示任意 N 个字符,而?号只表示任意一个字符。

例3
@echo off
for /d %%i in ("C:\Program Files\*") do echo %%i
pause
执行后就会显示C:\Program File目录下的所有文件夹名称了,"C:\Program Files\*" 这里用了双引号是因为目录中
有空格。

例4
@echo off
for /d %%i in (c:\w*) do echo %%i
pause

搜索以W开头的目录名称!(不区分大小写)

例5
@echo off
for /d %%i in (c:\w*s) do echo %%i
pause

搜索以W开头S结尾的目录名称!(不区分大小写)

例6
@echo off
for /d %%i in (*)do rd /s /q "%%i"
pause

这里是删除当前目录下的文件夹,但不会删除文件。
先用for /d 取得当前目录所有的文件夹,注意,是文件夹(如果是for /r ,则是文件)
然后再分别用rd命令把它(文件夹)删除。那么剩下的都是文件了。

再说个小技巧:
for /d %%i in (*)do rd /s /q "%%i"
这语句可以写作:
for /d %%i in (*)do echo rd /s /q "%%~fi"
当测试成功后,再把echo 去掉,这时执行命令才会生效,防止出错!
-----------------------------------------------------------------------------------------------------

 


二、for /r 参数 遍历搜索
格式:FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]

检查以  [drive:]path  为根的目录树,指向每个目录中的 FOR  语句。如果在  /R  后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。

这个R可以理解为recursive的缩写,也就是递归的意思。所谓递归简单点来说就是对其目录及其子目录的所有文件进
行操作。

前面我们知道,/d 搜索的是目录名字,那么现在这个/r 则是搜索当前或者你指定路径下的文件名字。
-----------------------------------------------------------------------------------------------------


这里要注意2 点:
  1、set 中的文件名如果含有通配符(?或*),则列举/R 参数指定的目录及其下面的所有子目录中与 set 相符合的
所有文件,无相符文件的目录则不列举。

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

咱们把这个 BAT 保存到 D 盘随便哪里然后执行,我会就会看到,他把 C 盘根目录,和每个目录的子目录下面全部的
EXE 文件都列出来了!

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

这个命令前面没加那个 c:\ (也就是搜索路径),这样它就会以当前目录为搜索路径,比如你这个 BAT放在 d:\test
目录下执行,那么它就会把 d:\test 目录和它下面的子目录的全部EXE 文件列出来!!!
-----------------------------------------------------------------------------------------------------


  2、如果 set  中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管
set 中的指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个
文件。

例3
@echo off
for /r c:\ %%i in (boot.ini) do echo %%i
pause

执行后,它不管boot.ini是否存在而将枚举c 盘所有目录。为了只列举 boot.ini 存在的目录,我们可改成下面这样

例4
@echo off
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i
pause

我们再来看这个例子,

例5
@echo off
for /r %%i in (boot.ini) do echo %%i
pause

这个命令前面没加那个 c:\ (即是搜索路径),这样它就会以当前目录为搜索路径,比如我这个 BAT放在 d:\test 目
录下执行,那么它不管boot.ini是否存在,会把 d:\test 目录和它下面的子目录全部列出来!!

☆☆注意:for /r不会遍历隐藏文件!
-----------------------------------------------------------------------------------------------------

 


三、for /l 参数 建立序列
格式:FOR /L %%variable IN (start,step,end) DO command [command-parameters]

该语句中(start,step,end)表示以增量或者递减形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列1 2 3
 4 5,(5,-1,1) 将产生序列5 4 3 2 1

/l参数将对start与end两个数值进行比较来执行迭代变量,如果star小于end,就会执行该命令。如果迭代变量超过end
值,则命令解释程序退出此循环。
 
看得头晕了吧,那我们来看例子吧。

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

执行看效果,他会打印从 1 2 3 4 5这样5 个数字,而且每个数字占一行。
(1,1,5)这个参数也就是表示从 1 开始每次加 1 直到5 终止!


我们再来看

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

执行之后弹出了5个CMD窗口是不是吓了一跳,呵呵^^P
把那个start cmd 改成md %%i  这样我们就会名为1 2 3 4 5的5个目录了!
-----------------------------------------------------------------------------------------------------

 


Januapr编辑于2009-09-13 星期日15:01:14.75

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号