[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理怎样把不属于指定列表里面的文件全部删除?

本帖最后由 photo510 于 2012-6-28 09:45 编辑

怎么把C盘上所有不属于*.TXT文件(这个*.TXT文件里面有详细具体的文件绝对路径列表,文件名,后缀名等等)里面的文件全部删除?

也就是仅仅保留*.TXT列表里面的文件,C盘上面其他文件(包括系统文件,系统隐藏文件等等)全部删除。当然这种操作要在WINPE下面进行。

还有就是如果*.TXT文件中有的文件(举例FREEWBCHT.MB),而C盘上没有FREEWBCHT.MB,最好能把C盘上没有的文件另外在D盘生成missfile.txt文件(里面包含有具体的绝对路径,文件名,后缀名等等),其实就是把C盘中没有的文件重新列表为missfile.txt而已

请问批处理怎么写?谢谢!

举例:仅仅保留下面的文件:
C:\Program Files\FreeWB\mb\default\user.ini
C:\Program Files\FreeWB\mb\default\quick.mb
C:\Program Files\FreeWB\mb\default\FREEWBCHT.MB
C:\Program Files\FreeWB\mb\default\freewb.usr
C:\Program Files\FreeWB\mb\default\freewb.mb
C:\Program Files\FreeWB\mb\default\freewb.dat
C:\Program Files\FreeWB\mb\default\attach.mb
C:\Program Files\Common Files\microsoft shared\VGX\VGX.dll
C:\Program Files\Common Files\System\Ole DB\msdadc.dll
C:\Program Files\Common Files\System\Ole DB\msdaenum.dll
C:\Program Files\Common Files\System\Ole DB\msdaer.dll
C:\Program Files\Common Files\System\Ole DB\msdaora.dll
C:\Program Files\Common Files\System\Ole DB\msdaorar.dll
C:\Program Files\Common Files\System\Ole DB\msdaosp.dll
C:\Program Files\Common Files\System\Ole DB\msdaps.dll
C:\Program Files\Common Files\System\Ole DB\msdasc.dll
C:\Program Files\Common Files\System\Ole DB\msdasql.dll
C:\Program Files\Common Files\System\Ole DB\msdasqlr.dll
C:\Program Files\Common Files\System\Ole DB\msdatl3.dll
C:\Program Files\Common Files\System\Ole DB\msdatt.dll
C:\Program Files\Common Files\System\Ole DB\msdaurl.dll
C:\Program Files\Common Files\System\Ole DB\msxactps.dll
C:\Program Files\Common Files\System\Ole DB\oledb32.dll
C:\Program Files\Common Files\System\Ole DB\oledb32r.dll
C:\Program Files\Common Files\System\Ole DB\oledbjvs.inc
C:\Program Files\Common Files\System\Ole DB\oledbvbs.inc
C:\Program Files\Common Files\System\Ole DB\sqloledb.dll
C:\Program Files\Common Files\System\Ole DB\sqloledb.rll
C:\Program Files\Common Files\System\Ole DB\sqlxmlx.dll
C:\Program Files\Common Files\System\Ole DB\sqlxmlx.rll
....................还有很多
C:\Windows\bfsvc.exe
C:\Windows\explorer.exe
C:\Windows\fveupdate.exe
C:\Windows\hh.exe
C:\Windows\regedit.exe
C:\Windows\system.ini
C:\Windows\win.ini
C:\Windows\WindowsShell.Manifest
C:\Windows\Branding\Basebrd\basebrd.dll
C:\Windows\Branding\Basebrd\en-US\basebrd.dll.mui
C:\Windows\Branding\Basebrd\zh-CN\basebrd.dll.mui
..................还有很多
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

我当初用命令行把G盘删掉了文件 好像是RD命令,一下子10多G没了,后来用恢复软件,全都恢复了,就一个500M的缺损。
排除文件,我只知道这个
  1. (五) 忽略以指定字符打头的行:eol=
  2.   在cmd窗口中敲入:for /?,相关的解释为:
  3. [quote]
  4. eol=c           - 指一个行注释字符的结尾(就一个)
  5. [/quote]
  6. [quote]
  7. FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
  8.     会分析 myfile.txt 中的每一行,忽略以分号打头的那些行……
  9. [/quote]
  10.   第一条解释狗屁不通,颇为费解:行注释字符的结尾是什么意思?“(就一个)”怎么回事?结合第二条解释,才知道eol有忽略指定行的功能。但是,这两条解释是互相矛盾的:到底是忽略以指定字符打头的行,还是忽略以指定字符结尾的行?
  11.   实践是检验真理的唯一标准,还是用代码来检验一下eol的作用吧:
  12. [code15]
  13. @echo off
  14. for /f "eol=;" %%i in (test.txt) do echo %%i
  15. pause
  16.   结果,那些以分号打头的行没有显示出来。
  17.   由此可见,第二条解释是正确的,eol= 的准确含义是:忽略以指定字符打头的行。而第一条的“结尾”纯属微软在信口开河。
  18.   那么,“(就一个)”又作何解释呢?
  19.   试试这个代码:
  20. [code16]
  21. @echo off
  22. for /f "eol=,;" %%i in (test.txt) do echo %%i
  23. pause
  24.   此时,屏幕上出现 此时不应有 ;"。 的报错信息。可见,在指定字符的时候,只能指定1个——在很多时候,我对这样的设计颇有微词而又无可奈何:为什么只能指定1个而不是多个?要忽略多个还得又是if又是findstr加管道来多次过滤,那效率实在太低下了——能用到的功能基本上都提供,但是却又做不到更好,批处理,你的功能为什么那么弱?
  25.   不知道大家注意到没有,如果test.txt中有以分号打头的行,那么,这些行在代码[code14]的执行结果中将凭空消失。
  26.   原来,for /f 语句是默认忽略以分号打头的行内容的,正如它默认以空格键或跳格键作为字符串的切分字符一样。
  27.   很多时候,我们可以充分利用这个特点,比如,在设计即将用for读取的配置文件的时候,可以在注释文字的行首加上分号,例如在编写病毒文件查杀代码的时候,可以通过for语句来读取病毒文件列表,那么,病毒文件列表.ini这个配置文件可以这样写:
  28. ;以下是常见的病毒文件,请见一个杀一个^_^
  29. ;copyleft:没有
  30. qq.exe
  31. msn.exe
  32. iexplore.exe
  33.   如果要取消这个默认设置,可选择的办法是:
  34.   1、为eol=指定另外一个字符;
  35.   2、使用 for /f "eol=" 语句,也就是说,强制指定字符为空,就像对付delims=一样。
复制代码

TOP

  1. @echo off
  2. xcopy /e/h/l /exclude:list.txt  C:\*  D:\ | find ":" >D:\missfile.txt
  3. for /f "delims=" %%a in (D:\missfile.txt) do echo del /a/f "%%a"
  4. (for /f "delims=" %%a in (list.txt) do if not exist "%%a" echo %%a)>D:\missfile.txt
  5. pause
复制代码
1

评分人数

TOP

本帖最后由 photo510 于 2012-6-26 17:18 编辑
我当初用命令行把G盘删掉了文件 好像是RD命令,一下子10多G没了,后来用恢复软件,全都恢复了,就一个500M的 ...
lky216 发表于 2012-6-26 11:01


我是菜鸟,看不懂。希望一步一步来。先不要管生成missfile.txt这个功能,这个功能好像有点复杂,先完成最主要的功能(删除不在*.TXT列表中的C盘文件)。

先把''不属于*.TXT文件列表中的C盘文件全部删除‘’这一步骤完成,然后再进一步操作后面的''把C盘没有的文件重新列表为missfile.txt‘’。

TOP

powerbat 发表于 2012-6-26 16:01


谢谢大侠!我过几天搞一个VMware虚拟机试试效果如何。因为拿真实系统试验有风险。

TOP

powerbat 发表于 2012-6-26 16:01


报告大家!C盘的文件好像删除不了。missifle.txt是生成啦,而且正确。但批处理删除C盘文件后,C盘可用空间并没有增加,跟没有执行批处理前一样。

我的具体操作。用WINPE启动,看到C盘的可用空间是1.87G,然后从WINPE(E盘)里面复制 list.txt文件和del.bat文件。运行del.bat文件,生成missfile.txt,然后开始删除C盘文件,一直显示''del /a/f XXX''差不多过了30秒,终于完成操作,按任意键退出。可是一看C盘的可用空间依然是1.87G。无论list.txt和del.bat放在WINPE里面还是放在D盘运行,过程结果都一样:无法删除C盘的文件。希望大家给予帮忙解决!

用ggg软件录下了操作过程:可以到http://115.com/file/benpaxso#del file.gif
下载或者直接看下图:

TOP

将要排除的文件做一个列表做为keep.txt
以下是删除的脚本
dir /b /s > C:\Clear.txt
For /c %%i in (C:\clear.txt) do (
Find /c /n %%i C:\KEEP.TXT
IF %errorlevel% == "0" (
REM Skip this file
) ELSE (
REM 删除的操作
)
)

TOP

回复 6# photo510

将echo del /a/f "%%a"前面的echo删掉。。。

TOP

将要排除的文件做一个列表做为keep.txt
以下是删除的脚本
dir /b /s > C:\Clear.txt
For /c %%i in (C:\ ...
flyingd 发表于 2012-6-27 15:13


有点看不明白,那个clera.txt怎么生成的?假如我的keep(要保留的)文件有5000个文件,但C盘有12000个文件,那么clera.txt应该是12000-5000=7000个文件?

TOP

呃 上面这段不是代码 只是个思路罢了。

dir c: /a /b /s > clear.txt
就是把C盘里所有的文件全部做成带路径的列表输出到clear.txt里去
然后按行读取clear.txt 比较文件是否在keep.txt里能找到,能的话就跳过这个文件,不能就执行不能的操作,比如删除。
不过这段程序不能直接运行。会有预执行产生的变量延时问题。要改成外部过程。

有点看不明白,那个clera.txt怎么生成的?假如我的keep(要保留的)文件有5000个文件,但C盘有12000个文件 ...
photo510 发表于 2012-6-27 16:51

TOP

呃 上面这段不是代码 只是个思路罢了。

dir c: /a /b /s > clear.txt
就是把C盘里所有的文件全部做成带 ...
flyingd 发表于 2012-6-27 17:43


谢谢大侠解答!

TOP

回复  photo510

将echo del /a/f "%%a"前面的echo删掉。。。
apang 发表于 2012-6-27 15:31


去掉echo果然成功啦!谢谢大侠!

TOP

返回列表