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文件

DOS批处理命令-for语句的更多相关文章

  1. DOS批处理命令-if语句

    IF语句是批处理中执行的条件分歧处理. 批处理中,IF分歧的写法有好几种,接下来,我们来一个一个的分析IF语法的结构. 1.IF [NOT] ERRORLEVEL 番号 批处理命令 当ERRORLEV ...

  2. DOS批处理命令判断操作系统版本、执行各版本对应语句

    DOS批处理命令判断操作系统版本.执行各版本对应语句   昨天在家里试用  netsh interface ip set address 这些命令更改上网IP.DNS.网关等,今天将那些代码拿来办公室 ...

  3. DOS批处理命令递归删除给定的文件(夹),兼VC工程清理小工具

    使用dos批处理命令递归删除指定的文件(夹): (下面内容针对清理VC工程!自己按说明任意修改) 2014-06-10修改:删除前增加了[y,n]询问: echo off rem 递归删除当前文件下指 ...

  4. DOS批处理命令-@命令

    @命令是一个禁止当前语句回显的简单命令. 语法: @[command].[command]是要屏蔽的批处理命令 例如执行包含以下内容的bat文件 echo on @echo ------- @echo ...

  5. DOS批处理命令-几个固定名称的变量

    批处理中有一些变量的变量名称是固定的,具有特定的意义,接下来,我们来看看这些有特定意义的变量到底有什么意义. 1.%CD%   当前路径的路径名[盘符 + 路径]    - 現在のディレクトリ文字列に ...

  6. cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip

    在cocos2d-x使用中,须要不停的转换文件和压缩或解压文件.假设全人工来做,太麻烦了,且easy出错. 我如今把一些用的到批处理贴出来,供大家使用 自己主动把dat文件按数字排序重命名gz.DOS ...

  7. DOS批处理命令-call命令

    call命令 在批处理中调用别的批处理或者可运行程序或者 バッチ プログラムを別のバッチ プログラムから呼び出します. 语法 1.CALL [驱动盘符:][路径]文件名 [参数] 调用并执行[驱动盘符 ...

  8. DOS批处理命令-注释

    注释是每个程序中不可或缺的(不是对计算机来说,而是对我们这些程序员阅读代码来说) 语法: ①rem 这是批处理的注释命令,rem后面的内容全部是注释 例:rem 这是一行注释 ②:: 批处理遇到以冒号 ...

  9. DOS批处理命令-pause

    “pause”用于暂停批处理的执行器并给出提示信息,然后由用户决定是继续执行还是终端执行. 语法: pause 简单一个pause,不附带任何参数. 执行pause以后会提示一句话[按任意键继续执行] ...

随机推荐

  1. CSS的魔法和魅力

    其实我最开始学会的语言是HTML,我记得那还是大一的事情.当时我对床的兄弟DR放了一本HTML的书在床上,我因为没事就拿来看看.那本书大概只有50页左右,可是可以说如果没有这本书,今天Maybe我不会 ...

  2. Codeforces Round #146 (Div. 1) B. Let's Play Osu! dp

    B. Let's Play Osu! 题目连接: http://www.codeforces.com/contest/235/problem/B Description You're playing ...

  3. SGU 532. Building Foundation 暴力

    532. Building Foundation 题目连接: http://acm.sgu.ru/problem.php?contest=0&problem=532 Description A ...

  4. Codeforces Educational Codeforces Round 3 A. USB Flash Drives 水题

    A. USB Flash Drives 题目连接: http://www.codeforces.com/contest/609/problem/A Description Sean is trying ...

  5. C# API: 生成和读取Excel文件

    我们想为用户提供一些数据,考虑再三, 大家认为对于用户(人,而非机器)的可读性, Excel文件要好一些. 因为相比csv,xml等文件, Excel中我们可以运用自动筛选, 窗口锁定, 还可以控制背 ...

  6. 字典树(Trie)的java实现

    一.定义 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用 ...

  7. Cassandra目录

    1. cassandra安装 2. 过滤文本文档中的数据并插入Cassandra数据库 3. 用Java实现向Cassandra数据库中插入和查询数据 4. Cassandra在CQL语言层面支持多种 ...

  8. 进程控制之exec函数

    用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行.因为调用exec并不创 ...

  9. curl模拟Http请求

    一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http://w ...

  10. cocos2dx3.0-执行cocos compile -p win32 命令出现错误 MSB8020 以及编译出来的exe 无法打开的问题

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 当博主准备把cocos工程用cocos命令行编译出来的时候,报出了MSB8020的错误,具体如下 ...