标题: [文件操作] 批处理怎样删除某文件夹之外的其它文件夹? [打印本页]
作者: youxi01 时间: 2007-12-1 21:00 标题: 批处理怎样删除某文件夹之外的其它文件夹?
删除某文件夹之外的其它文件,比如:D:\盘下,有很多文件夹,如:QQ、backup等,现在要求只保留QQ文件夹,如何实现?
PS:对于此问题,很多人都写了相关代码,但原理都几乎是:dir+echo+findstr
因为使用了findstr,效率方面打了折扣,欢迎大家积极讨论,给出更完美的解决方案
作者: youxi01 时间: 2007-12-1 21:16
贴两则namejm的解决方案:
方法一:- @echo off
- :: 排除指定的文件夹,删除其余的目录
- :: config.ini 里的文件夹格式为:,+要排除的文件夹名+,
- :: code by jm 2006-12-19
-
- for /f "delims=" %%i in ('dir /ad /b') do findstr /i /c:",%%i," config.ini>nul||echo "%%i"
- pause
- goto :eof
复制代码
方法二:- @echo off
- :: echo之后再管道再find的方案比较慢
- set dir_=,program files,Documents and Settings,
- for /f "delims=" %%i in ('dir /ad /b') do (
- echo "%dir_%"|find /i ",%%i,">nul||echo "%%i"
- )
- pause
复制代码
作者: foxJL 时间: 2007-12-1 21:48
- @echo off
- set/p nodel=输入不想删除的文件夹:
- for /f "delims=" %%i in ('dir /ad /b') do (
- for %%a in (%nodel%) do (if "%%i"=="%%a" set del=1)
- if defined del (echo 文件夹[%%i],没有删除.&set del=) else (echo 删除文件夹[%%i]))
- pause>nul
复制代码
[ 本帖最后由 foxJL 于 2007-12-17 23:06 编辑 ]
作者: 随风 时间: 2007-12-1 21:58
:- @echo off&goto start
- 个人认为,2楼的两个代码,效率上都不会很高
- 在for的do后面使用findstr这样的外部命令,不会有效率。
- 第一个代码效率比第二个高,是因为第二个代码,又多用了一个管道命令。
- 以下代码思路:
- 利用dir的ah特性,先给要排除的文件夹设为隐藏属性
- 再删除所有不具备隐藏属性的文件夹
- 再给要排除的文件夹解除隐藏属性,
- 再删除所有具有隐藏属性的文件夹。
- 以下显示的为要删除的文件夹。要排除的是 “ab cd” 文件夹
- :start
- set paic=ab cd
- attrib +h "%paic%"
- for /f "delims=" %%i in ('dir/ad-h/b') do echo %%i
- attrib -h "%paic%"
- for /f "delims=" %%i in ('dir/adh/b') do echo %%i
- 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文件夹以外的文件夹
:- @echo off
- for /f "delims=" %%a in ('dir/b/ad') do (
- if not "%%a"=="qq" rd/s/q "%%a"
- )
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |