标题: 批处理中的for语句小结 [打印本页]
作者: keen 时间: 2009-6-4 22:54 标题: 批处理中的for语句小结
个人自己总结, 参考了英雄的部分资料,很粗糙,有什么不足,大家补正!复制代码
[ 本帖最后由 keen 于 2009-7-10 19:45 编辑 ]
作者: flyzr 时间: 2009-6-4 23:00
很清晰!~
謝謝!
-
- ...
- delims=xxx 以 xxx 为分隔符,默认以空格为分隔符
- ...
复制代码
貌似xxx不能為字符串,對不對???
[ 本帖最后由 flyzr 于 2009-6-4 23:08 编辑 ]
作者: 随风 时间: 2009-6-4 23:03
很认真的笔记啊,加分!
delims=xxx 需注意是以每个 x 为分隔符,而不是 xxx 字符串
[ 本帖最后由 随风 于 2009-6-4 23:04 编辑 ]
作者: keen 时间: 2009-6-4 23:14 标题: 回复 3楼 的帖子
谢谢版主指正,已修正在顶楼!
作者: tireless 时间: 2009-6-4 23:24
例7:
@echo off
for /r %%i in (hero.txt) do (
if exist %%i echo %%i
)
pause
这样我们就可以找到真正存在的hero.txt文件了。
建议这样:- @echo off
- for /r %%i in (hero.txt?) do (
- if /i "%%~nxi"=="hero.txt" echo %%i
- )
- pause
复制代码
[ 本帖最后由 tireless 于 2009-6-4 23:26 编辑 ]
作者: zqz0012005 时间: 2009-6-4 23:30
不错的总结。
对某几点做一些补充:
1、空格、逗号、等号、分号,这些分隔符并不是for专用的,大多数命令都支持。在DOS时代,空格、等号、分号这3个是默认的分隔符,它们的作用是等价的。CMD下也几乎所以命令都可以用这3个作分隔符。当然不同的命令支持的分隔符也有不同。比如echo还可以用“./\[]”等等。
2、for、for /r 其实并不枚举文件,它们的循环对象就是字符串,除了一个例外:循环集含有通配符*、?。
for %%a in (*) do echo %%a
这个时候你没办法将*、?当作普通字符,加^转义也不行。
for /r 的循环方式是对每个目录执行一次,在循环集里的字符串前面加上目录名。
类似于for /l 的循环方式是对每个数执行一次。
3、for /d 要想循环对象为目录,必须使用通配符,否则与不要选项的单独for作用一样。
作者: keen 时间: 2009-6-4 23:36
回复5 、6楼
谢谢补正!
作者: keen 时间: 2009-7-10 19:30
TO ALL:
首先,向所有人道个歉。道歉的原因是顶楼的一段话语有误,有误之处看下面:- 5、for /d
- 基本格式:FOR /d %%variable in (set) do something
- 如果集(set)中包含通配符,则识别为目录名,否则将被识别为字符串。
- 作用是--遍历当前目录下(set)中所指定的目录。
- 例1:
- @echo off
- for /d c:\ %%i in (hero) do echo %%i
- pause
- 本例中由于集(hero)中不含有通配符,故“hero”仅仅被识别为字符串。
-
- 例2:
- @echo off
- for /d c:\ %%i in (*hero) do echo %%i
- pause
- 本例中由于集(*hero)中含有通配符*,故“*hero”被识别为文件名,结果
- 遍历了当前目录下所有与*hero匹配的目录。
复制代码
当时写这个总结的时候,其它的知识都是自己有所接触,而偏偏这个for /d参数很少用到,为了for语句的完整,当初就把 英雄 的教程中这段直接应用,而没有自己斟酌。
今天在 非常批处理论坛 无意间翻到 英雄 对自己的教程中两处严重错误的更正说明,才是我惊吓一身冷汗,赶紧回来补充这个说明。具体可以参考http://bbs.verybat.org/viewthread.php?tid=14867&highlight=for 八楼 英雄的说明。
正确的for /d参数应该不加路径,正确的应该是这样的:- 5、for /d
- 基本格式:FOR /d %%variable in (set) do something
- 如果集(set)中包含通配符,则识别为目录名,否则将被识别为字符串。
- 作用是--遍历当前目录下(set)中所指定的目录。
- 例1:
- @echo off
- for /d %%i in (hero) do echo %%i
- pause
- 本例中由于集(hero)中不含有通配符,故“hero”仅仅被识别为字符串。
-
- 例2:
- @echo off
- for /d %%i in (*hero) do echo %%i
- pause
- 本例中由于集(*hero)中含有通配符*,故“*hero”被识别为文件名,结果
- 遍历了当前目录下所有与*hero匹配的目录。
复制代码
主要错误就是其中的例子,加上了路径。
作者: keen 时间: 2009-7-10 19:38
这个错误发现,是我对for /d参数也产生了疑问,它的用处到底是什么?
for /d参数的使用不能加路径,那么要使用它,就必须把批处理放到相应的路径中,这样就会很麻烦。
请高手赐教!
作者: sy78wpl 时间: 2010-12-23 15:08
3、for /f
for /f ["option"] %%i in (filename) do command
for /f ["option"] %%i in ("string") do command
for /f ["option"] %%i in ('command') do command
option: eol=c 忽略以c开头的行,默认忽略 ;开头的行
skip=n 忽略前n行
delims=xxx 以 每个 x 为分隔符,默认以空格为分隔符
tokens=x,y,m-n 提取分隔后的第几部分,和delims联合用,默认提取第一部分
usebackq 一种特殊用法(见后面)
我想问的是“ eol=c”,只能忽略一个字母吗?
比如我想忽略f、i开头的,可以实现吗?
或者我想忽略以“fi”开头的呢?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |