删除目录中的所有文件和文件夹

165

我想要一个批处理文件,可以删除我的无线工具包缓存文件夹中的所有文件和文件夹。

目前我有以下代码:

cd "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS"
del *.db

这将删除我RMS目录中所有的.db文件,但是我想要删除该目录中的每一件事。我该怎么做?


4
在提示符下输入 del /?。它会告诉你如何使用这个工具。对于这个情况,del *.* /s 可以起作用,但别在错误的目录下执行! - Michael Todd
41
请确认您要执行以下命令:在Windows系统中删除目录 c:\users\tbrollo\j2mewtk\2.5.2\appdb\RMS,包括所有子目录和文件。命令为 rmdir /s /q c:\users\tbrollo\j2mewtk\2.5.2\appdb\RMS - forsvarir
1
根据投票结果,我建议更改正确答案。 - GregM
9
forsvarir的回答同时也删除了RMS目录,这可能不是原本想要的结果。(实际上,我经常不希望这样做,因为这样会损失目录的原始时间戳和权限)。请看我的回答,了解如何删除目录中的所有内容但保留目录本身。 - Bill_Stewart
17个回答

186

用法:

  • 创建一个批处理文件

  • 将以下文本复制到批处理文件中

  • set folder="C:\test"
    cd /d %folder%
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
    

这将删除所有文件文件夹。


