Board logo

标题: [提问]如何删除除指定目录以外的所有目录? [打印本页]

作者: Bee     时间: 2006-9-28 08:27    标题: [提问]如何删除除指定目录以外的所有目录?

我想册除一个目录下面的文件夹和文件:
例如:目录F:\下面有3个文件夹1,2,3,我想保留这三个然后其它的全部册除!请各位高人多多提点本人不胜感激同时也为广大同等级的小辈们一个学习机会。:)



——————————俺是分割线——————————

*********************************
                     版务记录
*********************************
操作:       更改标题
原因:       原格式不符版规
原标题:    初入江湖,又遇大难题。请各位
              功力深厚在大侠们进来帮帮戼/span>
执行:       3742668
处罚:       初犯,赦之。
备注:       1.建议发贴前看看置顶版规
              2.如何更改标题?
                  点击所发贴右下角编辑——---------------------------------------------———————————★
                 按钮,然后进行编辑。                                                                                     ↓
**********************************


[ Last edited by 3742668 on 2006-9-29 at 10:22 ]
作者: vkill     时间: 2006-9-28 08:33
dir     findstr /v     del 我是这样想的
作者: smileseeker     时间: 2006-9-28 09:19
http://www.cn-dos.net/forum/viewthread.php?tid=23404&fpage=1


找个对你应该有帮助   结合楼上的 /v
作者: 3742668     时间: 2006-9-29 02:19
不光要/v还要/x:
@echo off
    for /f "delims=" %%i in ('dir /ad /b f:\ ^| findstr /xiv "1 2 3"') do rd /s /q "f:\%%i"
1.建议把rd语句换成echo f:\%i先看看执行结果再确定是否删除。
2.以上代码未经测试。
参考链接:怎么写出这样的批处理..谢谢
作者: redtek     时间: 2006-9-29 06:59
版主这个“X”参数玩得真漂亮~:)
C:\TEMP\t>findstr /?
在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X
        [/C:string] [/G:file] [/D:dir lis
        strings [[drive:][path]filename[

  /X         打印完全匹配的行。
  /V         只打印不包含匹配的行。
先开始我以为这个X与V参数是有冲突的,结果试验普通目录(从目录名1建到10),结果发现不加/X参数与加了/X参数的效果一样,很奇怪。


后来键了带空格的“1  1”类似的目录以后,
才明白原来/V只打印不包含从“X打印完全匹配的行”里提到的匹配的行,
(就是/X提出完全匹配的行--目录名“1”,但目录名“1 1”不完全匹配所以不提)
然后由/V来决定滤掉由/X找到的完全匹配的数据行,
就相当于只有指定的目录名为”1“或”2“或”3“的目录不提取(就可以有排除的删了),
而”1 1“等中间带有空格的但也含有”1”字符的目录名由于受到了/X的完全匹配规则,
而也可以放在要删的行列了。
2006-09-28  18:36    <DIR>          .
2006-09-28  18:36    <DIR>          ..
2006-09-28  18:29    <DIR>          1
2006-09-28  18:36    <DIR>          1 1
2006-09-28  18:33    <DIR>          11
2006-09-28  18:29    <DIR>          2
2006-09-28  18:29    <DIR>          3
2006-09-28  18:34    <DIR>          4
2006-09-28  18:34    <DIR>          5
2006-09-28  18:34    <DIR>          6
2006-09-28  18:34    <DIR>          7
利害~:)
学到很多东西~:)
作者: redtek     时间: 2006-9-29 07:02
越来越发现光看代码是没用的,
一边看一边分析也不行,
还要亲自再试一回,一边试一边想,才真学到东西了~:)
作者: Bee     时间: 2006-9-29 09:37
谢谢这么多位的指导我会借你们的思路去好好研究下的!
作者: piziliu2004     时间: 2006-9-29 22:24
@echo off
for /f "delims=" %%i in ('dir/ad/b') do (   
if /i not "%%i" == "1" rd %%i
if /i not "%%i" == "2" rd %%i
if /i not "%%i" == "3" rd %%i
)

我在当前目录下执行批处理。为什么这样不行呢?。 它delete所有目录了。
作者: zh159     时间: 2006-9-29 22:31


  Quote:
