[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
现在的问题是你那些文件不是在同一目录下,这个是比较困难和耗时的部分。
我的想法是:先将要删除的文件名输出到一个文本a.txt,再将所有文件的完整路径输出到一个文本b.txt,然后用findstr根据这两个文件将需要删除的文件的完整路径取到另一个文本c.txt,最后用for/f循环删除所有需要删除的文件,虽然在多数情况下,临时文件是不推荐的,但这种情况下用临时文件应该是比较好的方式。
  1. @echo off
  2. ::将下一行的crc32.txt替换为实际的文件名
  3. (for /f "tokens=1*" %%a in (crc32.txt) do (
  4.   if defined %%a (echo,%%b) else set %%a=1
  5. ))>a.txt
  6. dir /s /b /a-d>b.txt
  7. findstr /i /g:a.txt b.txt>c.txt
  8. for /f "delims=" %%a in (c.txt) do del /a "%%a"
  9. del a.txt b.txt c.txt
复制代码
将crc32的校验结果文件和本bat文件一起放到要处理的文件夹的顶层目录,然后运行这个批处理即可。

必须满足:
1.校验结果文件格式要工整,每一行第一列必须为校验码,空格或tab后为文件名;
2.任何子目录不能取名为校验结果文件中的任何一个文件名;
看得多说得多,远比不上写得多。

TOP

回复 13# BAT-VBS
如果文件名中有空格怎么办?每一行都dir /s,300万个文件,你可以去试试效率,写批处理并不仅仅是能够实现就好,还需要考虑效率和特殊情况滴。
看得多说得多,远比不上写得多。

TOP

回复 19# necnec1
擦,lz要不要这么可爱,那些原理是解释我批处理代码的实际运作方式的,不关你的事啊,你不是有一个存放了校验码和文件名的文本吗,把那个crc32.txt改成那个文本的真实名字就可以了。
看得多说得多,远比不上写得多。

TOP

回复 23# necnec1
何必删除到回收站那么麻烦,不同的系统回收站的路径还不一样,建立一个备份文件夹,把要删除的文件移动到这里不就行了。
  1. @echo off
  2. md backup 2>nul
  3. ::将下一行的crc32.txt替换为实际的文件名
  4. (for /f "tokens=1*" %%a in (crc32.txt) do (
  5.   if defined %%a (echo,%%b) else set %%a=1
  6. ))>a.txt
  7. dir /s /b /a-d>b.txt
  8. findstr /i /g:a.txt b.txt>c.txt
  9. for /f "delims=" %%a in (c.txt) do  move /y "%%a" backup\
  10. del a.txt b.txt c.txt
复制代码
1

评分人数

看得多说得多,远比不上写得多。

TOP

回复 29# namejm
传说中的前站长namejm居然现身了,罕见罕见!jm一向以严谨著称,见识了。。。
要规避findstr搜索字符串的特殊字符,是不是可以用/l参数?一个文件名包含在另一个文件名中的情况确实需要考虑,惭愧惭愧。。。
  1. @echo off
  2. md backup 2>nul
  3. ::将下一行的crc32.txt替换为实际的文件名
  4. (for /f "tokens=1*" %%a in (crc32.txt) do (
  5.   if defined %%a (echo,\%%b) else set %%a=1
  6. ))>a.txt
  7. dir /s /b /a-d>b.txt
  8. findstr /il /g:a.txt b.txt>c.txt
  9. for /f "delims=" %%a in (c.txt) do  move /y "%%a" backup\
  10. del a.txt b.txt c.txt
复制代码
看得多说得多,远比不上写得多。

TOP

本帖最后由 weichenxiehou 于 2012-12-4 20:46 编辑

回复 37# necnec1
我估计是因为用set定义了太多的变量,后面用if defined在如此之多的变量里面查找会比较吃力,可以先用sort排序,然后用一个变量来比较。
  1. @echo off&setlocal enabledelayedexpansion
  2. md backup 2>nul
  3. ::将下一行的crc32.txt替换为实际的文件名
  4. (for /f "tokens=1*" %%a in ('sort crc32.txt') do (
  5.   if %%a=="!str!" (echo,\%%b)
  6.   set "str=%%a"
  7. ))>a.txt
  8. dir /s /b /a-d>b.txt
  9. findstr /ile /g:a.txt b.txt>c.txt
  10. for /f "delims=" %%a in (c.txt) do  move /y "%%a" backup\
  11. del a.txt b.txt c.txt
复制代码
亲测,a.txt不额外加一空行不会出现jm说的最后一行不会当成搜索字符串的问题。
看得多说得多,远比不上写得多。

TOP

回复 42# BAT-VBS
“他”是指谁?namejm?我用的win7,难道xp下面必须要在最后加空行,不知,我最开始用电脑就是从win7开始的。
看得多说得多,远比不上写得多。

TOP

返回列表