Board logo

标题: [文件操作] 如何让批处理自动判断并删除空目录?(解决) [打印本页]

作者: 我来了    时间: 2013-8-27 07:54     标题: 如何让批处理自动判断并删除空目录?(解决)

本帖最后由 我来了 于 2013-8-27 13:27 编辑

有D:\TTPmusic下,有若干个个歌手名的空目录,如何让批处理自动判断并删除?
多谢老师了。再次的,叩谢!
作者: 林小七    时间: 2013-8-27 08:02

  1. @echo off
  2. for /d /r %%a in (*) do (
  3. echo %%a>>1.txt)
  4. for /f %%s in ('sort /r^<1.txt') do (
  5.         rd /q "%%s" 2>nul)
  6. color 02
  7. @echo.
  8. @echo.              删除完成.....
  9. pause>nul
复制代码

作者: 林小七    时间: 2013-8-27 08:05

  1. for /f "tokens=*" %%a in ('dir /b /ad /s^|sort /r') do rd "%%a" 2>nul
  2. echo.删除完成&&pause>nul
复制代码
这样也行,放在D:\TTPmusic下,上面的P也放在D:\TTPmusic下,两个都能达到你要的效果
作者: PowerShell    时间: 2013-8-29 20:19

我给出的powershell命令
  1. $a = Get-ChildItem D:\TTPmusic -Recurse | Where-Object {$_.PsIsContainer -eq $true}   
  2. $a | Where-Object{$_.GetDirectories().Count -eq 0 -and $_.GetFiles().Count -eq 0} | Select-Object FullName  | Remove-Item $_
复制代码
我的试验代码
  1. $a = Get-ChildItem D:\ -Recurse | Where-Object {$_.PsIsContainer -eq $true}
  2. $a | Where-Object{$_.GetDirectories().Count -eq 0 -and $_.GetFiles().Count -eq 0} | Select-Object FullName  >>e:\kong.txt
复制代码
你的试验代码
  1. for /f "tokens=*" %a in ('dir /b /ad /s^|sort /r') do echo "%a" >> e:\kong2.txt 2>nul
复制代码
你这个是在,我机子d盘根目录直接打的。cmd下直接打的,所以只有一个百分号,但是你的这个生成的文件,和我这个生成的文件大小差很大,你的生成的文件大。经我人肉眼查验,很多明显不是空目录,用你的命令却给删除了!!!

顾,本着严谨的原则,诚征高手!各位大牛速来校验我俩的代码!!!
作者: Batcher    时间: 2013-8-29 22:32

回复 4# PowerShell


    验证方法不对,rd命令在不加/q的情况下是无法删除非空目录的,3楼的代码正是利用了这一点。
作者: PowerShell    时间: 2013-8-30 08:19

本帖最后由 PowerShell 于 2013-8-30 09:22 编辑

原来那命令找不出空目录,3q楼上。
-----我不禁要吐槽-----
对于powershell删除空目录,我的代码基本上是标准的,唯一的。
【对于某个问题,几乎只有一个标准的,唯一的,解法(答案)】这其实是powershell,python共同的特性和原则。
而 rd /? 也没有【rd 不带参数,不能删除非空目录】的帮助。我认为又是奇技淫巧。
简单直观更容易学用,更容易普通程序员理解修改,更容易大规模,java。net就是如此。

结论,powershell搜出的空目录直观,可靠。
作者: ADSL0125    时间: 2013-8-30 14:06

本帖最后由 ADSL0125 于 2013-8-30 14:14 编辑

回复 6# PowerShell

虽然两代码都是删除空目录,但功能上对"空目录"定义有点区别

BAT删除的是没有任何文件的目录(如果有子目录,子目录也要求没有文件)
PS 删除的是没有任何文件和目录的目录

假定目录是这样嵌套的,并且没有任何文件
D:\TTPmusic\
D:\TTPmusic\2\
D:\TTPmusic\2\3\
D:\TTPmusic\2\3\4\

BAT是一次删除,以下目录
D:\TTPmusic\2\
D:\TTPmusic\2\3\
D:\TTPmusic\2\3\4\

PS需要运行三次
第一次删除
D:\TTPmusic\2\3\4\
第二次删除
D:\TTPmusic\2\3\
第三次删除
D:\TTPmusic\2\

功能略有不同,代码都正确

----------------------------------------------------------
从代码实现来说流程不同
PS是先看一下目录下有没有文件和目录,再进行删除

BAT是不管什么目录都用RD删一下试试,反正有文件删除不了,简单易行,如果LZ问的是怎么找出空目录的话,也不会用这段代码
作者: PowerShell    时间: 2013-8-30 15:23

$_.GetDirectories().Count -eq 0 -and $_.GetFiles().Count -eq 0-------这句话表示此目录中的子目录数为0 ,和 此目录中的文件数为0 ,我个人理解,这才叫逻辑上的空目录。

BAT是一次删除,以下目录
D:\TTPmusic\2\
D:\TTPmusic\2\3\
D:\TTPmusic\2\3\4\
--------------我试了,rd D:\TTPmusic\2\ 不行。因为里面还有3,3里还有4.
作者: ADSL0125    时间: 2013-8-30 15:49

本帖最后由 ADSL0125 于 2013-8-30 16:03 编辑

回复 8# PowerShell

你试试这两句

这句是顺序列出文件夹
dir D:\TTPmusic /ad /s /b

D:\TTPmusic\2\
D:\TTPmusic\2\3\
D:\TTPmusic\2\3\4\
这样的顺序,是删除不了的,如你所说,2下有3,3下有4
----------------------------------------------------------
通过管道对DIR输出结果倒序排列
dir D:\TTPmusic /ad /s /b|Sort /r

D:\TTPmusic\2\3\4\
D:\TTPmusic\2\3\
D:\TTPmusic\2\
这样的顺序,就可以全部删除了

----------------------------------------------------------
for /f "tokens=*" %%a in ('dir /b /ad /s^|sort /r') do rd "%%a" 2>nul

连起来理解的话
就是列出当前目录下的所有目录(/ad)和子目录(/s),并去掉无关标题和摘要(/b)
把这些目录使用降序排列(sort /r)
循环对排列后的目录删一下(rd "%%a")
如果删除不了,也不要显示错误信息(2>nul)
作者: 林小七    时间: 2013-8-31 17:33

楼上正解~~~
我想说能达到目的的脚本就是好脚本~而不在乎与用的什么脚本语言~~
我承认水平的确不如powershell这位仁兄~~如有得罪还请谅解~
以后若学powershell还请多多关照
作者: PowerShell    时间: 2013-8-31 18:49

本帖最后由 PowerShell 于 2013-8-31 18:53 编辑

我想说能达到目的的脚本就是好脚本~而不在乎与用的什么脚本语言~~----那当然
如有得罪还请谅解~------那没啥,
--------------下面的和上面的其实无关----------------------
关于bat powershell 谁更 可靠,更值得 信任,我想谈谈,谁有兴趣请跟帖.
powershell可靠,所以我更信任。这个可靠,来源于所有功能都是内置的,我们编写脚本,只是调用。
内置的功能,出错了,被我们发现了,-------这个几率很小
我们调用内置的功能,----这块是我们写的,我们逻辑很清楚。只要我们尽量严谨,出错不多,而且一旦出错,我们一看报错信息,很容易解决。
而且powershell 编辑器都有调试功能,处理特殊字符的能力又强。又有出错中断,try catch trap 等调试语句.抛错语句.

bat现在看来功能比较差了,我们通过diy出来的功能。或许漏洞很多,当然,我并不是特指楼主这个问题,我是泛指,或者说,这是我脑中对bat的看法。
而且我发现很多论坛里的bat高手回复的问题解法,只限于坛友问题的解决----这本来没什么,但很多没有限制变量类型,没有容错代码。而且bat有不好调试,bat处理特殊字符的能力又弱。
当然,我认为肯定有牛人能写出高质量的,容错的bat代码,但绕脑袋,不容易看懂,再说菜鸟多于老鸟很多。

总之,我认为我的担忧有很大道理。
作者: 林小七    时间: 2013-9-1 14:02

回复 11# PowerShell


    只能说各有所长,各有所短,咱们不能以个人意见来代表大家的意见,我没有学过ps,对ps也很有兴趣,另外本人会一点点vbs和python,在应用时深刻体会到了各门不同语言之间的差异和优点缺点,其实觉得并没有谁好谁坏,只能说哪种情况用哪种语言更方便,,




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