批命令SHIFT的妙用

Author: Date: 1995-07-28

        如下是一个用于删除多个文件的批文件mydcl.bat:
        @echo off
        echo 这是一个用于删除多个文件参数的批处理文件
        echo 使用方法:mydel [D:][PATH]FILENAME1[D:][PATH]FILENAME2... :work
        if "%1"=="" goto enddel %1
        shift
        goto work
        :end
        现在根目录上有三个文件aa、bb、cc,用mydel.bat来删除:
        c:\>mydel aa bb cc
        实际上,mydel.bat是一个循环语句。它首先遇到if语句,检查%1(aa)是否为空,dos将del %1替换成del aa,接着执行goto work语句;第二次循环,if语句测试BB非空,shift把%1参数更替成bb,执行del bb,goto work;第三次循环,shift把%1参数更替成cc,执行del cc;最后,shift把%1更替成空,if检测到参数为空,goto end语句,批文件结束。
        利用shift这一特性来建立一个用于拷贝多项参数的批文件mycopy.bat:
        @echo off
        echo 这是一个可拷贝多项参数的批文件
        echo 使用方法:mycopy directory[D:][PATH]file1[D:][PATH]file2
        set workdir=%1
        :work
        shift
        if "%1"=="" goto end
        copy %1 workdir%
        goto work
        :end
        现在有三个文件aa、bb、cc欲拷贝到tmp目录:
        c:\>mycopy tmp aa bb cc
        由于要拷贝多个文件参数,为了区别被拷贝的文件群与目标目录,dos把目标目录tmp放在前面,而把要拷贝的文件放在后面。这点与我们平常使用的方法略有不同。观察执行过程:它是这样执行的:copy aa tmp,这点与我们的使用还是一致的。然后shift把%1先后更替为bb、cc,copy bb tmp和copy cc tmp,最后if语句测试到%1为空并执行goto end语句,批文件结束。
        如上所述,我们还可以利用shift这一特性来建立mydir.bat,以“dir %1”代替mydel.bat文件中的“del %1”,用来列表显示多项文件目录参数,也可建立mymove.bat文件,以“move %1 %workdir%"代替mycopy.bat文件中的“copy %1 %workdir%”,用于移动文件等多项批文件。此类批文件允许使用通配符。
        (邹大刚)