bat知识点3_for循环

来源:互联网 发布:kk棋牌源码 编辑:程序博客网 时间:2024/06/02 05:28


1.for的定义
在批处理文件中基本用法 :
for %%I in (command1) do command2 


(1)for、in 和do 是  for 语句的关键字,它们三个缺一不可。
(2)%%I 是for 语句中对形式变量的引用,就算它在do 后的语句中没有参与语句的执行,也是必须出现的。
 形式变量 I,可以换成 26 个字母中的任意一个,这些字母会区分大小写,也就是说,%%I 和%%i 会被认为
 不是同一个变量;形式变量 I还可以换成其他的字符,但是,为了不与批处理中的%0~%9 这10 个形式变量
 发生冲突,请不要随意把%%I 替换为%%0  ~%%9 中的任意一个。
(3)in 之后,do 之前的括号不能省略。 
(4)command1 表示字符串或变量,command2 表示字符串、变量或命令语句。 
(5)for 后 可以 加 /f /r /l /d 这四个 参数
/f  用于读取文件内容,以行为单位处理文本文件。
/r  检查以/r后面跟的 path 为根的目录树中,所有符合的文件或者文件夹。若没有指定目录,则使用当前目录。
/l  增量形式(即从1-254或254-1)
/d  用于搜索目录或文件夹,但不会搜索文件,也不搜索子目录。


2.切分字符串的利器:delims= 
test.txt----------------
123,456


test.bat----------------
@echo off 
for /f "delims=," %%i in (test.txt) do echo %%i 


运行结果:
123


由上,每行第一个逗号之后的所有内容都不见了(如果有不存在逗号的行,则保留原样)。
如果没有指定"delims=符号列表"这个开关,那么,for /f  语句默认以空格键或跳格键作为分隔符号。


test1.txt----------------
1.2345,6


test1.bat----------------
@echo off 
for /f "delims=.," %%i in (test1.txt) do echo %%i 


运行结果:
2345


由上,第一个点号或第一个逗号之前的内容都被提取出来了。 


test1.bat的执行过程是:
逐行读取 test1.txt 中的内容,以点号和逗号切分每一行的内容(不存在点号和逗号的行,
则不再切分,为了描述的方便,我们把被点号或逗号切分的一个一个的字符串片段,称之为节),
然后,for /f  会提取第一节的内容作为最终结果,显示在屏幕上。需要注意的是,在这里,所有行的
字符串被切分成了两个以上的节,但是,代码只会提取第一节字符串的内容,因为  for /f  语句默认
只提取第一节的符串。 


3.定点提取:tokens= 
tokens=  后面一般跟的是数字,如  tokens=2,也可以跟多个,但是每个数字之间用逗号分隔,
如  tokens=3,5,8,它们的含义分别是:提取第2 节字符串、提取第3、第5 和第8 节字符串。
注意,这里所说的“节”,是由  delims=  这一开关划分的,它的内容并不是一成不变的。 


(1)
test2.txt----------------
12,345,6


test2.bat----------------
@echo off 
for /f "delims=,tokens=3" %%i in (test2.txt) do echo %%i 


运行结果:
6


由上,要提取的内容在以逗号切分的第3节上,即为6。


(2)
如果  tokens=  后面指定了多个数字,如果形式变量为%%i,那么,第一个
数字指代的内容用第一个形式变量%%i 来接收,第二个数字指代的内容用第二
个形式变量%%j 来接收,第三个数字指代的内容用第三个形式变量%%k 来接
收??第N 个数字指代的内容用第N 个形式变量来接收,其中,形式变量遵循
字母的排序,第 N 个形式变量具体是什么符号,由第一个形式变量来决定:如
果第一个形式变量是%%i,那么,第二个形式变量就是%%j;如果第一个形式
变量用的是%%x,那么,第二个形式变量就是%%y。 


test3.txt----------------
12,345,6,78,9


test3.bat----------------
@echo off 
for /f "delims=,tokens=2,5" %%i in (test3.txt) do echo %%i %%j 


运行结果:
345 9


由上,要提取的内容在以逗号切分的第2和5节上,即为345 9。


如果要提取的内容是连续的多“节”的话,那么,连续的数字可以只写最小值和最大值,中间用短横连
接起来即可,比如 
tokens=1,2,3,4,5  可以简写为  tokens=1-5  。 
还可以把这个表达式写得更复杂一点:
tokens=1,2-5 ,tokens=1-3,4,5 


(3)
test4.txt----------------
12,345,6


test4.bat----------------
@echo off 
for /f "delims=,  tokens=1,*" %%i in (test4.txt) do echo %%i %%j 


运行结果:
12 345,6


由上,第一个逗号不见了,取代它的是一个空格符号,其余部分保持不变。 
其中奥妙就在这个星号上面。
tokens=后面所接的星号具备这样的功能:字符串从左往右被切分成紧跟在*之前的数值所表示的节数之后,
字符串的其余部分保持不变,整体被*所表示的一个变量接收。 


test4.txt的内容被切分,切分符号为逗号,当切分完第一节之后,切分动作不再继续下去,
因为  tokens=1,*  中,星号前面紧跟的是数字 1;第一节字符串被切分完之后,其余部分字符串
不做任何切分,整体作为第二节字符串,这样,test4.txt就被切分成了两节,分别被变量%%i 和
变量%%j 接收。 




4.跳过无关内容:skip=n 
for  /f  允许你跳过这些无用的行,直接从第N+1 行开始处理,这个时候,就需要使用参数  skip=n,
其中,n 是一个正整数,表示要跳过的行数。


@echo off 
for /f "skip=2" %%i in (test.txt) do echo %%i 


这段代码将跳过头两行内容,从第3 行起显示test.txt 中的信息。




5.忽略以指定字符打头的行:eol=
(1)忽略以分号打头的那些行
@echo off 
for /f "eol=;" %%i in (test.txt) do echo %%i 


只能指定1个指定字符。
for /f  语句是默认忽略以分号打头的行内容的,正如它默认以空格键或跳格键作为字符串的切分字符一样。 




6.for /f的变形语句
(1)读取文本文件中的内容
for /f %%i in (文件名) do (...) 
例如:
for /f %%i in (test.txt) do echo %%i


(2)读取命令语句执行结果中的内容
for /f %%i in ('命令语句') do (...) 
例如:
for /f %%i in ('dir /a-d /b *test*.txt') do echo %%i
  
(3)要处理的是一个字符串时
for /f %%i in ("字符串") do (...) 
例如:
for  /f  "delims=. tokens=1-3"  %%i  in  ("bbs.bathome.cn")  do  echo  %%i-%%j-%%k


7.usebackq  
是一个增强型参数,当使用了这个参数之后,原来的for语句中第一个括号内的写法要做如下变动:
如果第一个括号里的对象是一条命令语句的话,原来的单引号'要改为后引号`;
如果第一个括号里的对象是字符串的话,原来的双引号"要改为单引号';
如果第一个括号里的对象是文件名的话,要用双引号"括起来。
此字段主要用于解决文件路径中含有特殊字符的情况,比如文件名中含有空格或&。


@echo off 
for /f "usebackq" %%i in ("test 1.txt") do echo %%i 


注意:上面的文件名字中带有空格。


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



0 0
原创粉丝点击