上一节介绍了在Windows命令行模式下使用通配符来进行文件批量处理。许多命令行模式下的命令都支持通配符,只要掌握了通配符的用法,就可以用通配符来匹配多个文件名而达到对多个文件进行批量处理的目的。

但是,也有一些命令行模式下的程序不支持在文件名参数中带通配符。比如,要对ActiveX DLL或OCX进行COM组件注册时,可以用以下命令:

regsvr32 /s filename

反注册时,可以用:

regsvr32 /u /s filename

以上两条命令中的“/s”参数是silent的意思,如果不带“/s”的话,注册时会弹出一个对话框。regsvr32这个程序不接受在文件名中带通配符,通常情况下就只能一个一个文件注册了。

本节要介绍一种方法,在命令行模式程序不接受通配符参数时,仍然可以进行批量处理。这个方法就是使用“FOR”命令。接触过编程语言的人看到“FOR”这个单词应该已经明白了,它是“循环”命令。先举个例子,如果要对当前目录下所有的DLL和OCX文件进行COM组件注册,可以使用以下命令:

FOR %A IN (*.DLL *.OCX) DO regsvr32 /s "%A"

这条命令将对所有当前目录下的DLL和OCX文件逐一调用regsvr32这个程序。命令行中括号里的内容便是要批量处理的带通配符的文件名,可以有多个,用空格分隔。%A是变量名,DO之后的内容便是要重复执行的命令行。这条命令的执行过程是,先按照括号中的内容(*.DLL *.OCX)匹配出所以符合条件的文件名,然后对匹配到的每一个文件名逐一执行DO之后的命令行内容,每次执行之前将文件名赋给变量%A以替换命令行中的%A。用双引号将%A引起来是为了在文件名中包含空格时命令仍然能被正确执行。

执行以上的命令时,对命令行的每次调用前,系统都会将执行的实际命令行输出在屏幕上,这样可以方便查错,而且我们可以结合REM命令来在真实运行之前先做检查。REM是注释命令,一般用于批处理文件中,REM之后的内容都会被系统忽略,所以以下命令:

FOR %A IN (*.DLL *.OCX) DO REM regsvr32 /s "%A"

便可以在屏幕上对每一个匹配到的文件输出一条形如REM regsvr32 /s "filename"的命令行,检查起来非常方便。

如果不希望在屏幕上输出生成的命令行,可以在DO之后的命令行之前加上符号“@”,一般情况下不建议这么做,因为出问题时不便于检查。不过,灵活的使用“@”符号,也可以达到一些特别的目的,比如:

FOR %A IN (*.DLL *.OCX) DO @ECHO regsvr32 /s "%A"

这条命令也可以用于实际执行命令之前的检查工作,不过输出的结果比之前用REM要更好看一些。ECHO命令可以将其后的参数行原封不动的输出,在这里我们用它来输出我们将逐一执行的命令行。而由于ECHO之前有一个“@”,所以系统不会自动将DO之后的命令行逐一输出了。

由于FOR命令是将匹配到的文件名作为字符串代入了DO之后的命令行来执行,所以它提供了很大的灵活性。举个例子,当前目录下有许多声音文件,文件名是file01.mp3,file02.mp3,file03.mp3的形式,现在需要将其分别改名为music01.mp3,music02.mp3,music03.mp3等等。在上一节中我们已经知道,用于改名的RENAME命令是接受通配符的,那是不是我们的改名任务直接通过一条简单的RENAME命令来进行就可以了呢?大家可以试一试,不管是RENAME file*.mp3 music*.mp3还是RENAME file??.mp3 music??.mp3都不能达到目的,这是因为file和music的字符数目不同。如果要把文件名改成song01.mp3的形式倒是可以用一句简单的RENAME file*.mp3 song*.mp3搞定。那么我们如何借助FOR来将文件名改为music01.mp3的形式呢?其实很简单,我们只要先在文件名之前加多一个字母就可以了:

FOR %A IN (file*.mp3) DO RENAME %A t%A

这样一来,文件名便改成了tfile01.mp3的形式,由于tfile和music一样是5个字符,所以下面的RENAME便把文件名改为了music01.mp3的格式:

RENAME tfile*.mp3 music*.mp3

那么反过来,要将music01.mp3,music02.mp3,music03.mp3这样的一系列文件名改为file01.mp3这样的格式要如何处理呢?下面两条命令便能完成这个任务:

RENAME music*.mp3 " file*.mp3"
FOR %A IN (" file*.mp3") DO RENAME "%A" %A

要注意的是,以上命令中的两处" file*.mp3"中file之前都有一个空格。

以上结合了我的一些经验介绍了FOR命令的基本使用方法。在Windows XP中,FOR命令还有许多的扩展用法,其中包括:仅对目录匹配的/D参数,包含子目录内的文件进行匹配的/R参数等。对于匹配到的文件名,还可以方便地指定格式来代入命令行,比如%~fA代入的是包含盘符和完整路径的完全文件名,%~nA代入的是去掉扩展名的文件名。除了使用通配符对文件名称进行匹配达到批量处理的目的外,Windows XP中的FOR命令还可以通过指定起始值、终止值、步长来基于数值进行循环。更加强大的功能是,它还可以对给定字符串内容、指定文件集中的内容、甚至指定命令的运行结果进行遍历,将这些内容按要求分割成一个个的小字符串并代入DO之后的命令行逐一运行。如果感兴趣的话,可以通过“FOR /?”命令查看帮助。

标签:, ,