前阵子帮朱工调整了扫描到文件到共享文件夹,当时朱工提出要能自动删除共享文件夹下所有文件的需求,我考虑到他的需求非常简单,我提出采用DOS批处理脚本加计划任务的方案为他解决,在计划任务内指定批处理脚本定期每天运行一次命令,批处理内容如下:
@echo off del "C:\A SCAN\"*.* /q del "C:\B SCAN\"*.* /q del "C:\C SCAN\"*.* /q
这段代码非常简单,简单来说就是运行三次删除命令即可。可是到了第三天时,问题就来了,朱工发现这些共享的文件夹里不仅仅有扫描生成的文件,还有一些用户在访问共享文件夹时生成的目录,而脚本不能够达到要求,所以提出让我帮他在原有的基础上再次改进,晚上回到家时,我开始了新的编写:
@echo off attrib -s -h -r "C:\test\"*.* && del "C:\test\"*.* /q dir "C:\test\" /ad /b /s >a.txt for /f %%a in (a.txt) do rd %%a /s /q
我来简单说一下以上的脚本:首先是给C盘下test目录下所有文件重新定义权限,&&其实可以看做是回后后的下一个命令,继续之前的删除目录下所有文件,然后这里我们要用到一个就是例出test目录下所有的文件夹并把文件夹名称记录到a.txt文件中,最后是一个循环和变量,取出a.txt中的每一行为%%a然后执行rd也就是删除目录命令/s /q分别是目录下所有文件和静默执行。
经过本机测试完美达到效果,如果正常情况下那是没有错,可是我忽然想到朱工的共享目录貌似是C:\A Scan,那么目录下有空格貌似不一定行,因为从文件中取出的变量也会带空格,然后在rd执行阶段就会存在一个问题那就是rd path时空格没有加入”号,无法执行!另外也需要考虑在共享目录下也有可能生成带有空格的目录,那么也一定要加入新的变量,来达到取值的问题。也着实把自己二十年前所学的理论知识又好好挖了一遍,总算完成,脚本已经加了注释也就不多做解释,最终脚本如下:
@echo off :删除上一次记录文件 del C:\Script\a.txt /q del C:\Script\b.txt /q del C:\Script\c.txt /q :去除权限并删除目录下所有文件 attrib -s -h -r "C:\A Scan\"*.* && del "C:\A Scan\"*.* /q attrib -s -h -r "C:\B Scan\"*.* && del "C:\B Scan\"*.* /q attrib -s -h -r "C:\C Scan\"*.* && del "C:\C Scan\"*.* /q :获取目录下所有子目录,并记录 dir "C:\A Scan\" /ad /b /s >a.txt dir "C:\B Scan\" /ad /b /s >b.txt dir "C:\C Scan\" /ad /b /s >c.txt :从记录中删除目录下的所有目录及文件 set thestart=" set theend=" for /f "delims=" %%a in ('type a.txt') do rd %TheStart%%%a%TheEnd% /s /q for /f "delims=" %%b in ('type b.txt') do rd %TheStart%%%b%TheEnd% /s /q for /f "delims=" %%c in ('type c.txt') do rd %TheStart%%%c%TheEnd% /s /q :PS:本脚本需要放在C:\Script\如果不放在该目录下,应该把前三段中目录名改成对应目录