说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

For循环语句详解 - DOS BAT批处理编程入门教程(五)

HTML文档下载 WORD文档下载 PDF文档下载
上一节介绍了三种流程控制语句,对循环语句For只是简单介绍了一下,其实For的功能非常,本文的主要内容来源于网络。

上一节介绍了三种流程控制语句,对循环语句For只是简单介绍了一下,其实For的功能非常多,下面的内容来源于网络:http://www.yoyotao.net/ttt/post/137.html

 

格式:FOR [参数] %%变量名 IN (相关文件或命令)   DO 执行的命令

  作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。

  注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

  关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f

  下面分别解释一下

 

零:无参数时:

 

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

  %variable  指定一个单一字母可替换的参数。

  (set)      指定一个或一组文件。可以使用通配符。

  command    指定对每个文件执行的命令。

  command-parameters

  为特定命令指定参数或命令行开关。

 

  示例:

  for %%i in (t*.*) do echo %%i --显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径) 

  for %%i in (d:\mydocuments\*.doc) do @echo %%i --显示d:\mydocuments\目录下与*.doc相匹配的文件

 

一、参数 /d (参数只能显示当前目录下的目录名字)

 

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

  这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(TTT特别说明:只会搜索指定目录下的目录,不会搜索再下一级的目录。)

 

  示例:

  for /d %%i in (c:\*) do echo %%i  --显示c盘根目录下的所有目录

  for /d %%i in (???) do echo %%i  --显示当前目录下名字只有1-3个字母的目录

 

二、参数 /R (搜索指定路径及所有子目录中与set相符合的所有文件)

 

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

  此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。

 

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

  2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。

  例:for /r c:\ %%i in (*.exe) do echo %%i --把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!

 

  示例:

  for /r c:\ %%i in (boot.ini) do echo %%i --枚举了c盘所有目录

  for /r d:\backup %%i in (1) do echo %%i  --枚举d\backup目录

  for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i  --很好的搜索命令,列举boot.ini存在的目录

 

三、参数 /L (该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step)

 

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

  该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step

 

  示例:

  for /l %%i in (1,1,5) do @echo %%i  --输出1 2 3 4 5

  for /l %%i in (1,2,10) do @echo %%i  --输出1,3,5,7,9 

  for /l %%i in (100,-20,1) do @echo %%i  --输出100,80,60,40,20

  for /l %%i in (1,1,5) do start cmd  --打开5个CMD窗口

  for /l %%i in (1,1,5) do md %%i  --建立从1~5共5个文件夹

  for /l %%i in (1,1,5) do rd /q %%i  --删除从1~5共5个文件夹

 

四、参数 /F

格式:

FOR /F ["options"] %%i IN (file) DO command

 

FOR /F ["options"] %%i IN ("string") DO command

 

FOR /F ["options"] %%i IN ('command') DO command

 

这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

 

file代表一个或多个文件

 

string 代表字符串

 

command代表命令

 

["options"] 可选

 

对于FOR /F %%i IN (file) DO command

 

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

 

假如文件a.txt中有如下内容:

 

第1行第1列 第1行第2列 第1行第3列

第2行第1列 第2行第2列 第2行第3列

第3行第1列 第3行第2列 第3行第3列

 

你想显示a.txt中的内容,会用什么命令呢?当然是type,type a.txt

 

for也可以完成同样的命令:

 

for /f %%i in (a.txt) do echo %%i

 

还是先从括号执行,因为含有参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,

 

{“第1行第1列 第1行第2列 第1行第3列”, rem 第一个元素

 

“第2行第1列 第2行第2列 第2行第3列”, rem 第二个元素

 

“第3行第1列 第3行第2列 第3行第3列”}   rem 第三个元素

 

集合中只有3个元素,同样用%%i依次代替每个元素,然后执行do后面的命令。

 

具体过程:

 

用%%i代替“第1行第1列 第1行第2列 第1行第3列”,执行do后面的echo %%i,显示“第1行第1列 第1行第2列 第1行第3列”,

 

用%%i代替“第2行第1列 第2行第2列 第2行第3列”,执行echo %%i,显示“第2行第1列 第2行第2列 第2行第3列”,

 

依次,直到每个元素都代替完为止。

 

为了加强理解/f的作用,请执行一下两个命令,对比即可明白:

 

for /f %%i in (a.txt) do echo %%i rem 这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中 

的内容。

 

for %%i in (a.txt) do echo %%i rem 而这个只会显示a.txt这个名字,并不会读取其中的内容。

 

通过上面的学习,我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。

 

它们就是:delims和tokens

 

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

 

比如,还是上面的文件,我们执行下面的命令:

 

for /f "delims= " %%i in (a.txt) do echo %%i

 

显示的结果是:

 

第1行第1列

第2行第1列

第3行第1列

 

为什么是这样的呢。因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。

 

执行过程是:

 

将第一个元素“第1行第1列 第1行第2列 第1行第3列”分成三个元素:“第1行第1列” “第1行第2列” “第1行第3列”,它默认只取第一个,即“第1行第1列”,然后执行do后面的命令,依次类推。

 

但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢?

 

这时候,tokens跳出来说,我能做到。

 

它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。

 

还是上面的例子,执行如下命令:

 

for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i

 

执行结果:

 

第1行第2列

第2行第2列

第3行第2列

 

如果要显示第三列,那就换成tokens=3。

 

同时tokens支持通配符*,以及限定范围。

 

如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。

 

此时的命令为:

 

for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j

 

怎么多出一个%%j?

 

这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。

 

并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j

 

执行结果为:

 

第1行第2列 第1行第3列

第2行第2列 第2行第3列

第3行第2列 第3行第3列

 

对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。

 

比如:

 

for /f "tokens=* delims= " %%i in (a.txt) do echo %%i

 

执行结果为:

 

第1行第1列 第1行第2列 第1行第3列

第2行第1列 第2行第2列 第2行第3列

第3行第1列 第3行第2列 第3行第3列

 

其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。

 

再如:

 

for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j

 

执行结果为:

 

第1行第2列 第1行第3列

第2行第2列 第2行第3列

第3行第2列 第3行第3列

 

用%%i代替第二列,用%%j代替剩余的所有

 

最后还有skip合eol,这俩个简单,skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。

 

比如:

 

for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i

 

结果为:

 

第3行第1列 第3行第2列 第3行第3列

 

用skip来告诉for跳过前两行。

 

如果不加tokens=*的话,执行结果为:

 

第3行第1列

 

不知道怎么回事。

 

再如,当a.txt内容变成:

 

.第1行第1列 第1行第2列 第1行第3列

.第2行第1列 第2行第2列 第2行第3列

第3行第1列 第3行第2列 第3行第3列

 

执行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i结果是:

 

第3行第1列 第3行第2列 第3行第3列

 

用eol来告诉for忽略以“.”开头的行。

 

同样也必须加tokens=*,否则只会显示“第3行第1列”,还是不知道怎么回事。

Fedora欲以MariaDB取代MySQL 将节能进行到底:Facebook为冷存储寻求廉价闪存 谷歌Q4财报净利润28.86亿美元 超分析师预期 社交媒体的力量:Wood Camera登上iOS付费榜首之谜 屏蔽GitHub是互联网时代的“闭关锁国”吗? 巧妙利用空白设计案例分享(多图) 用友发布2013/新三年业务策略 力推UAP/CSP云平台 AWS集群计算新增内存分析EC2实例 手游:鼓足力气,掰弯传统3D游戏大作 LBA兴起:未来移动广告将基于地理位置 苹果发布2013财年Q1财报:iPhone销量及营收低于预期 不再被墙后 一个全新GitHub到来 与乔布斯并肩作战的日子 Google抛弃Exchange ActiveSync WP用户获DAV支持 Facebook真的要做“Facebook Phone”? 程序员,都去写一写前端代码吧 清除山寨和广告应用,“豌豆洗白白”服务上线 谷歌另类“开源” 程度仍不及Facebook和Twitter 想在云中分一份蛋糕? 不妨试试“山寨” 为何乔布斯脾气怪糟 却能让一群最优秀的人为他卖命? 单页Web设计案例+技巧攻略(多图) IE10里的捕捉模式和响应式设计 在“亚马逊商店”出售自己:产品经理这么找工作 【CTO俱乐部第92期】大规模存储与电商架构演化实战分享 刘黎明:PaaS是非主流业务,要与IaaS融合 个人手机游戏开发者之死 为什么苹果的应用审核是个笑话? 程序员性格怪癖是才华横溢的表现,还是危险分子的征兆? JavaScript Source Map详解 8条学习编程的可靠建议 一周消息树:亲爱的GitHub,我们怎么访问不了你? 在自己的机器上打不开联接 DataModule的问题(菜鸟级) 怎么把表中的列约束为唯一的? 一个编程论坛 从没见过的问题!!!晕了!! 安装问题,请指教! C++的应用是什么意思呢? 得到上传文件大小的问题,解决高分相送!! R6中的问题!高手请进!高分求救! 一个电子书籍下载和编程论坛 请问怎么在vb中调用纯c接口的api并实现多线程 如何在一个很大的文件中删除一段数据?不用拷贝的方法 the C++ programing language里的两个小问题!!! 找在没行带checkbutton的listbox控件类 我可怜的QQ被盗了~~有什么密码破译软件取回QQ的密码吗 VARIANT结构中,如何通过pvarVal指针来获得串口传来的二进制流?? 天啊,这就是《程序员》? 编译java程序需要哪些工具,菜鸟提问. how to use *.pak?? ★在数据窗口中如何同时实现多行操作,如update或delete多行。 请问oracle8i的下载问题! 请问MSDN.net 中文版光盘出了吗??????????????????????? 关于STRING的问题 在IE中程序运行有错误?请指点! JB8做个BMP,奇怪问题 有谁知道*.dns用什么软件打开吗,急!!! 大家给我推荐一个delphi源码网站 Oracle8.17的安装问题,请大家帮忙,急呀!谢谢! csv文件存储求助 问个关于checkboxlist控件的用法! 客户端通过Session Bean 调用 Local EntityBean的问题. 启动j2ee的问题--j2ee -verbose 那里能够下载破解的install shield 5.0 or 5.5 or 6.0? 我想搞网络游戏开发,请教各位的意见 如何在接受表单的ASP文件中,去知晓是这个表单中的哪个'确认按钮'被按下了?? 我的数据库打不开了!!! 连接MySQL数据库服务器? 有谁可以推荐几个国外的比较热的asp论坛,多谢! 我是一个菜鸟,想学asp,希望前辈给指条路 有人知道工程硕士是怎么回事吗?和普通的有什么不同啊,可以考普通的博士吗?谢谢阿 access数据库为何备份出错? 有了主键,还需要建立索引吗?解决送分。 在Oracle的逻辑数据库结构中有个概念叫"范围"的是什么意思呀? 能将javascript改写成其它语言吗? 为什么动态创建的控件不能保存? HelpProvider控件的问题 如何把几个dbf表中的数据导到一个表中? 软件汉化有几种方法呢? 各位大虾,求助,在线急等! 看看我能放多少分.... 急啊,我刚买的电脑就出问题了~~~~ 中组部:干部离退休3年内不得到原管辖杭州一大妈在城市空地种2000余株罂中国网络媒体论坛宣言“让网络清朗”中航工业否认为2.7万名员工配备iP世界关注中国“关键性会议” 将为长远内罗毕火车与公交车相撞死伤数十人韩国议员呼吁韩朝积极合作解决开城问题印度长途巴士失火事故造成至少40人死刘延东会见美国英特尔公司首席执行官十八届三中全会将于11月9日至12日全国人大常委会五年立法规划公布 立法国际观察:监听丑闻凸显美国网络信息“美国国家情报总监暗示奥巴马绝对知道监美国情报总监称白宫早知晓监听 政府内李源潮会见欧洲客人李源潮会见欧洲客人全面深化改革 再创体制机制新优势“染缸”绍兴重手遏制纺织行业三大污染日本拟将钓鱼岛海域列入重点防御“灰色“刀锋战士”将面临检方提出的两项新指南非副总统希望更多中国企业参与非洲交深港通为香港发展再添动力杰夫·贝佐斯:选择比天赋更重要(互联台湾再现本地籍寨卡感染案例新疆克州军警民联合边境巡逻携程与全球租车巨头达成合作千年广州古港 筑梦国际航运小山村里建起德式洋房坚持文化惠民 助力“一带一路”北大荒,没想到你这样充满魅力中国警察 异国他乡保平安长篇散文《来去无尘》表现吴波感人故事15万种图书亮相上海书展资讯速递网络时代,服务业转型的迷思(网上中国责编:杨 鸥邮箱:hwbwyb@si李克强会见尼泊尔客人香港师生 走进海南“糖业大王”黄仲涵(历史掌故)中华优秀传统文化 让我们自信“创客”助力旅游发展中企承建铁路受非洲使节称赞
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