[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 如何让批处理自动判断并删除空目录?(解决)

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

有D:\TTPmusic下,有若干个个歌手名的空目录,如何让批处理自动判断并删除?
多谢老师了。再次的,叩谢!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 11# PowerShell


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

TOP

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

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

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

总之,我认为我的担忧有很大道理。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

楼上正解~~~
我想说能达到目的的脚本就是好脚本~而不在乎与用的什么脚本语言~~
我承认水平的确不如powershell这位仁兄~~如有得罪还请谅解~
以后若学powershell还请多多关照
活着就是为了改变世界

TOP

本帖最后由 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)
当你拥有一把用得顺手的锤子,就会认为全世界都是钉子

TOP

$_.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.
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

本帖最后由 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问的是怎么找出空目录的话,也不会用这段代码
当你拥有一把用得顺手的锤子,就会认为全世界都是钉子

TOP

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

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

结论,powershell搜出的空目录直观,可靠。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 4# PowerShell


    验证方法不对,rd命令在不加/q的情况下是无法删除非空目录的,3楼的代码正是利用了这一点。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

我给出的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下直接打的,所以只有一个百分号,但是你的这个生成的文件,和我这个生成的文件大小差很大,你的生成的文件大。经我人肉眼查验,很多明显不是空目录,用你的命令却给删除了!!!

顾,本着严谨的原则,诚征高手!各位大牛速来校验我俩的代码!!!
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

  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下,两个都能达到你要的效果
1

评分人数

    • 我来了: 高手都会写正则,佩服~~~技术 + 1
活着就是为了改变世界

TOP

  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
复制代码
活着就是为了改变世界

TOP

返回列表