注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红尘若梦

生活的色彩

 
 
 

日志

 
 

DOS下FOR的用法简例  

2016-01-20 11:16:39|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
FOR命令针对一组文件,字符串或命令结果行,执行批量操作。有了FOR这个命令,可以说,以前无法象UNIX一样可以用命令行完成非常复杂的操作,现在虽然还无法做到象UNIX那么灵活,但已可完成绝大多数的任务。
格式:FOR %variable IN (set) DO command [command-parameters]  
作用:对一个或一组文件,字符串或命令结果中的每一个对象【set】执行特定命令【DO】。  
注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.  
关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f 
/r 参数遍历整个目录树
/f 参数将文本文件内容作为循环范围
/d 仅显示当前目录下的目录名字【不涉及更下一层】
/l 迭代数值范围,使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)
当然更详细的说明大家可以直接使用for /?命令行来察看,下面来说说一些简单运用的例子:
之前的文章《利用Lame去掉MP3中多余信息》就已经提到了一个简单的例子:

for %i in (*.mp3) do lame %i -b 128 -m j -q 2 -h

当然这个例子也是非常简单,下面来说一些更具体的例子:
a)列出目录及子目录下面的所有mp3文件:

for /r f:\593668.com %i in (*.mp3) do echo %i

b)读取文本文件每行并显示出来:

for /f %i in (f:\593668.com\mp3.txt) do echo %i

c)读取当前目录下的子目录显示出来

for /d %i in (*) do echo %i

d)按规律生成数值并显示出来【这里的1代表初始值,2代表步进值(可为负),5代表结果值】

for /l %i in(1,2,5) do echo %i

e)检测当前有那些分区【将以下代码保存在BAT中再执行】:

@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:

f)  利用/f,delims=来切分文本文本每行字符串:
delims=可以简单的使用如"delims=,"来代表用,分切分txt的每一行。如一个文件格式行如:

593668.com,237h.com,9zfx.com
www.593668.com,www.237h.com,www.9zfx.com
chinaavl.com

那么使用如下命令:

for /f "delims=," %i in (f:\593668.com.txt) do echo %i

会发现结果为:
DOS下FOR的用法简例 - 1976xyg - 红尘若梦
明白了吧,它就是提取规则,而且还可以使用多个分隔符。如"delims=.,"就是利用.或,号来分隔【类似于java中的String.split方法】。不过,这里就会产生一个问题,只提取了每行第一个结果【如果行不包含这两个字符就会全显示,否则的话只会显示这个分隔符之前的那段字符】。
g)结合定点提取:tokens= 来提取。如提取 每行第二个结果 ,就指定下,组合成"delims=, tokens=2"

for /f "delims=, tokens=2" %i in (f:\593668.com.txt) do echo %i

这次的结果就是:
DOS下FOR的用法简例 - 1976xyg - 红尘若梦
h)如果不只提取第二个结果,所有的按照这个规律分解的结果都需要显示的话,还必须调整参数:

for /f "delims=, tokens=1,2,3" %i in (f:\593668.com.txt) do echo %i %j %k

结果如下:
DOS下FOR的用法简例 - 1976xyg - 红尘若梦
这里要说明的就是tokens=1,2,3 也可以换成 tokens=1-3,此外,这里提取的元素,是按照%i之后的字母顺序来生成变量【i之后是j,k,所以相应的变量名就这样指定下】。 
 i)更高一级的需求就是,1做为一个元素,之后的237h.com跟9zfx.com做为一个元素来分解。

for /f "delims=, tokens=1,*" %i in (f:\593668.com.txt) do echo %i %j

结果如下:
DOS下FOR的用法简例 - 1976xyg - 红尘若梦
j)如果还需要跳过某些行数,请加skip=n,这里的n是指要跳过的行数:

for /f "delims=, tokens=1,* skip=1" %i in (f:\593668.com.txt) do echo %i %j

结果就变成了:
DOS下FOR的用法简例 - 1976xyg - 红尘若梦
可以看出确实跳过了第一行。
k)如果还需要忽略以指定字符打头的行:请加入eol=c【这里的c代表要忽略以指定字符开头的行,只能是一个字符】

for /f "delims=, tokens=1,* eol=w" %i in (f:\593668.com.txt) do echo %i %j

结果如下:
DOS下FOR的用法简例 - 1976xyg - 红尘若梦
以w打头的行确实忽略掉了。
l)in  () 括号里是否需要用符号,以及使用什么样的符号,取决于要处理的对象属于什么类型:如果是文件,则无需;如果是命令语句,则用';如果是字符串,则使用""。

for /f %i in (文件名) do (??)
for /f %i in ('命令语句') do (??)
for /f %i in ("字符串") do (??)

m)如果以上有特殊字符的话,就必须使用usebackq参数,这时以上规则就有变化了。
如果第一个括号里的对象是一条命令语句的话,原来的单引号'要改为后引号`;如果第一个括号里的对象是字符串的话,原来的双引号"要改为单引号';如果第一个括号里的对象是文件名的话,要用双引号"括起来。 
相关的例子【使用如下命令察看环境变量】:

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

相应的格式就变成了:

for /f "usebackq" %i in ("文件名") do (??)
for /f "usebackq" %i in (`命令语句`) do (??)
for /f "usebackq" %i in ('字符串') do (??)

好了,以上就是for的简易用法,至于更深入的使用还需要大家去挖掘。
  评论这张
 
阅读(54)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017