[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创] 批处理 for 命令的工作流程

for 命令的工作流程
::code 随风 @bbs.bathome.net  2008-10-15
批处理中 for 命令应该是最复杂、最强大、最难理解的一个命令了。
新手们一般主要是不知道for是如何工作的,所以无法正确、合理的利用for命令。
现就本人的理解来讲讲for的工作流程,以方便新手们快速理解for
一般格式:
for /f "skip=2 tokens=1-3 delims=.\" %%a in ('dir/b/s f:\111') do echo %%a %%b %%c
上句中 "skip=2 tokens=1-3 delims=.\" 为可选项,根据需要选用
解析:
for 首先获取需处理的数据
所以 for /f 最先运行 ('dir/b/s f:\111') 这一句,
我们看到在一对单引号中是一句dos命令 dir/b/s f:\111
也就是说此例中 for 要处理的数据是执行 dir/b/s f:\111 后的结果。
我们知道单独执行dir/b/s f:\111 命令后会得到一大串结果,
如下:
  1. F:\111\c.txt
  2. F:\111\123.bat
  3. F:\111\1.txt
  4. F:\111\d.txt
  5. F:\111\tmp.bat
  6. F:\111\Desktop.ini
  7. F:\111\tmp.vbs
  8. F:\111\重定向 中的秘密.txt
  9. F:\111\b.txt
  10. F:\111\Thumbs.db
  11. F:\111\t\Thumbs.db
  12. F:\111\t\007-1.jpg
  13. F:\111\t\007-2.jpg
  14. F:\111\t\007-3.jpg
  15. F:\111\t\暴风截屏20080724005340.bmp
  16. F:\111\t\暴风截屏20080724005343.bmp
  17. F:\111\t\暴风截屏20080724005421.bmp
  18. F:\111\t\暴风截屏20080724005424.bmp
  19. F:\111\t\Desktop.ini
  20. F:\111\t\EPSnap1.jpg
  21. F:\111\t\EPSnap2.jpg
  22. F:\111\t\中国地图.gif
  23. F:\111\t\hhh.gif
  24. F:\111\t\sdfsg.gif
  25. F:\111\t\ball.gif
复制代码
而for 就是把这些结果的每一行当作一个数据(字符串),
对每一个数据进行同样的处理。(顺序是从上至下)
下一步就是处理这些数据了。
如何处理呢?
"skip=2 tokens=1-3 delims=.\"
skip=2  意思是抛弃前2个数据,从第3个数据开始处理。(只能从上至下依次抛弃)
也就是说不处理执行 dir/b/s f:\111 的结果的头2行。
即:本例中不处理 F:\111\c.txt 和 F:\111\123.bat 这两行。
当然若不需要抛弃时则不需要 skip=2 选项
如何处理?
delims=.\  意思是将每行数据都以.和\切分为若干段。
本例中,抛弃了头2行,从第3行开始处理,即;第一个处理 F:\111\1.txt 字符串
将 F:\111\1.txt 以.和\切分为若干段后成为: F: 111 1 txt
我们看到原字符串 F:\111\1.txt 被从.和\处切开了,被切割为 4 段,并且.和\都没有了

tokens=1-3 将第1段至第3段交给 do 后面的命令来处理。本例中 do 后面的命令为 echo 命令。
echo %%a %%b %%c   其中 %%a 代表第1段。%%b 代表第2 段。。。
(按英文字母次序,依次类推。。。。。)

那么 echo %%b %%c 就是显示 第2段和第3段。。
echo %%c %%a  就是显示第3段和第1段。。。
总之,知道了 %%a %%b  %%c 分别代表什么以后,再如何处理它们就好办了。
这里为什么 %%a   是代表第1段呢?
因为  for /f "skip=2 tokens=1-3 delims=.\" %%a in ('dir/b/s d:') do 。。。。。。
这里定义的是 %%a 如果改为 %%i(可自定义,1-9,a-z,A-Z)那么第1段就是%%i来表示,第2段就是%%j。。。
处理完成后(这里的处理完成指的是:do 后面的所有命令都运行完成后。do 后面可以写多条命令,用一对()括起来。)再对下一条数据进行同样的处理(本例中,就是处理F:\111\d.txt),直到所有数据处理完成,则for命令运行结束。
这就是常说的 for 循环。(因为需处理的数据有多少行,do 后面的命令就要循环运行多少次)
如果 () 内不是一对单引号,而是一对""引号,则表示这一对引号中的内容就是需处理是字符串。
如果 () 内是一个文件名,则表示此文件的内容就是需处理是字符串。
如:
for /f "skip=2 tokens=1-3 delims=.\" %%a in ("f:\123\abc\bat.txt") do .....
for /f "skip=2 tokens=1-3 delims=.\" %%a in (f:\123\abc\bat.txt) do .....
具体()中的内容就不在这里多说了。。

总结for的工作流程是
1、先从 () 内获取需处理的数据
2、通过 "skip=2 delims=.\" 等选项对数据进行处理
3、通过 tokens= 选项、提取需要的内容。交给 do 后面的命令来处理。
4、完成后再对下一条数据进行同样的处理、直到所有数据处理完毕,则for运行结束。
1

评分人数

    • batman: 功力深厚,讲解透彻PB + 15
技术问题请到论坛发帖求助!

楼主正解,谢谢

TOP

返回列表