Board logo

标题: [原创] 批处理不带参数的FOR的妙用 [打印本页]

作者: cjiabing    时间: 2011-4-21 14:43     标题: 批处理不带参数的FOR的妙用

吃饭前准备做这项工作,先列个提纲,待会回来继续。

说起FOR,人们比较关注的是带参数的FOR,比如“FOR /F”,而常常忽略不带参数的FOR,甚至怀疑它存在的价值。其实,不带参数的FOR在批处理当中是十分有用的,特别是在与“FOR /F”的组合中,它处理文件名具有相当的优势。
下面举例:
第一、如何去掉路径中的双引号。
如何去掉双引号?看看我们常见的方法:
  1. for /f "delims="""  %%a in ("C:\Program Files") do  echo ;%%~a
复制代码
但在使用delims处理双引号时,我们就碰壁了。幸好有%%~a帮忙。
假如是这种呢:
"C:\Documents and Settings" "All Users" "Application Data"
同一行有多个双引号,注意,不是一个完整的路径。
此时,用不带参数的FOR是最明智的:
  1. for  %%a in ("C:\Documents and Settings" "All Users" "Application Data") do  echo ;%%~a
复制代码
有双层保障,首先是不带参数的FOR自身能够脱掉双引号,其次,%%~a再次确认去掉双引号。
假如还不能完全去掉双引号,那么好,在前面再套一个 for /f  和 %%~i。
  1. for /f "tokens=*" %%a in  ("C:\Documents and Settings" "All Users" "Application Data")  do for %%i  in (%%a) do echo;%%~i
复制代码
注意,后面的FOR的集合里面是%%a而不是%%~a。为什么?因为后者会预先脱掉引号,使得一些路径被拆散,假如路径含有空格,则可能无法保证路径完整。那第一个 FOR /F 在里面扮演了什么角色?回头再说……
假如是文件的话,使用if exist "%%~i" echo;"%%~i"  会比单纯echo;%%~i效果好。这样一来就有四重保险了。
FOR /F用于处理字符串,有些字符串它是无法处理的,在使用时有所顾忌。而不带参数的FOR在处理双引号方面具有“先天优势”。
第二、如何简单迭代循环?
我们有几个命令,要用它们去尝试执行同样一个任务,或者说进行检测。比如,我们常见的多驱动器搜索文件:
  1. for %%a in (c:  d:   e:  f:) do if exist %%a dir /b %%a
复制代码
首先列出几个可能的盘符,然后用if exist 逐个判断盘符是否存在,如果存在执行搜索dir命令。
这样,不带参数的FOR就成了一个专门用来分派任务,进行检测的最佳工具。
可以说,不带参数的FOR,简单地再现了FOR命令的基本特性。
第三、如何——突然忘记是什么了,


最后,题外话,想谈谈,FOR或循环中如何中止任务。
作者: raymai97    时间: 2011-8-29 15:03

就这样?没有更新了?关于for终止任务,可以用exit /b(goto :eof)来解决吧~ 用call来启用for~




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2