Originally posted by piziliu2004 at 2006-9-29 10:24:
@echo off
for /f "delims=" %%i in ('dir/ad/b') do (   
if /i not "%%i" == "1" rd %%i
if /i not "%%i" == "2" rd %%i
if /i not "%%i" = ...

当搜索到“1”时:if /i not "%%i" == "1" rd %%i,删除除“1”以外的文件夹(包含2、3)
当搜索到“2”时:if /i not "%%i" == "2" rd %%i,删除除“2”以外的文件夹(包含1、3)
当搜索到“3”时:if /i not "%%i" == "3" rd %%i,删除除“3”以外的文件夹(包含1、2)

想象还剩下什么???
作者: piziliu2004     时间: 2006-9-29 23:01
@echo off
for /f "delims=" %%i in ('dir/ad/b') do (   
if /i  "%%i" == "1" goto END
if /i  "%%i" == "2" goto END
if /i  "%%i" == "3" goto END
rd %%i
:END
)

还有怎么会包错了。
作者: piziliu2004     时间: 2006-9-29 23:08
用这种方法实现。。。。。。成功
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir/ad/b') do (   
set /a pathfolder=%%i
if !pathfolder! GTR 3 rd %%i
)

上面的问题: 批处理()里边不能用: 标注释么
作者: zh159     时间: 2006-9-30 00:39
两个单字节的“::”冒号
作者: piziliu2004     时间: 2006-9-30 02:06
这样?。不行。 能不详细指点一下代码
for /f "delims=" %%i in ('dir/ad/b') do (   

if /i  "%%i" == "1" goto :END
if /i  "%%i" == "2" goto :END
if /i  "%%i" == "3" goto :END
rd %%i
::END
)
作者: zh159     时间: 2006-9-30 02:27
注释是两个单字节的“::”冒号,标签才是一个单字节的“:”冒号
作者: 9527     时间: 2006-9-30 02:52
@echo off
for /f "delims=" %%i in ('dir /ad /b') do (
if not "%%i"=="1" if not "%%i"=="2" if not "%%i"=="3" call :ii "%%i"
)
goto :eof

:ii
echo %1
goto :eof
作者: piziliu2004     时间: 2006-9-30 03:57
批处理的if语句 的“or” 操作是您上面的代码。空格 连接几个if 语句。。。如下  如果是”and“操作的if语句用什么连接呢?  

if not "%%i"=="1" if not "%%i"=="2" if not "%%i"=="3" call
作者: namejm     时间: 2006-9-30 06:37
  if not "%%i"=="1" if not "%%i"=="2" if not "%%i"=="3" 的意思是 如果 %%i 不等于1,也不等于2,同时也不等于3,那么就……,其实几个 if 条件并列就表示 "and" 操作。
作者: piziliu2004     时间: 2006-9-30 07:04
赫赫。。发颠倒了。。。。。。“or” 操作是?
作者: pengfei     时间: 2006-9-30 07:05
版主说的对, 三个if表示三个串联的条件判断, 如果三个条件都成立就执行命令. 只要一个判断不成立将不执行call命令.
作者: Bee     时间: 2006-9-30 08:02
9层大哥说的没错啊。。保存一的时候2。3都没了,哪里还能找到2。3呢?
作者: namejm     时间: 2006-9-30 11:35


  Quote:
Originally posted by piziliu2004 at 2006-9-30 07:04:
赫赫。。发颠倒了。。。。。。“or” 操作是?

  or 操作可以有两种格式:

  1、用 if 的嵌套格式:
if "%%i"=="1" (command1) else (if "%%i"=="2" (command1) else (if "%%i"=="3" command1))
  这种方法的流程是:如果 %%i 等于1,则执行command1,否则,再判断 %%i 是否等于2,等于2则执行command1,不等于2再判断是否等于3,如果等于3就执行command1……还可以用 else 继续接下去。

  2、用顺序排列的几个if语句:
if "%%i"=="1" command1
if "%%i"=="2" command1
if "%%i"=="3" command1
……
  这种方法的流程是:如果%%i 等于1,执行command1,否则,忽略command1操作;然后再执行下一句,判断%%i 是否等于2,如果等于2的话就执行command1,不等于2的话就忽略这个语句上的command1;然后再执行下一句……但是一个数不可能同时为两个或两个以上的值,所以如此排列的 if 条件只可能有一个成立,也就只会执行一次command1了。
作者: 3742668     时间: 2006-9-30 13:11
3.if...else...if
    if xxx == ??? ( command1
                       ) else (
                                 if xxx == ???  command2
                                 command3
                                )

作者: mayamason     时间: 2006-10-7 00:59
在图形界面里用反选功能也可以实现,而且很简单啊.
作者: yayumyself     时间: 2007-6-21 16:21
这个帖子受益匪浅!
作者: cndidong     时间: 2008-2-15 12:42
我觉得还是15楼的代码比较好。。。