【问题标题】:What ever happened to deltree, and what's its replacement?deltree 发生了什么事,它的替代品是什么?
【发布时间】:2010-09-25 05:32:52
【问题描述】:

在早期版本的 MS-DOS 中 - 我想说的是版本 7,但我可能错了 - 有一个 deltree 命令,它递归地删除了给定路径中的所有子目录和文件。

deltree 不再存在,但del 似乎没有继承删除树的能力。 del /s 删除文件,但不删除文件夹。

如何轻松(即在一个命令中)从批处理文件中删除一棵树?

【问题讨论】:

  • deltree 是在 5.0 版本中引入的(我仍然记得能够使用它的喜悦) - 伙计,我觉得自己老了。

标签: windows batch-file cmd dos


【解决方案1】:
rmdir /s /q directory

【讨论】:

    【解决方案2】:

    它被替换为命令:RMDIR 或 RD

    使用 /S 删除所有子目录

    用 /Q 安静地使用它

    例子:

    RMDIR /S /Q Folder2Delete
    RD /S /Q Folder2Delete
    

    文档:

    【讨论】:

    • "RMDIR /S /Q .\" 有效地擦除当前目录及其下的所有内容。是的,它抱怨无法删除当前目录,这很有用。只需确保在运行时位于正确的目录中! :)
    【解决方案3】:
    $ 帮助 rd
    移除(删除)一个目录。
    
    RMDIR [/S] [/Q] [驱动器:]路径
    RD [/S] [/Q] [驱动器:]路径
    
        /S 删除指定目录下的所有目录和文件
                除了目录本身。用于删除目录
                树。
    
        /Q 安静模式,不询问是否可以用 /S 删除目录树
    

    【讨论】:

      【解决方案4】:

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

      通过输入这个“RD /?”在没有双引号的 cmd 中,你会得到你想要的。

      【讨论】:

        【解决方案5】:

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

        rd /s /q c:\foobar
        

        每个人都缺少的是,rd 不是完全替代 deltree,因为谷歌搜索 windows deltree 返回的每个页面似乎 (almost) 会让你相信。 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

        另一种方法是获取第三方工具,尽管找到一个是搜索查询制作的真正练习。

        【讨论】:

        • @TobyAllen,“rm”?你是说rd吗?如果是这样,那么您需要重新阅读帮助文本;它说 除了目录本身之外,还删除 指定目录中的所有目录和文件。用于删除目录树。 就像我说的,它不会删除文件。如果你这样使用它:rd /s foobar.txt,它会提示你是否确定,如果你说是(或使用/q 开关),那么它会给出错误The directory name is invalid.
        • 你其实可以用RMDIR /S删除一个目录下的所有东西(包括它的子目录),所以说没有办法一次性删除文件和文件夹其实是不正确的。
        • @vapcguy, rd /s 仅适用于目录,不适用于其中的文件。为了删除其中的文件,您必须在目录本身上使用rd。例如,你不能说rd c:\target\foobar.txt,你必须使用rd /s c:\target,但你可能不想删除目录本身,只删除它的内容。 deltree 可以这样做,但 rd /s 不能,rd /s 也会删除目录本身。
        • 注意我说的是RMDIR /S-不是rd /s。但是即使使用rd,如果目录没有了,文件怎么没有被删除?即使不是,这些文件也会被有效地孤立,并且应该由系统进行垃圾收集。即使这没有发生,如果您重新创建目录,它肯定会发生 - 您不会再次神奇地获得文件列表。指针基本上被删除了。所以你是说你永远不会拿回那个空间,因为如果你使用rd /s,你将永远无法删除这些文件?我不确定我是否相信——那将是一个可怕的错误。重点是删除文件和目录。
        • 如果您在“文档”文件夹中创建一个名为“test”的目录,则在 Windows 中创建一个测试文本文档,然后关闭资源管理器窗口,转到命令行,cd Documents,@ 987654363@,您的目录和文本文件将被删除。 rmdir /s test 也有效。你永远不要尝试使用rd /s C:\Users\me\Documents\test\test.txt——那绝对是愚蠢的。但是您可以并且应该在目录上使用命令,而不是在文件名上。但是通过删除目录,您可以删除文件。
        【解决方案6】:

        怀着怀旧之情,我编写了自己的 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 一样使用它:

        deltree -rf *
        

        【讨论】:

          【解决方案7】:

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

          rd /s MY_DOOMED_DIR
          

          【讨论】:

            【解决方案8】:

            现在,您可以使用 Powershell 来完成相同的任务:

            powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
            

            【讨论】:

            • 不幸的是,PowerShell 臃肿而缓慢。 :-\ 当公司试图强迫用户“升级”到他们最新的垃圾时,我讨厌它。 ?
            【解决方案9】:

            使用这个:

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

            【讨论】:

            • 您能否为这些标志添加一个简短的解释?这将使这个答案更加有价值。谢谢。
            • 这已经在accepted answer 中提到了。
            【解决方案10】:

            删除所有文件和子目录

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

            【讨论】:

            • 您的答案似乎与其他答案重复(有些是 10 岁)。我看不到更多或更好的解释或任何其他优势
            • @jeb,实际上不是。它略有不同,而这种细微的差异是至关重要的,并使其更加出色。 ??
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-22
            • 2011-05-07
            • 2012-04-24
            • 2019-12-03
            • 2010-09-17
            相关资源
            最近更新 更多