http://bbs.wglm.net/read.php?tid=74438
批处理for语句学习笔记
本帖被 thinking 设置为精华(2008-01-17)
虽然看好好多次的for的帮助文件,但是对于for的向个参数一直不明白:tokens;delims;skip
今天为了帮贱圣解释一个94爱你转的<冰点保护下同步时间>的批处理就再次的认真研究了一下,
终于把for搞懂了一点点。下面是小弟的笔记了!
以下是看的网上的一个for的高级应用中的一个例子:假如有一个文件todel.txt内容如下:
Quote:
Volume in drive D is DATA
Volume Serial Number is C47C-9908
Directory of D:tmp
09/26/2001 12:50 PM 18,426 alg0925.txt
12/02/2001 04:29 AM 795 bsample.txt
04/11/2002 04:18 AM 2,043 invitation.txt
4 File(s) 25,651 bytes
0 Dir(s) 4,060,700,672 bytes free
现在我们想得到这个文件里面的所有的文本文件,也就是(alg0925.txt,bsample.txt,invitation.txt)
并在屏幕上面显示出来alg0925.txt,bsample.txt,invitation.txt那么我们就要用到FOR
Quote:
for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a echo %a
此时就会在屏幕上显示内容如下:
Quote:
alg0925.txt
bsample.txt
invitation.txt
那么这里的 skip=5 tokens=5是什么意思呢? 原文是这样写的
Quote:
skip=5表示跳过前5行(就是DIR输出的头部信息),tokens=5表示将每行的第5列作为循环值放入%a,正
好是文件名。在这里我加了一个文件存在判断,是因为最后一行的"free"刚好也是第5列,目前还想不出
好的办法来滤掉最后两行,所以检查一下可保万无一失。
Quote:
这里的skip=5这个很好解释,从上往下数包括空行算1行,跳过了前5行,
tokens=5表示跳过4列,也就是前面的4列:09/26/2001 ;12:50;PM;18,426把第5列的值alg0925.txt
作为循环值放入了%a 下面的两行 bsample.txt , invitation.txt 也是一样。
还有所说的free那一行有说明大家懂了。
再看一个例子:
Quote:
我们知道 date /t (/t表示不要询问用户输入)的输出是象这样的:
Sat 07/13/2002
现在我想分离出日期部分,也就是13:
for /f "tokens=3 delims=/ " %a in ('date /t') do @echo %a
实际上把 tokens后面换成1,2,3或4,你将分别得到Sat, 07, 13和2002。注意delims=/后面还有个空格,
表示/和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项。
再灵活一点,象本文开头提到的,将日期用2002-07-13的格式输出:
for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b
当tokens后跟多个值时,将分别映射到%a, %b, %c等。实际上跟你指定的变量有关,如果你指定的是 %i,
它们就会用%i, %j, %k等。
灵活应用这一点,几乎没有做不了的事。
这个我在本机上做的时候得到的数据不是和这个一样,所以我以本机的数据为准,上面的也是对的,
可能是我的时间设置和他所说的不一样,我用date /t得到的值不是他那样的,所以我以我的为准
我在本机执行 date /t 得到如下的值:
Quote:
C:\>date /t
2008-01-15 星期二
我现在想取星期的值也就是星期二,应该怎么做呢?看我跟据上面的写的
Quote:
for /f "tokens=2" %a in ('date /t') do @echo %a
这样就可以得到星期二了,也就是用第2列的值作为循环的值给变量%a
Quote:
下面我们再加一个参数delims我们先看一下微软的说明
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单
引号字符为文字字符串命令并允许在 filenameset
中使用双引号扩起文件名称。
delims是指定分分隔符,那么我可以把我上面的一个本机的例子更改为
Quote:
for /f "tokens=? delims=- " %a in ('date /t") do @echo %a
大家注意这里的?是我现在还不知道应该写多少
这里我用的是-和一个空格作为分隔符,那么我上面的数据被分为了如下的样式
2008 01 15 星期二
那么我们想取星期二的话?的值应该填多少呢?这个大家都清楚了,应该是4
那么上面就可以写成如下了:
Quote:
for /f "tokens=4 delims=- " %a in ('date /t') do @echo %a
也可以得到 星期二了
到这里我想大家应该明白了这几个参数的意思了吧?呵呵。记录下来!
以后有新的发现再添加。现在去看linux教程了哦!