标题: [文件操作] [已解决]批处理怎样把不属于指定列表里面的文件全部删除? [打印本页]
作者: photo510 时间: 2012-6-26 10:03 标题: [已解决]批处理怎样把不属于指定列表里面的文件全部删除?
本帖最后由 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
..................还有很多
作者: lky216 时间: 2012-6-26 11:01
我当初用命令行把G盘删掉了文件 好像是RD命令,一下子10多G没了,后来用恢复软件,全都恢复了,就一个500M的缺损。
排除文件,我只知道这个- (五) 忽略以指定字符打头的行:eol=
-
- 在cmd窗口中敲入:for /?,相关的解释为:
-
- [quote]
- eol=c - 指一个行注释字符的结尾(就一个)
- [/quote]
- [quote]
- FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
-
- 会分析 myfile.txt 中的每一行,忽略以分号打头的那些行……
- [/quote]
-
- 第一条解释狗屁不通,颇为费解:行注释字符的结尾是什么意思?“(就一个)”怎么回事?结合第二条解释,才知道eol有忽略指定行的功能。但是,这两条解释是互相矛盾的:到底是忽略以指定字符打头的行,还是忽略以指定字符结尾的行?
-
- 实践是检验真理的唯一标准,还是用代码来检验一下eol的作用吧:
- [code15]
- @echo off
- for /f "eol=;" %%i in (test.txt) do echo %%i
- pause
-
- 结果,那些以分号打头的行没有显示出来。
-
- 由此可见,第二条解释是正确的,eol= 的准确含义是:忽略以指定字符打头的行。而第一条的“结尾”纯属微软在信口开河。
-
- 那么,“(就一个)”又作何解释呢?
-
- 试试这个代码:
- [code16]
- @echo off
- for /f "eol=,;" %%i in (test.txt) do echo %%i
- pause
-
- 此时,屏幕上出现 此时不应有 ;"。 的报错信息。可见,在指定字符的时候,只能指定1个——在很多时候,我对这样的设计颇有微词而又无可奈何:为什么只能指定1个而不是多个?要忽略多个还得又是if又是findstr加管道来多次过滤,那效率实在太低下了——能用到的功能基本上都提供,但是却又做不到更好,批处理,你的功能为什么那么弱?
-
- 不知道大家注意到没有,如果test.txt中有以分号打头的行,那么,这些行在代码[code14]的执行结果中将凭空消失。
-
- 原来,for /f 语句是默认忽略以分号打头的行内容的,正如它默认以空格键或跳格键作为字符串的切分字符一样。
-
- 很多时候,我们可以充分利用这个特点,比如,在设计即将用for读取的配置文件的时候,可以在注释文字的行首加上分号,例如在编写病毒文件查杀代码的时候,可以通过for语句来读取病毒文件列表,那么,病毒文件列表.ini这个配置文件可以这样写:
-
- ;以下是常见的病毒文件,请见一个杀一个^_^
- ;copyleft:没有
- qq.exe
- msn.exe
- iexplore.exe
-
- 如果要取消这个默认设置,可选择的办法是:
-
- 1、为eol=指定另外一个字符;
- 2、使用 for /f "eol=" 语句,也就是说,强制指定字符为空,就像对付delims=一样。
复制代码
作者: powerbat 时间: 2012-6-26 16:01
- @echo off
- xcopy /e/h/l /exclude:list.txt C:\* D:\ | find ":" >D:\missfile.txt
- for /f "delims=" %%a in (D:\missfile.txt) do echo del /a/f "%%a"
- (for /f "delims=" %%a in (list.txt) do if not exist "%%a" echo %%a)>D:\missfile.txt
- pause
复制代码
作者: photo510 时间: 2012-6-26 17:12
本帖最后由 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‘’。
作者: photo510 时间: 2012-6-26 17:15
powerbat 发表于 2012-6-26 16:01
谢谢大侠!我过几天搞一个VMware虚拟机试试效果如何。因为拿真实系统试验有风险。
作者: photo510 时间: 2012-6-27 14:39
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
下载或者直接看下图:
作者: flyingd 时间: 2012-6-27 15:13
将要排除的文件做一个列表做为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 删除的操作
)
)
作者: apang 时间: 2012-6-27 15:31
回复 6# photo510
将echo del /a/f "%%a"前面的echo删掉。。。
作者: photo510 时间: 2012-6-27 16:51
将要排除的文件做一个列表做为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个文件?
作者: flyingd 时间: 2012-6-27 17:43
呃 上面这段不是代码 只是个思路罢了。
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
作者: photo510 时间: 2012-6-28 09:44
呃 上面这段不是代码 只是个思路罢了。
dir c: /a /b /s > clear.txt
就是把C盘里所有的文件全部做成带 ...
flyingd 发表于 2012-6-27 17:43
谢谢大侠解答!
作者: photo510 时间: 2012-6-28 09:45
回复 photo510
将echo del /a/f "%%a"前面的echo删掉。。。
apang 发表于 2012-6-27 15:31
去掉echo果然成功啦!谢谢大侠!
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |