如有以下任务:
将F:\Website路径及其各级子目录下的dwg文件全部拷贝到F:\dwg
在拷贝前我们先查看一下该类文件的数量及全部大小。
使用两个dos命名命令:
cd /d F:\website for /r %d in (*.dwg) do (echo %d)
用cd命名切换到F:\website目录,然后使用for /r循环处理以F:\website指定为起点的的整个目录树下的扩展名为dwg的文件(包括子目录中的文件);
两个dos命令可以用符号&连接到一起,一起执行:
cd /d F:\website & for /r %d in (*.dwg) do (echo %d)
效果:
如果不想显示命名本身,可以再串一个echo off命名:
@echo off & cd /d F:\website & for /r %d in (*.dwg) do (echo %d)
效果:
也可以将以上输出重定向到一个文本文件(输出到文件):
cd /d F:\website & for /r %d in (*.dwg) do (echo %d >> c:\dwg.txt)
注意在dos的for循环中对变量的引用只使用一个百分号%,而在bat中需要使用两个百分号%%。
完整的bat文件,包括屏幕显示及输出到virus.txt文件:
@echo off setlocal enabledelayedexpansion echo. >c:\virus.txt color 3a echo. set /a n = 0 set /p b=输入查找文件扩展名: if /i "%b%"=="" cls && goto fh echo 系统正在查找文件,请耐心等候...... echo. ::for %%a in (F E D C) do ( ::for %%a in (F) do ( cd /d F:\website for /r %%b in (*.%b%) do ( if exist "%%b" ( echo %%b echo %%b>>c:\virus.txt set /a n+=1 echo 现查到%b%文件个数:!n! ) ) ::) type c:\virus.txt | find /i "\" && goto no echo. echo 文件内容没找到! del c:\virus.txt>nul 2>nul echo. pause exit :no ::cls echo. echo 文件查找完毕并记录在c:\virus.txt中 ! echo 现查到%b%文件总的个数:!n! echo. echo 是否打开文本查看记录 ? echo. echo 选择" Y "查看。 选择" N "退出。 echo. set /p Choice=Y/N: IF /I '%Choice:~0,1%'=='y' goto A IF /I '%Choice:~0,1%'=='n' goto B pause exit :A start c:\virus.txt exit pause :b exit
效果:
如果要复制到某一路径下,只需要更改上面的一行代码即可:
echo %%b
更改为:
copy %%b F:\dwg
如果路径是某个分区,可以将
cd /d F:\website
更改为:
cd /d F:\
如果路径是多个分区,可以添加一个外层循环:
for %%a in (F E D C) do ( cd /d %%a:\ ::…… )
表示在F、E、D、C四个分区下查看或复制。
以下是查看F盘下的全部dwg文件(有880个):
并转存到了一个文本文件,如下所示:
现在的思路是,以上述文件文本内容作为需要拷贝的文件清单,将不需要拷贝的文件(文本行)删除掉,然后按照文件清单去拷贝文件(清理后还剩下23个文件需要拷贝):
使用批处理命名for /f即可分行分列解析文件文本。
完整的代码如下:
::如果目标文件中已存在某文件,则相同文件名+扩展名的文件不会被复制 @echo off setlocal enabledelayedexpansion color 3a echo. set /a n = 0 echo 系统正在查找文件,请耐心等候...... echo. for /f "delims=" %%b in (c:\dwg.txt) do ( ::路径有空格时,需要使用参数"delims=" if exist "%%b" ( copy "%%b" C:\dwg set /a n+=1 echo 现复制了个文件:!n! ) ) echo. echo. pause
-End-