for是为了循环执行一系列命令而执行的命令语句。
for要处理的内容不同,语法结构稍有不同。下面就各种情形来分别
1、基本的语法:FOR %変数 IN (set) DO 命令 [参数]
语法内容解析:
a.%変数 用于循环迭代需要循环变量中的值
b.(set) 指定要循环的集合(可是使用通配符) --可以指定文件或者直接指定要循环的集合
c.命令 每次循环中执行的命令
d.参数 每个命令执行时传递的参数
这种语法形式下,只能指定指定要循环的集合,指定的集合可以使用空格,逗号,或者制表键来分割集合间的每个值
例如下面程序
@echo off set set=a b,c d for %%i in (%set%) DO echo %%i
执行结果:
F:\tmp>a.bat
a
b
c
d
可见set的内容被分割为4个,然后通过循环把set集合的值打印出来了。
如果循环的变量中有这个几个分割符的时候,就请使用双引号将其引起来。然后解析的时候再将双引号去除。
如下面代码的改进
@echo off set set="a a" "b,b" "c c" for %%i in (%set%) DO echo %%~i
执行结果为
F:\tmp>a.bat
a a
b,b
c c
这个种类的语法就介绍到这里,下面暂时一个简单的应用,那就是对出入的参数进行循环并且显示到屏幕上。
@echo off for %%i in (%*) DO echo %%~i
执行结果
F:\tmp>a.bat 1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9
*注:所有的单个命令都可以使用小括号将多个命令括起来替换,或者使用&&连接多个命令。
2、目录循环命令:FOR /D %変数 IN (set) DO 命令 [参数]
a、当set中不含通配符的时候,就是将set中的每一个字加上一个驱动名和路径名,如果没指定全路径的的话,就是当前路径加上循环变量的值。
@echo off for /d %%i in (F:\tmp\abc.txt) DO echo %%~dpnxi for /d %%i in (abc.txt) DO echo %%~dpnxi echo %CD%\abc.txt
运行结果为:
F:\tmp>a.bat
F:\tmp\abc.txt
F:\tmp\abc.txt
F:\tmp\abc.txt
b、当set指定时含有通配符的时候,只搜索文件夹,不搜索文件,只搜索指定目录,不搜索子目录。
通配符有两个,一个是?,去匹配任意单个字符,另一个是*,去匹配任意多个字符。
@echo off for /d %%i in (F:\tmp\a?) DO echo %%i echo -------------------------------- for /d %%i in (F:\tmp\a*) DO echo %%i
执行的时候,F:\tmp下的目录结果如下
F:\tmp |aa
|a1
|a2
|aaa
|bb
|b1
|b2
|abc.txt
|abd.txt
|adc.txt
上述代码执行结果为
F:\tmp>a.bat
F:\tmp\aa
--------------------------------
F:\tmp\aa
F:\tmp\aaa
还有一点需要声明的是,只有在目录的最后一层含有通配符,如果前面路径中含有通配符,那么,循环将匹配不到路径。
3、FOR /R [驱动:]路径] %変数 IN (set) DO 命令 [参数]
从指定路径([驱动:]路径])开始, 对目录下的路径逐个执行for处理,如果路径没有指定的话,处理的对象路径就是当前工作的路径。
如果set仅指定为(.)的时候,就对指定路径进行列举(这个时候,每一个路径的结果上都在最后加了一个\.)
a.当set没有指定通配符的情况下
**当set指定的时候,不包含通配符,运行结果就是将目录下所有的路径加上set指定的内容列举出来)
@echo off for /r F:\temp %%i in (.) DO echo %%i
运行结果为:
F:\tmp>a.bat
F:\temp\.
F:\temp\temp\.
F:\temp\temp\20130605\.
F:\temp\temp\tsxbn400\.
F:\temp\temp\tsxbn400\tsxbn400\.
set指定的时候不包含通配符的情况下,查看执行效果
@echo off for /r F:\temp %%i in (abc.123) DO echo %%i
执行效果:
F:\tmp>a.bat
F:\temp\abc.123
F:\temp\temp\abc.123
F:\temp\temp\20130605\abc.123
F:\temp\temp\tsxbn400\abc.123
F:\temp\temp\tsxbn400\tsxbn400\abc.123
b.当set指定通配符的情况下
查找指定目录下符合通配符的文件(包括子目录)
@echo off for /r F:\temp %%i in (*.html) DO echo %%i
运行结果为
F:\tmp>a.bat
F:\temp\temp\test.html
如果set指定为*或者*.*的情况下,将列出目录(包括子目录)下的所有文件,有扩展名,没有扩展名的文件都会被检索出来
@echo off for /r F:\temp %%i in (*.*) DO echo %%i
执行结果为
F:\tmp>a.bat
F:\temp\FileTool.dll
F:\temp\VC6CN.rar
F:\temp\VC6EN.rar
F:\temp\vc6_setup.zip
F:\temp\Win7ーVisual_C++_6.0.doc
F:\temp\temp\20130605.zip
F:\temp\temp\test
F:\temp\temp\test.html
F:\temp\temp\tsxbn400.zip
F:\temp\temp\20130605\新しいテキスト ドキュメント.txt
F:\temp\temp\tsxbn400\tsxbn400\aaaa.txt
当要查找指定扩展名的文件的时候,set就要指定为(*.扩展名)
@echo off for /r F:\temp %%i in (*.txt) DO echo %%i
执行结果为:
F:\tmp>a.bat
F:\temp\temp\20130605\新しいテキスト ドキュメント.txt
F:\temp\temp\tsxbn400\tsxbn400\aaaa.txt
4、FOR /L %変数 IN (开始位置,步长,结束位置) DO 命令 [参数]
如果知道要执行的次数,那么就可以使用使用这个for循环命令
@echo off for /L %%i in (1,1,5) DO echo %%i
执行结果是
F:\tmp>a.bat
1
2
3
4
5
从执行的结果可以看出,这个循环包括开始位置和解说位置
语法执行的结果类似于Java中的
for (int i = start; i <= end; i = i + step) { system.out.println(i); }
运行结果是一模一样的东西。
5、FOR /F ["option"] %変数 IN (文件集合) DO 命令 [参数]
FOR /F ["option"] %変数 IN ('字符串') DO 命令 [参数]
FOR /F ["option"] %変数 IN (`命令行`) DO 命令 [参数]
一行一行读取指定的文件,并将读取的结果放到变数中。如果文件指定的是多个文件的话,那么就对每一个文件分别读取
假设文件test.txt的内容为
a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 c1 c2 c3 c4 c5 d1 d2 d3 d4 d5
假设文件test2.txt的内容为
x1 x2 x3 x4 x5 y1 y2 y3 y4 y5 z1 z2 z3 z4 z5
执行下列代码:
@echo off for /F %%i in (F:\temp\test.txt F:\temp\test2.txt) DO echo %%i
结果为:
F:\tmp>a.bat
a1
b1
c1
d1
x1
y1
z1
结果是,只读取了文件中每列中空格前的内容。
如何才可以读取文件中其他部分的内容呢?等接下来分析过option属性的时候我们就知道了。
eol=c - 指定一个字符,如果读取文件的时候,头一个非空字符是指定的字符,该行就认为是注释,并忽略该行
skip=n - 读取的文件的时候,忽略指定行数
delims=xxx - 读取一行的时候的分割文字,如指定了【,】那么,这一行会用【,】将这一行的内容分割为几个子字符
usebackq -接下来set中的内容使用新的形式来处理,有以下三个情况
a.反引号引起来的内容当作是命令来执行,并把执行的命令的结果当作当作循环的内容
b.单引号引起来的内容当作是一个字符串
c.双引号引起来的内容当作文件路径
接下来看一个几个示例
@echo off for /F "tokens=* usebackq" %%i in (`dir`) DO ( echo %%i )
执行结果为:
F:\tmp>a.bat
ドライブ F のボリューム ラベルは 新加卷 です
ボリューム シリアル*は 54DB-6BED です
F:\tmp のディレクトリ
2013/08/01 木 15:06 <DIR> .
2013/08/01 木 15:06 <DIR> ..
2013/08/02 金 14:36 73 a.bat
2013/08/01 木 17:45 <DIR> aa
2013/08/01 木 15:06 <DIR> aaa
2013/08/01 木 14:37 0 abc.txt
2013/08/01 木 14:37 0 abd.txt
2013/08/01 木 14:37 0 adb.txt
2013/08/01 木 14:44 <DIR> bb
4 個のファイル 73 バイト
5 個のディレクトリ 11,384,000,512 バイトの空き領域
我们使用的Windows系统的用户,可以使用bat的for循环可以做很多事情的。
下面说一个for循环很经典的使用例:
FOR /r ”%cd%” %%f IN (.svn) DORD /s /q "%%f"
这个处理可以删除当前目录下的所有.svn文件