Board logo

标题: [文件操作] [已解决]批处理怎样删除D盘相同文件夹? [打印本页]

作者: wang6542975    时间: 2011-4-4 09:42     标题: [已解决]批处理怎样删除D盘相同文件夹?

本帖最后由 wang6542975 于 2011-4-5 09:24 编辑

例如  一、 D:下有N个以TEST命名的文件夹,只保留一个剩下的全部删除。(注意还有些文件夹不是在D:根目录下的)
         二、如果连TEST文件夹名都不知道。怎么找出相同的文件夹并只保留一个剩下的全部删除。
作者: TX_kakashi    时间: 2011-4-4 10:14

保留哪个都无所谓的是么?
作者: wang6542975    时间: 2011-4-4 10:15

2# TX_kakashi


是的,因为里面的内容都一样。
作者: TX_kakashi    时间: 2011-4-4 11:11

本帖最后由 TX_kakashi 于 2011-4-4 11:48 编辑

稍做修改,应该可以了
  1. @echo off
  2. set scan_dri=d:
  3. cd/d %scan_dri%
  4. title [Scanning...]
  5. for /f "tokens=*" %%a in ('dir/b/s/ad') do (
  6.      if not defined %%~nxa (set "%%~nxa=s") else (echo rd/s/q "%%a")
  7. )
  8. pause
复制代码

作者: wang6542975    时间: 2011-4-4 11:22

本帖最后由 wang6542975 于 2011-4-4 11:24 编辑

不行。。运行后的结果如下。我只截了部分
rd/s/q "D:\行健客户端\xjclient\Temp"
rd/s/q "D:\迅雷下载\客户资料"
rd/s/q "D:\迅雷下载\17173shenmo_box_v1.073\17173shenmo_box_v1.073"
rd/s/q "D:\迅雷下载\17173shenmo_box_v1.073\17173shenmo_box_v1.073\Bin"
rd/s/q "D:\迅雷下载\17173shenmo_box_v1.073\17173shenmo_box_v1.073\Update"
rd/s/q "D:\迅雷下载\Dude\Dude"
rd/s/q "D:\迅雷下载\Dude\Dude\data"
rd/s/q "D:\迅雷下载\Dude\Dude\language"
rd/s/q "D:\迅雷下载\Dude\Dude\data\files\images"
rd/s/q "D:\迅雷下载\PanabitWB_20100801_FreeBSD8x_new\boot"
作者: tmplinshi    时间: 2011-4-4 11:43

本帖最后由 tmplinshi 于 2011-4-5 10:54 编辑

4# TX_kakashi



存在几个问题:

1、
pushd d:


如果当前目录为 d 盘的子目录,如 d:\test,执行 pushd d: 不会切换到根目录。(改成 pushd d:\ 就没有这个问题)

另一个相似的情况:如果当前目录是 c:\windows\system32,执行 dir /b/s c: 列出的是 system32 下的文件,而不是从 c:\ 开始。

2、
if not defined %%~na (set "%%~na=s") else (echo rd/s/q "%%a")


应该用 %%~nxa,因为如果文件夹名称是 a.b。

3、把 &setlocal enabledelayedexpansion 去掉吧,防止文件夹名称中有英文感叹号。

修正后的代码为:
  1. @echo off
  2. set scan_dri=d:
  3. pushd %scan_dri%\
  4. title [Scanning...]
  5. for /f "tokens=*" %%a in ('dir/b/s/ad') do (
  6.      if not defined %%~nxa (set "%%~nxa=s") else (echo rd/s/q "%%a")
  7. )
  8. pause
复制代码

作者: TX_kakashi    时间: 2011-4-4 11:49

4# TX_kakashi



存在几个问题:

1、pushd d:

如果当前目录为 d 盘的子目录,如 d:\test,执行 pushd d: 不会切换到根目录。

另一个相似的情况:如果当前目录是 c:\windows\system32,执行 dir /b/s ...
tmplinshi 发表于 2011-4-4 11:43

已修改,感谢指点.
作者: TX_kakashi    时间: 2011-4-4 11:55

不行。。运行后的结果如下。我只截了部分
rd/s/q "D:\行健客户端\xjclient\Temp"
rd/s/q "D:\迅雷下载\客户资料"
rd/s/q "D:\迅雷下载\17173shenmo_box_v1.073\17173shenmo_box_v1.073"
rd/s/q "D:\迅雷下载\171 ...
wang6542975 发表于 2011-4-4 11:22

不知道是不是有点理解错了题目的本意,lz的意思是不是D盘下所有名字相同的目录保留一个别的都删除? 如果这样的话一些“大众名字”的文件夹可能会遭到误删,比方说data,icon,update了什么的...
作者: tmplinshi    时间: 2011-4-4 11:58

8# TX_kakashi


没错吧,我也是这么理解的。
作者: hanyeguxing    时间: 2011-4-4 12:09

本身批处理对文件名是有要求的,例如不能有=,不能有%,不能有*等等
作者: hfg1977    时间: 2011-4-4 12:53

6楼 tmplinshi  版主:
如果当前目录为 d 盘的子目录,如 d:\test,执行 pushd d: 不会切换到根目录。


试验了下:
批处理文件在子目录中,并没有出现问题呀?? XP sp3
  1. @echo %cd%
  2. @echo "%~d0\"
  3. @pushd "%~d0\"
  4. @echo %cd%
  5. @pause
复制代码

作者: tmplinshi    时间: 2011-4-5 11:00

本帖最后由 tmplinshi 于 2011-4-5 12:00 编辑
试验了下:
批处理文件在子目录中,并没有出现问题呀?? XP sp3
@echo %cd%
@echo "%~d0\"
@pushd "%~d0\"
@echo %cd%
@pause

hfg1977 发表于 2011-4-4 12:53

我写的是 pushd d:,不是你试验的 pushd "%~d0\"。

不好意思,之前没有说清楚,让你困惑了。已在帖子中加上了“(改成 pushd d:\ 就没有这个问题)”这句话。其实你仔细看 6 楼的回复的话,“修正后的代码为:”下面的代码写的就是 pushd %scan_dri%\。




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