如何通过cmd命令删除文件夹中的所有文件和文件夹

105

我使用的是Windows操作系统。

我希望通过系统调用删除文件夹中的所有文件和文件夹。

我可能这样调用:

>rd /s /q c:\destination
>md c:\destination

您知道更简单的方法吗?


1
http://superuser.com/questions/173859/how-can-i-delete-all-files-subfolders-in-a-given-folder-via-the-command-prompt - NoWar
可能是What ever happened to deltree, and what's its replacement?的重复问题。 - Rosberg Linhares
12个回答

159

不,我不知道。

如果你因为某些原因(比如ACL等)想要保留原始目录,并且真的想要清空它,那么可以执行以下操作:

del /q destination\*
for /d %x in (destination\*) do @rd /s /q "%x"

这首先从目录中删除所有文件,然后递归地删除所有嵌套的目录,但总体上保留顶层目录不变(除了其内容)。

请注意,在批处理文件中,需要在 for 循环内部将 % 双倍化:

del /q destination\*
for /d %%x in (destination\*) do @rd /s /q "%%x"

3
我能够不使用批处理文件完成这个操作。使用"&&"来连接这两个操作。 - Matt Broekhuis
1
我是一个完全的Windows Shell新手:如何使用这个例子将目标设置为路径? - low_rents
6
这个答案让我感到难过,因为它是最好的答案。 - KCD
@stenci: rdrmdir删除目录。第一行从目录中删除所有(顶级)文件以清空。第二行将从目录中递归删除所有目录。请注意,rd不会删除文件(除非在要删除的目录下),而for /d也只会明确地迭代目录。我实际上认为我的答案足够清晰和简单,但显然不是。 - Joey
1
@stenci:第二行只能删除给定的目录。它确实以递归方式执行,但它无法删除文件。因此,要删除目录中的所有内容,您必须删除所有文件和所有目录。请注意,这不是关于删除单个目录及其中所有内容。它是关于删除其中所有内容并保留父目录。 - Joey
显示剩余7条评论

43

del c:\destination\*.* /s /q 对我有效。希望对你也有用。


15
删除所有文件,但不删除文件夹。 - Eric Rini
2
我的解决方法是导航到文件夹。(按住Shift右键,选择“在此处打开命令提示符”),然后输入del *.* - Daniel L. VanDenBosch
示例相对路径 del "../../server/front-end\*.*" - FindOutIslamNow
@DanielL.VanDenBosch,这不太适合脚本化。 - Synetech
使用 *.* 掩码将跳过没有扩展名的文件,例如 makefile。必须使用掩码 * - Kuznetsov-M

35

我认为最简单的方法是:

rmdir /s /q "C:\FolderToDelete\"

路径中的最后一个“”是重要的部分。

这将删除文件夹本身。如果要保留,请在脚本中添加mkdir "C:\FolderToDelete\"


31
这也会删除文件夹本身。 - Archie
完美,这正是我需要的 :) - gNerb
这个是否递归工作,路径太长了吗? - eomeroff
这似乎是最佳答案,因为它可以递归删除文件夹和文件。 - sunil
3
将这个和 mkdir C:\FolderToNotToDelete 结合起来就足够了 :) - qbolec
3
如果您删除的父文件夹具有一些重要权限,那么这可能会带来问题,因为现在您需要重新创建这些权限。 - Mladen B.

18

是的!使用 Powershell:

powershell -Command "Remove-Item 'c:\destination\*' -Recurse -Force"

14

如果子文件夹名称可能包含空格,您需要用转义引号将它们括起来。以下示例显示了批处理文件中使用命令的情况。

set targetdir=c:\example
del /q %targetdir%\*
for /d %%x in (%targetdir%\*) do @rd /s /q ^"%%x^"

8

删除文件:

del PATH_TO_FILE

删除包含所有文件的文件夹:

rmdir /s /q PATH_TO_FOLDER

删除特定文件夹中的所有文件(不删除文件夹本身)有点复杂。del /s *.*不能删除文件夹,但会从所有子文件夹中删除文件。因此需要两个命令:

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"

你可以创建一个脚本来删除任何你想要的东西(文件夹或文件),就像这样 mydel.bat:
@echo off
setlocal enableextensions

if "%~1"=="" (
    echo Usage: %0 path
    exit /b 1
)

:: check whether it is folder or file
set ISDIR=0
set ATTR=%~a1
set DIRATTR=%ATTR:~0,1%
if /i "%DIRATTR%"=="d" set ISDIR=1

:: Delete folder or file
if %ISDIR%==1 (rmdir /s /q "%~1") else (del "%~1")
exit /b %ERRORLEVEL%

几个使用示例:

mydel.bat "path\to\folder with spaces"
mydel.bat path\to\file_or_folder

1
一个简单的一行选项是在您的文件系统中创建一个空目录,然后使用 ROBOCOPY (http://technet.microsoft.com/en-us/library/cc733145.aspx) 和 /MIR 开关来删除所有文件和子文件夹。默认情况下,robocopy 不复制安全性,因此您根目录中的 ACL 应该保持不变。
还可能需要为重试开关 /r 设置一个值,因为默认重试次数是 100 万次。
robocopy "C:\DoNotDelete_UsedByScripts\EmptyFolder" "c:\temp\MyDirectoryToEmpty" /MIR /r:3

0

只需两个简单步骤。[/q表示静默,/f表示强制,/s表示子目录]

  1. 清空目录以删除

    del *.* /f/s/q  
    
  2. 删除目录

    cd ..
    rmdir dir_name /q/s
    

See picture


如果您只想删除目录中的内容而不是整个目录,该怎么办? - Urasquirrel

0

1
如果你使用 pushd,你也必须使用 popd。不幸的是,当你删除目录时,popd 不起作用。因此,你必须使用 cd 而不是 pushd - xmedeko

0

我有一个索引文件夹,其中包含33个文件夹,需要将其中的所有文件和子文件夹删除。我在索引文件夹中打开了一个命令行,然后使用了以下命令:

for /d in (*) do rd /s /q "%a" & (
md "%a")

我将它们分成两行(在第一行后按回车键,当要求添加第二行时再添加),因为如果在单行中输入可能无法正常工作。此命令将擦除每个目录,然后创建一个新的空目录,从而删除原始目录中的所有文件和子文件夹。


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