Board logo

标题: [文件操作] 批处理怎样删除某文件夹之外的其它文件夹? [打印本页]

作者: youxi01    时间: 2007-12-1 21:00     标题: 批处理怎样删除某文件夹之外的其它文件夹?

删除某文件夹之外的其它文件,比如:D:\盘下,有很多文件夹,如:QQ、backup等,现在要求只保留QQ文件夹,如何实现?

PS:对于此问题,很多人都写了相关代码,但原理都几乎是:dir+echo+findstr
因为使用了findstr,效率方面打了折扣,欢迎大家积极讨论,给出更完美的解决方案
作者: youxi01    时间: 2007-12-1 21:16

贴两则namejm的解决方案:
方法一:
  1. @echo off
  2. :: 排除指定的文件夹,删除其余的目录
  3. :: config.ini 里的文件夹格式为:,+要排除的文件夹名+,
  4. :: code by jm 2006-12-19
  5. for /f "delims=" %%i in ('dir /ad /b') do findstr /i /c:",%%i," config.ini>nul||echo "%%i"
  6. pause
  7. goto :eof
复制代码
方法二:
  1. @echo off
  2. :: echo之后再管道再find的方案比较慢
  3. set dir_=,program files,Documents and Settings,
  4. for /f "delims=" %%i in ('dir /ad /b') do (
  5.     echo "%dir_%"|find /i ",%%i,">nul||echo "%%i"
  6. )
  7. pause
复制代码

作者: foxJL    时间: 2007-12-1 21:48

  1. @echo off
  2. set/p nodel=输入不想删除的文件夹:
  3. for /f "delims=" %%i in ('dir /ad /b') do (
  4. for %%a in (%nodel%) do (if "%%i"=="%%a" set del=1)
  5. if defined del (echo 文件夹[%%i],没有删除.&set del=) else (echo 删除文件夹[%%i]))
  6. pause>nul
复制代码

[ 本帖最后由 foxJL 于 2007-12-17 23:06 编辑 ]
作者: 随风    时间: 2007-12-1 21:58

:
  1. @echo off&goto start
  2. 个人认为,2楼的两个代码,效率上都不会很高
  3. 在for的do后面使用findstr这样的外部命令,不会有效率。
  4. 第一个代码效率比第二个高,是因为第二个代码,又多用了一个管道命令。
  5. 以下代码思路:
  6.    利用dir的ah特性,先给要排除的文件夹设为隐藏属性
  7.    再删除所有不具备隐藏属性的文件夹
  8.    再给要排除的文件夹解除隐藏属性,
  9.    再删除所有具有隐藏属性的文件夹。
  10. 以下显示的为要删除的文件夹。要排除的是 “ab cd” 文件夹
  11. :start
  12. set paic=ab cd
  13. attrib +h "%paic%"
  14. for /f "delims=" %%i in ('dir/ad-h/b') do echo %%i
  15. attrib -h "%paic%"
  16. for /f "delims=" %%i in ('dir/adh/b') do echo %%i
  17. pause
复制代码

[ 本帖最后由 随风 于 2007-12-1 22:07 编辑 ]
作者: namejm    时间: 2007-12-1 22:23

  通过改变文件夹的属性来排除的方法不错,应该是最有效率的方案了。
作者: longlivedg    时间: 2007-12-17 15:23

通过改变文件夹的属性来排除的方法确实不错,但是如果要排除的文件夹很大,如果装了很多游戏,大小几十G,这样的话,改变这个文件夹的属性如果在WINDOWS下用手动操作一般要好几分钟啊!在DOS下有这个影响没有?
作者: 随风    时间: 2007-12-17 15:59

那你就试试这个.
删除,除qq文件夹以外的文件夹
:
  1. @echo off
  2. for /f "delims=" %%a in ('dir/b/ad') do (
  3. if not "%%a"=="qq" rd/s/q "%%a"
  4. )
  5. pause
复制代码

作者: longlivedg    时间: 2007-12-17 16:28

这是上面几种方法中的哪一种啊?
还有,如果我想保留多个文件夹,比如要保留QQ,game等!应该怎么写

另外请问一下,这种方法效率怎么样?谢谢
作者: 随风    时间: 2007-12-17 16:37

效率?
效率取决于你要删除的文件夹的大小,即:rd命令的执行时间.(似乎这不是问题)
如果有多个需要判断的话,就用设置属性的方法吧,应该不会很慢的.
作者: longlivedg    时间: 2007-12-17 16:47

我在百度上搜索到了一篇贴子,我看了一下,跟二楼的方法类似,但二楼的方法我没看懂,这篇贴子我看得有点懂了,但也有很多不明白的(自嘲一下:这方面我是菜鸟),我现在发出来,大家评论下,看看如何
----------------------------------------------------------------
@echo off
::如果有多个路径,或者排除多个文件夹:::
::或者排除多个文件,请手工进行设置:::::
::findstr 后面可以跟多个/c:""参数::::::
::如:/c:"game" /c:"qq" /c:"net" ::::::
::中间使用空格间隔:::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::
:: code by zzlike 2006-12-11 CMD@XP::::
::******配置文件开始*****************::
::::::::指定搜索路径::例 e:\ ::::::::::
set "dd=e:\"
::::::::排除文件夹:::::::::::::::::::::
set "dn=game"
::::::::排除文件:::::::::::::::::::::::
set "fn=排除删除文件夹.bat"
::******配置文件结束*****************::
::::::::删除文件夹:::::::::::::::::::::
for /f "delims=" %%i in ('dir /b /ad "%dd%" ^|findstr /i /v /b /e /c:"%dn%"') do attrib -s -h -r -a /s /d "%dd%%%i" && rd /s /q "%dd%%%i"

::::::::删除文件:::::::::::::::::::::::
for /f "delims=" %%i in ('dir /b /a-d "%dd%" ^|findstr /i /v /b /e /c:"%fn%"') do del /a /f /q "%dd%%%i"
-------------------------------------------------------------
我有几个地方没看明白:为什么要set "dn=game"   
这是方便下面用^|findstr /i /v /b /e /c:"%dn%"') 是简写吗?这里的dn其实就是game吗
作者: longlivedg    时间: 2007-12-17 16:51

原帖由 随风 于 2007-12-17 16:37 发表
效率?
效率取决于你要删除的文件夹的大小,即:rd命令的执行时间.(似乎这不是问题)
如果有多个需要判断的话,就用设置属性的方法吧,应该不会很慢的.


明白
但我想用上面这种办法
作者: 随风    时间: 2007-12-17 17:01

以上方法是用dir遍历所有文件夹,再交给findstr来判断,
不过似乎也只能判断一个文件夹哦.
作者: longlivedg    时间: 2007-12-17 17:45

不会吧,看他的贴子好像支持多文件夹排除啊
作者: 随风    时间: 2007-12-17 18:22

确实,是
没注意
作者: lky216    时间: 2013-4-30 22:15

http://www.bathome.net/thread-23612-1-1.html
这个如何




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2