你是世上最强的磁石,走近你的磁场,巳没有逃脱的可能,我巳完全被你俘虏,注定此生为你而沉醉。

2008年3月9日星期日

用实例学for命令(3)

例7:将某一文件内容或命令执行结果作为循环范围:

假如你有一个文件 todel.txt,里面是所有要删除的文件列表,现在你想将里面列出的每个文件都删掉。

假设这个文件是每个文件名占一行,象这样:
1.txt
2.txt
c:\3.txt
4.txt

那么可以用FOR来完成:

for /f %a in (todel.txt) do del %a

这个命令还可以更强大。比如你的 todel.txt 并不是象上面例子那么干净,而是由DIR直接生成,有一些没用的信息,比如由命令

c:\dir *.txt>>x.txt
生成的如下文件:
驱动器 C 中的卷没有标签。
卷的序列号是 DC16-E8A1
C:\ 的目录
2007-04-15 07:39 147 1.txt
2007-04-15 07:47 4 2.txt
2007-04-15 07:39 147 3.txt
2007-04-15 07:39 147 4.txt
4 个文件 445 字节
0 个目录 5,151,297,536 可用字节
C:\>

for 仍然可以解出其中的文件名并进行操作:
for /f "skip=5 tokens=4" %a in (x.txt) do @if exist %a DEL %a
当然,上面这个命令是在进行删除,如果你只是想看看哪些文件将被操作,把DEL换成echo:
for /f "skip=5 tokens=4" %a in (x.txt) do @if exist %a echo %a
你将看到:
1.txt
2.txt
3.txt
4.txt
x.txt
skip=5表示跳过前5行(就是DIR输出的头部信息),tokens=4表示将每行的第4列作为循环值放入%a,
正好是文件名。

例8. 可以用 /f 参数将某一命令执行结果作为循环范围
非常有用的功能。比如,我们想知道目前的环境变量有哪些名字(我们只要名字,不要值)。可是SET命令的输出是“名字=值”的格式,现在可以用FOR来只取得名字部分:
FOR /F "delims==" %i IN ('set') DO @echo %i
将看到:
ALLUSERSPROFILE
APPDATA
CLASSPATH
CommonProgramFiles
COMPUTERNAME
ComSpec
dircmd
HOMEDRIVE ......
这里是将set命令执行的结果拿来作为循环范围。delims==表示用=作为分隔符,由于FOR /F默认是用每行第一个TOKEN,所以可以分离出变量名。如果是想仅列出值:
FOR /F "delims== tokens=2" %i IN ('set') DO @echo %i
tokens=2和前例相同,表示将第二列(由=作为分隔符)作为循环值。


例9: 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分

这个比较简单,就是说将循环变量的值自动分离成只要文件名,只要扩展名,或只要盘符等等。

例:要将 c:\mp3下所有mp3的歌名列出,如果用一般的 dir /b/s 或 for /r ,将会是这样:

g:\mp3\Archived\05-18-01-A\游鸿明-下沙\游鸿明-01 下沙.mp3
g:\mp3\Archived\05-18-01-A\游鸿明-下沙\游鸿明-02 21个人.mp3
......
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-阿修罗.mp3
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-彼岸花.mp3
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-不爱我的我不爱.mp3
......
如果我只要歌名(不要路径和".mp3"):
游鸿明-01 下沙
游鸿明-02 21个人
......
王菲-阿修罗
王菲-彼岸花
王菲-不爱我的我不爱
......
那么可以用FOR命令:
for /r g:\mp3 %a in (*.mp3) do @echo %~na

例10 我们知道 date /t (/t表示不要询问用户输入)的输出是象这样的:
C:\>date /t
2007-04-22 星期日

现在我想分离出日期部分,也就是22:
for /f "tokens=3 delims=- " %a in ('date /t') do @echo %a
实际上把 tokens后面换成1,2,3或4,你将分别得到2007, 04, 22和星期日。注意delims=/后面还有个空格,表示/和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项。

再灵活一点,将日期用 星期日 2002-07-13的格式输出:

for /f "tokens=1,2,3,4 delims=- " %a in ('date /t') do @echo %d %a-%b-%c
当tokens后跟多个值时,将分别映射到%a, %b, %c等。实际上跟你指定的变量有关,如果你指定的是 %i, 它们就会用%i, %j, %k等。

没有评论: