deltree发生了什么事情?它有什么替代品?

88
在早期版本的MS-DOS中(我想是7版本,但可能不准确),存在一个deltree命令,它可以递归删除给定路径下的所有子目录和文件。
现在已经没有deltree了,但del似乎没有继承删除树的能力。del /s可以删除文件,但不能删除文件夹。
如何轻松地(即通过一条命令)从批处理文件中删除一棵树?

5
deltree 在 5.0 版本中推出(我仍然记得能够使用它时的喜悦)- 哎呀,感觉自己老了。 - Mark D
11个回答

96

正如其他人所提到的,rd命令有一个/s开关来递归删除子目录。您可以将其与/q开关结合使用,以强制删除子目录(及其内容)而无需提示,如下所示:

rd /s /q c:\foobar

大家都没有意识到的是,rd不是完全替代deltree的命令,尽管(几乎)谷歌搜索“windows deltree”返回的每个页面都会让你这样认为。 deltree 命令既可以删除目录,也可以删除文件,使其成为一个方便、多用途的删除命令。也就是说下面两种写法都是有效的:

deltree /y c:\foobar
deltree /y c:\baz.txt

然而,rd(毫不意外地)只适用于目录。因此,只有第一个命令是有效的,而第二个命令会出现错误并使文件未被删除:
rd /s /q c:\foobar
rd /s /q c:\baz.txt

此外,del 命令只适用于文件,而不是目录,因此第一个命令会报错,只有第二个命令有效:
del /f /q c:\foobar
del /f /q c:\baz.txt

没有内置的方法可以像使用 deltree 一样删除文件和目录。使用单独的 rddel 最多也只是不方便,因为它需要区分文件系统对象(文件/文件夹名称)是文件还是目录,这并不总是可能或实际。
你可以从之前的操作系统中复制 deltree 命令,但它只能在 32 位版本的 Windows 上工作,因为它是一个 16 位 DOS 命令(即使在 Windows 9x 中也是如此)。
另一个选择是创建一个批处理文件,调用 delrd 两个命令,类似于这样:
::deltree.bat

@echo off
rd  %* 2> nul
del %* 2> nul

您会这样调用它:
deltree.bat /s /q /f c:\foobar
deltree.bat /s /q /f c:\baz.txt

这会同时调用rddel,传递参数并将输出重定向到nul以避免它们中的一个发出错误。您可能想要自定义行为以适应或简化参数或允许错误消息,但即使如此,它也不是理想的,也不是deltree的直接替代品。另一种选择是获取第三方工具,尽管找到一个是真正的搜索查询技巧练习。

2
@TobyAllen,“rm”?你是不是想说“rd”?如果是的话,那么你需要重新阅读帮助文本;它说“删除指定目录中的所有目录和文件以及目录本身。用于删除目录树。”就像我说的,它不会删除文件。如果你这样使用:rd /s foobar.txt,它会提示你是否确定,如果你选择是(或使用/q开关),那么它会给出错误信息“目录名无效”。 - Synetech
实际上,您可以使用“RMDIR /S”删除目录下的所有内容(包括其子目录),因此可以说没有一种方法可以一次性删除文件和文件夹是不正确的。 - vapcguy
@vapcguy,“rd /s”仅适用于目录,而不是其中的文件。为了删除其中的文件,您必须在目录本身上使用“rd”。例如,您不能说“rd c:\ target \ foobar.txt”,您必须使用“rd /s c:\ target”,但您可能不想删除目录本身,只是其内容。 “deltree”可以做到这一点,但“rd /s”不能,而且“rd /s”还会删除目录本身。 - Synetech
如果使用删除文件夹的命令,没有人会试图仅删除文件夹的内容。这很荒谬。deltree从未是一个仅删除文件夹内容而不删除文件夹本身的命令,而且在Windows MS-DOS中至少在Win98上是有效的。他们用rmdir替换了它。当然,rd /s删除整个文件夹 - 它的字面意思是“删除目录”。如果你说rd不能直接作用于文件,你会让人们感到困惑。强调直接。但即使如此,指出这一点也是不必要的,因为它确实会删除文件。 - vapcguy
不,它没有被替换,因为rd(rmdir)作为内部shell命令存在,就像现在一样,而deltree是一个外部命令。现在唯一不容易做到的事情是删除所有内容,这可以通过deltree完成,但不能使用rmdir完成。 - arana
显示剩余8条评论

46

4
“RMDIR /S /Q .\” 可以有效地清空当前目录及其子目录下的所有内容。是的,它会抱怨无法删除当前目录,这可能很有用。只要确保在运行时处于正确的目录中即可! :) - Mmm

10

因为怀旧的情绪,我编写了自己的deltree.exe。它可以用于目录和文件,并使用SHFileOperation()来提高速度。

https://github.com/ai7/toolbox/tree/master/deltree

deltree v1.01 [Mar 27 2015, 16:31:02] (gcc 4.9.1)

Usage: deltree [options] <path> ...

Options:
  -y    yes, suppresses prompting for confirmation
  -s    silent, do not display any progress dialog
  -n    do nothing, simulate the operation
  -f    force, no prompting/silent (for rm compatibility)
  -r    ignored (for rm compatibility)

Delete directories and all the subdirectories and files in it.
它支持通配符,并且您可以像使用Unix的rm命令一样使用它:

它采用通配符,您可以像使用Unix的rm命令一样使用它:

deltree -rf *

这很有趣。我想指出 https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shfileoperationa 上说:“此函数已在Windows Vista中被IFileOperation替换。”虽然不知道这是否重要! - Jody Bruchon

8
rmdir /s /q directory

5
现在,您可以使用PowerShell执行相同的任务:
powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"

不幸的是,PowerShell 过于臃肿且缓慢。:-\ 当公司试图强制用户“升级”到他们最新的垃圾时,我感到非常讨厌。 - Synetech
我觉得这个答案无意中宣传了CMD而不是PowerShell:“rd /s /q“dir”更短,更易于阅读。尽管如此,拥有PS的本地答案仍然很好! - Jody Bruchon

4
$ help rd
删除(删除)目录。
RMDIR [/S] [/Q] [驱动器:]路径 RD [/S] [/Q] [驱动器:]路径
/S 除了目录本身外,还删除指定目录中的所有目录和文件。用于删除一个目录树。
/Q 安静模式,不询问是否使用 /S 删除目录树。

2

实际上,在现代Windows操作系统中,RMDIR和RD命令将Win 98的RD和Deltree命令合并为一个单独的命令。这是一个内部命令,因此您不会找到任何RD.exe和RMDIR.exe。

通过在cmd中键入“RD /?”(不带引号),您将获得所需的内容。


1

要递归删除一个目录及其所有内容

rd /s MY_DOOMED_DIR

0

使用这个:

cd (your directory here)
del *.* /f /s /q

3
您能否为这些旗帜添加简短的说明?这将使答案更加有价值。谢谢。 - rsjaffe
这已经在被接受的答案中提到了。 - Melebius

0

删除所有文件和子目录

cd /d Directory && rd /s /q .\

您的答案似乎是其他答案的副本(有些已经存在10年)。我无法看到任何更多,更好的解释或任何其他优势。 - jeb
1
@jeb,实际上不是这样。它略有不同,这种微小的差异至关重要,并使其更加优越。 - Synetech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接