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. PHP网址

    15个魔术方法的总结: http://blog.csdn.net/bossdarcy/article/details/6210794 PHP代码重构:http://blog.csdn.net/tony ...

  2. Codeforces Round #308 (Div. 2) D. Vanya and Triangles 水题

    D. Vanya and Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55 ...

  3. Redis for Windows(C#缓存)安装和使用

    Redis for Windows(C#缓存)安装和使用 前言 前段时间写过两篇简单的有关Memcached缓存的相关文章,当然了只是入门的如何使用而已.最近这两天又发现了Redis这个神奇的东西,之 ...

  4. 剑指 offer set 6 打印从 1 到 N 的所有数

    总结 1. 求全排列的变形题, 有些隐晦, 没看出来

  5. ext3文件系统基础

    http://blog.csdn.net/haiross/article/category/1488205/2   block size: 是文件系统最小的单位,Ext2/Ext3/Ext4 的区块大 ...

  6. 异常处理之namespace找不到

    最近在做控件的时候遇到了这么一个异常 就是说类库中明明就有命名空间,但是在winForm中引用的时候也能正常显示, 可是编译的时候却报 找不到指定的命名空间 这样的异常,头痛了好久,结果看到了winF ...

  7. 基于HTML5实现的中国象棋游戏

    棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...

  8. 基于CSS3图片可倾斜摆放的动画相册

    今天我们又要来分享一个CSS3动画相册.之前我们分享过一个很酷的放满女神的HTML5/CSS3相册,相册是全屏展示的.今天这款相册的特点是图片可以任意角度的倾斜摆放,就像随意放在桌面上一样.另外,当鼠 ...

  9. Windows OpenVPN Client and tls-auth

    The official Windows OpenVPN client does not seem to work properly with the tls-auth option if a key ...

  10. TinyThread源码分析之中断

    转载请注明来源:cuixiaolei的技术博客 https://github.com/xhawk18/TinyThread TinyThread 是基于Cortex-M0的小型的OS. 知识储备: I ...