4
太棒了,我正在寻找一种可以在每月批处理作业中清理文件和文件夹的方法,而这个工具正好派上了用场。 - Dave Harding
12
在执行此操作之前,请确保目录已存在。 - Bill_Stewart
2
如果您的文件名中有“特殊”字符,请先执行chcp 10000以将编码更改为UTF-16。 - Demelziraptor
8
只想在Bill_Stewart的评论中添加一条注释。你需要确保目录存在的原因是,否则它将清除您当前所在的任何目录。在我的情况下,这是我已经工作了30多分钟的批处理文件。:( 幸好其他文件夹都在源代码控制下。 - helios456
7
请把循环改为(rmdir "%%i" /s/q 2>NUL || del "%%i" /s/q >NUL ),以抑制错误和删除消息。 - Carl Walsh
显示剩余6条评论

54

del *.* 而不是 del *.db。这将删除所有文件。


65
注意:如果你想要跳过“确定要删除...”的提示,你需要添加/F Q参数:del . /F /Q - Rhyuk
50
这只会删除文件,而不会删除文件夹。 - icc97
64
这个回答不应被标记为正确答案,因为它没有删除文件夹(正如问题所述)。 - Bill_Stewart

40
IF EXIST "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS" (
    rmdir "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS" /s /q
)

这将从文件夹中删除所有内容(包括文件夹本身)。


19
我认为这个问题是关于清空目录所有内容但不删除该目录本身的。 - Bill_Stewart

17

del *.* 只会删除文件,而不会删除子目录。如果想要彻底清空目录中的内容,可以使用以下脚本:

rmdir /s /q foldername

其中foldername为需要删除的目录名字。

@echo off
setlocal enableextensions
if {%1}=={} goto :HELP
if {%1}=={/?} goto :HELP
goto :START

:HELP
echo Usage: %~n0 directory-name
echo.
echo Empties the contents of the specified directory,
echo WITHOUT CONFIRMATION. USE EXTREME CAUTION!
goto :DONE

:START
pushd %1 || goto :DONE
rd /q /s . 2> NUL
popd

:DONE
endlocal

pushd 命令会切换到你想要删除子目录的目录。然后当 rd 命令试图删除当前目录和所有子目录时,子目录的删除成功,但当前目录的删除失败 - 因为我们正在其中。这将生成一个错误,2> NUL 命令将其忽略。(2 是错误流)。


6
我稍微思考了一下这个过程是如何运作的,因此为了让其他人明白,我来解释一下:pushd 命令将进入你想要删除其子目录的目录。然后当 rd 命令要求删除当前目录和所有子目录时,子目录将被成功删除,但当前目录的删除会失败 - 因为我们还在其中。这会产生一个错误,而2> NUL 则会忽略这个错误(2 是错误输出流)。非常狡猾的 Stewart 先生! - Kinetic
如果以foo.bat jack&jill的形式执行脚本,此代码将失败。使用IF命令的最佳实践:if "%~1"=="" goto :HELP。使用文件和文件夹路径的最佳实践:PUSHD "%~1" - Squashman
实际上,您的命令将执行 foo.bat jack,然后是 jill(因为您没有引用路径)。要将其作为路径传递,您仍然需要引用它(因此不需要 "%~1")。因此,无需更改代码。 - Bill_Stewart
你忘记了一件事。如果我将一个没有空格但路径中有“&”符号的文件夹名拖放到你的批处理文件上,它不会被引用。同时,如果文件夹名称包含等号符号,你的代码将无法进行IF比较。这些都不是边缘或模糊的情况。编写批处理文件的最佳实践是始终在字符串比较和文件/文件夹路径中使用引号。 - Squashman
代码不支持从资源管理器中进行拖放操作(如果您正在使用图形用户界面,那么您也不需要此脚本)。如果您愿意,可以添加额外的代码。 - Bill_Stewart
显示剩余2条评论

16

我只是从morty346发布的内容中整理了一下:

set folder="C:\test"
IF EXIST "%folder%" (
    cd /d %folder%
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
)

它首先添加了一个快速检查,以确保变量定义的文件夹存在,然后切换到该文件夹并删除其中的内容。


3
快速提示-如果您尝试在网络路径上运行此命令,即使使用了“IF EXIST”语句,它也会失败,并且会在命令提示符中记录一条消息:“UNC 路径不支持,默认为 Windows 目录”,然后会尝试删除 Windows 目录中的所有内容。因此要小心。 - CBRF23

11
你可以使用del/S标志(告诉它递归所有子目录中的所有文件)来完成此操作:
del /S C:\Path\to\directory\*

RD 命令也可以被使用。静默地递归删除而无需提示:

@RD /S /Q %VAR_PATH%

Rmdir (rd)


7
set "DIR_TO_DELETE=your_path_to_the_folder"

IF EXIST %DIR_TO_DELETE% (
    FOR /D %%p IN ("%DIR_TO_DELETE%\*.*") DO rmdir "%%p" /S /Q
    del %DIR_TO_DELETE%\*.* /F /Q
)

4

使用

set dir="Your Folder Path Here"
rmdir /s %dir%
mkdir %dir%

这个版本会无提示进行删除:
set dir="Your Folder Here"
rmdir /s /q %dir%
mkdir %dir%

例子:

set dir="C:\foo1\foo\foo\foo3"
rmdir /s /q %dir%
mkdir %dir%

这将清空 C:\foo1\foo\foo\foo3

(我想提一下Abdullah Sabouin的回答。之前有混淆我抄袭他的帖子。我没有注意到他的回答。感谢 melpomene 指出错误!)


完全无法工作。如果 foo 不是一个空目录,则 rmdir foo 将报错。 - melpomene
@melpomene,我找到了错误,应该已经修复了!! - TravieDude Minecraft and More
1
我并不是有意模仿@Abdullah Sabouni。可能是我没有注意到,对此我很抱歉。 - TravieDude Minecraft and More
@melpomene 我已经阐述了我的错误和我的观点。但是我决定不删除,以防对任何人有所帮助。感谢您指出这一点。 - TravieDude Minecraft and More
@TravieDudeMinecraftandMore +1 - 对我也有效。 - Guy Avraham
我不建议使用这个解决方案,因为它会删除目录(从而失去其权限),然后重新创建它(可能具有不同的权限)。 - Bill_Stewart

3

你可以尝试以下方法,这对我很有效。

我有一个应用程序会将数据导出至我的"C:\tmp"文件夹,以下方法对我而言是最好的。它甚至不会询问是否删除数据,我已经制定了每5分钟运行一次的计划

cd "C:\tmp"

del *.* /Q

10
如果文件夹“C:\tmp”不存在(如果您或其他应用程序已删除该文件夹),并且您尝试运行此操作,那么它不会删除“C:\”内其他文件夹中的数据吗?(这种情况曾经发生过我) - Vikram
4
正如Vikram所指出的:1)这非常危险,2)它并没有像问题中所述的那样删除子目录。 - Bill_Stewart
3
除了文件夹的事情之外,你可以直接执行 del /q c:\tmp\*.*,这样更加安全,而且注意 cd 只会改变路径,不会改变驱动器。 - Nyerguds
1
这是糟糕的建议。正如其他人所提到的,由于此操作,您可能会清除许多重要数据。我认为应该标记为删除,因为它太糟糕了。 - RyanfaeScotland

3
更好的是,假设我想要删除 C:\windows\temp 文件夹下的所有内容。
@echo off
rd C:\windows\temp /s /q

13
这会删除目录 c:\windows\temp,我认为这不是原来问题所要求的。 - Bill_Stewart
删除目录对我来说似乎是最容易的,如果之后需要重新创建它,我可以这样做。一个问题可能是特殊文件夹权限的丢失。然而,这似乎比大多数其他答案要容易得多。 - madannes
1
遗憾的是,在Win10上,从批处理脚本中删除并立即重新创建似乎会出现随机的“访问被拒绝”错误。 - Nyerguds

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