如何在Windows中的命令提示符下删除特定目录中的文件/子文件夹


308

假设有一个名为的变量%pathtofolder%,因为它很清楚它是文件夹的完整路径。

我要删除此目录中的每个文件和子文件夹,但不删除目录本身。

但是,可能会出现类似“此文件/文件夹已在使用中”的错误...当发生这种情况时,它应该继续并跳过该文件/文件夹。

有一些命令吗?


可能重复发生
Rosberg Linhares

Windows多么难以删除文件夹...或使以点开头的文件夹如此疯狂...感谢上帝在Windows中集成Bash!rm -rf path\to\folder可以在Windows 10中运行(或者可能来自Git Bash ...如果您不愿意尝试,可以以任何一种方式使用!)
Stijn de Witt

Answers:


256

您可以使用以下shell脚本来清​​理C:\Temp source中的文件夹和文件:

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

创建包含上述命令的批处理文件(例如delete.bat)。转到delete.bat文件所在的位置,然后运行命令:delete.bat


20
我试过了,但是不幸的是文件没有删除,只有子文件夹被删除了。例如,我有一个名为Test的文件夹。它包含两个名为“ Ripon”和“ Wasim”的文件夹,并且包含一个名为“ riponalwasim.txt”的文件。Ripon和Wasim子文件夹已删除,但riponalwasim.txt未删除。
Ripon Al Wasim

16
如果您希望直接从命令行运行,请使用单个百分号,例如%p
Alex

2
遗憾的是,这需要2行,但至少行得通!我已经厌倦了寻找一个可行的“单线”,并且会喜欢这个,谢谢!
nightcoder '17

2
您可以使用'&&'运算符在没有bat文件的情况下在一行中执行两个命令(请注意,单个'%'代替了'%%')。del / s / q“ myfolder *” && FOR / D%p IN(“ myfolder *”)DO rmdir“%p” / s / q
ravinsp

<对于/ F“ delims =” %% i in('dir / b / a-d')做(echo del“ %% i” / q)>可以帮助查找文件(只需删除该回显)
grenix

340

rmdir 是我一直以来最喜欢的工作命令。它适用于删除带有子文件夹的大文件和文件夹。没有创建备份,因此在运行此命令之前,请确保已安全地复制了文件。

RMDIR "FOLDERNAME" /S /Q

这将以静默方式删除该文件夹以及所有文件和子文件夹。


65
这似乎删除了OP希望保留的路径。
Fuzz Evans 2012年

4
这将删除文件夹本身,因此您需要添加另一个命令:(md FOLDERNAME请参见下面@rakoczyn的答案)。
thdoan

4
您在这里所说的“创建备份”是什么意思?我看不到会产生任何备份的任何东西……
Paul Groke

1
目录不为空消息作为响应来了!
Jamshaid Kamran

10
为了不删除文件夹本身,请先使其成为当前目录,然后使用“。”。作为FOLDERNAME。之后重新创建它并不一定相同,因为可能会丢失ACL。 cd "FOLDERNAME" RD . /S /Q
莫里茨都

85

我能想到的最简单的解决方案是使用以下命令删除整个目录

RD /S /Q folderPath

然后再次创建此目录:

MD folderPath

5
如果您有权删除但不能创建新文件夹怎么办?我希望它有可能:)
桑迪

13
这是一个不好的解决方案,因为它在目录系统的文件系统上引入了争用,即第二个命令如果在此之后立即执行,则可能会失败。
RokStrniša13年

22
此外,不好解决,如果该目录具有特殊权限,你只是核爆啊哈(哎呦)
不朽的蓝

不要推迟响应:“目录不为空。”,只需两次发出命令即可:-)
Kieran Ryan

1
RD和RMDIR是相同的命令,既然您在有人说出相同答案的9个月后发布了此答案,为什么人们会给您分数?
切换

51

这将删除文件夹和文件,并将文件夹留在后面。

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)

4
对于不确定这种方法的任何人:它绝对不会重新创建目录。没有2>nul,它将输出“该进程无法访问该文件,因为该文件正在被另一个进程使用。”
RokStrniša13年

6
我讨厌Windows无法删除某些程序正在使用的文件和文件夹。我爱您在此单行代码中使用了它以对您有利。
andref 2014年

因此,这种神奇的方式是我们如何在Windows中清空文件夹?令人印象深刻的:)
mlvljr

3
@mlvljr仅当您也想保留父文件夹时。 RD /?将向您展示清空文件夹的简单方法。
foxidrive 2015年

1
如果您需要返回起始位置,这很好,否则CD mypath && RD /S .就足够了。我不喜欢您必须重复两次路径,因为长路径变得很难阅读。所以我只是set p="mypath"在开头添加一个。
阿米特·奈杜

39
@ECHO OFF

SET THEDIR=path-to-folder

Echo Deleting all files from %THEDIR%
DEL "%THEDIR%\*" /F /Q /A

Echo Deleting all folders from %THEDIR%
FOR /F "eol=| delims=" %%I in ('dir "%THEDIR%\*" /AD /B 2^>nul') do rd /Q /S "%THEDIR%\%%I"
@ECHO Folder deleted.

EXIT

...删除给定目录下的所有文件和文件夹,但不删除目录本身。


4
这应该是正确的答案..只需简单一点即可.. deletemyfoldercontents.bat文件..在您的路径中弹出,它就像一种魅力..
timbrown 2015年

3
DEL命令行选项失误/A也删除与隐藏属性的文件集,并%dir%\*应包含在双引号一样"%dir%\*"工作也含有空格或以下字符中的一个目录&()[]{}^=;!'+,`~。而FOR命令行应该进行修改,以for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I"FOR具有隐藏属性集忽略目录。带选项的DIR/AD /B输出其名称的所有目录。顺便说一句:dir不是环境变量的好名字。
Mofi

1
不会删除子文件夹
RMiranda

1
@RMiranda,在我的测试中,它的操作完全符合OP的要求。您是否存在不删除子文件夹的情况?
thepip3r

此答案是否满足要求“可能存在类似'此文件/文件夹已在使用中的错误'...当发生这种情况时,它应该继续并跳过该文件/文件夹”。
彼得·莫滕森

30
CD [Your_Folder]
RMDIR /S /Q .

您将收到一条错误消息,告诉您RMDIR命令无法访问当前文件夹,因此无法将其删除。

更新

通过有用的注释(感谢Moritz Both),您可以在&&两者之间添加,因此,RMDIR如果CD命令失败(例如,错误键入的目录名),则不会运行:

CD [Your_Folder] && RMDIR /S /Q .

Windows命令行参考

/ S:删除目录树(指定的目录及其所有子目录,包括所有文件)。

/ Q:指定安静模式。删除目录树时不提示确认。(请注意,/ q仅在指定/ s时有效。)


1
这非常适合清空温度,但这cd [Your_Folder]非常关键-我必须记住这一点,因此我不删除目录本身...
sage 2015年

5
这是正确的解决方案。&&在命令之间添加而不是换行符,这样可以防止CD出现故障。
莫里茨都

这是一个简单而正确的解决方案。甚至可以与Azure命令外壳一起使用!
菲利普(Philippe)

相当糟糕的解决方案...例如,对于svn更新,我需要删除此命令行-我想在进行更新svn之前删除所有文件和文件夹,因为在使用此功能的机器上可能会有一些更改,但是相关仅是已签入的项目。正在执行RMDIR / S / Q。也会删除SVN链接,因此使该文件夹不再是svn文件夹
Dominik Lemberger

这与前四个答案有何不同?
彼得·莫滕森

9

RD代表REMOVE Directory。

/ S:删除文件夹本身之外的所有文件和子文件夹。使用它删除整个文件夹树。

/ Q:安静-不显示YN确认

范例:

RD /S /Q C:/folder_path/here

1
因是唯一可以解释其含义/S/Q含义的人而受到赞扬
SourceVisor

2
No. rd等效于rmdir并将删除目录本身,而不是OP想要的。
WesternGun

这个答案是否满足要求“可能存在类似'此文件/文件夹已在使用中的错误'...当发生这种情况时,它应该继续并跳过该文件/文件夹”的要求?例如,它会完全中止而不是继续吗?
彼得·莫滕森

8

我使用Powershell

Remove-Item c:\scripts\* -recurse

它将删除文件夹的内容,而不是文件夹本身。


Rhellem的答案是最近的,但这是唯一对我真正有用的答案。(赢得8.1,并非
philologon

2
从批处理命令行:powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
Rosberg Linhares

请注意,“ *”是必需的,否则它将删除该文件夹。
mhenry1384

7

无张贴于2018年6月1日,答案的不同之处张贴的单个命令行的foxidrive,真正删除所有文件和所有文件夹/目录在%PathToFolder%。这就是使用一个非常简单的单个命令行发布一个答案以删除文件夹的所有文件和子文件夹以及具有更复杂解决方案的批处理文件的原因,解释了为什么所有其他答案都使用DEL于2018-06-01发布和FOR with RD无法完全清理文件夹。


简单的单命令行解决方案,当然也可以在批处理文件中使用:

pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )

该命令行包含三个命令,一个接一个执行。

第一个命令PUSHD将当前目录路径压入堆栈,然后将当前目录移入%PathToFolder%当前目录以运行命令进程。

默认情况下,这也适用于UNC路径,因为默认情况下启用了命令扩展名,在这种情况下,PUSHD创建一个指向该指定网络资源的临时驱动器号,然后使用新定义的驱动器号更改当前驱动器和目录。

如果指定的目录根本不存在,则PUSHD输出以下错误消息来处理STDERR

该系统找不到指定的路径。

通过将其重定向2>nul到设备NUL可以抑制此错误消息。

仅当成功将当前命令处理的当前目录更改为指定目录时,即完全存在指定目录时,才执行下一条命令RD

该命令RD与选择/Q/S删除一个目录悄悄所有子目录即使指定的目录中,有隐藏属性或具有只读属性设置的文件或文件夹。系统属性从不阻止删除文件或文件夹。

未删除的有:

  1. 用作任何正在运行的进程的当前目录的文件夹。如果将某个文件夹用作任何正在运行的进程的当前目录,则无法删除该文件夹的整个文件夹树。

  2. 当前正在由任何正在运行的进程打开的文件,并在文件打开时设置了文件访问权限,以防止在正在运行的应用程序/进程打开文件时删除文件。这种打开的文件还防止整个文件夹树被删除。

  3. 当前用户没有删除文件/文件夹所需的(NTFS)权限的文件/文件夹,这也阻止了对此文件/文件夹的文件夹树的删除。

不删除文件夹的第一个原因是此命令行用于删除指定文件夹的所有文件和子文件夹,而不是文件夹本身。暂时将文件夹作为运行命令过程的当前目录,以防止删除文件夹本身。当然,这将导致通过命令RD输出错误消息:

该进程无法访问该文件,因为该文件正在被另一个进程使用。

文件在这里是错误的术语,因为实际上文件夹正在被另一个进程(执行命令RD的当前命令进程)使用。好吧,实际上,文件夹是文件系统的一个特殊文件,带有文件属性目录,该目录解释了此错误消息。但是我不想太深入地研究文件系统。

与上述所有其他错误消息一样,由于上述三个原因而可能发生的错误消息,可以通过将其2>nul从句柄STDERR重定向到设备NUL来抑制。

第三个命令POPD与命令RD的退出值无关地执行。

POPD从堆栈中弹出由PUSHD推送的目录路径,并将用于运行命令进程的当前目录更改为该目录,即恢复初始的当前目录。对于UNC文件夹路径,POPD删除由PUSHD创建的临时驱动器号。

注意: 如果初始当前目录是要清除的目录的子目录,则POPD可能会默默地无法还原初始当前目录。在这种特殊情况下,将%PathToFolder%保留当前目录。因此,建议不要从的子目录运行上面的命令行%PathToFolder%

一个更有趣的事实: 通过共享C:\Temp具有共享名的本地目录Temp并使用Windows 7上\\%COMPUTERNAME%\Temp\CleanTest分配给环境变量的UNC路径,我也尝试了使用UNC路径的命令行PathToFolder。如果运行命令行的当前目录是共享本地目录的子目录使用UNC路径访问的文件夹(即C:\Temp\CleanTest\Subfolder1Subfolder1RD删除),并且下一个POPD静默失败,无法C:\Temp\CleanTest\Subfolder1再次创建当前目录,导致Z:\CleanTest仍保留为正在运行的命令进程的当前目录。因此,在这种非常特殊的情况下,临时驱动器号会保留到更改当前目录为止,例如使用cd /D %SystemRoot%到真正存在的本地目录。不幸的是,如果POPD无法还原初始当前目录,则POPD不会以大于0的值退出,从而仅使用POPD的退出代码就无法检测到这种非常特殊的错误情况。但是,可以假定没有人遇到这种非常特殊的错误情况,因为通常不使用UNC路径来访问本地文件和文件夹。

为了更好地理解所使用的命令,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的帮助。

  • pushd /?
  • popd /?
  • rd /?

使用Windows批处理文件的单行多命令解释了这些运算符&&&在此处使用。


接下来,让我们看一下批处理文件解决方案,使用命令DEL删除中的文件%PathToFolder%,使用FORRD删除中的子文件夹%PathToFolder%

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"

rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"

rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder

rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"

rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder

rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul

rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

:EndCleanFolder
endlocal

批处理文件首先确保环境变量PathToFolder确实是使用文件夹路径定义的,该文件夹路径没有双引号,并且末尾没有反斜杠。最后的反斜杠不是问题,但是文件夹路径中的双引号可能会出现问题,因为PathToFolder批处理文件执行期间的值与其他字符串连接在一起。

重要的是以下两行:

del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

命令DEL用于删除指定目录中的所有文件。

  • 该选项/A对于处理实际上所有文件都是必需的,包括具有隐藏属性的文件,如果不使用option ,DEL将忽略该属性/A
  • 该选项/F对于强制删除设置了只读属性的文件是必需的。
  • 该选项 /Q对于运行多个文件的安静删除而不需要提示用户是否确实要删除多个文件是必需的。
  • >nul必须将写为处理STDOUT的文件名的输出重定向到设备NUL,该设备的NUL由于当前正在打开文件或用户无权删除该文件而无法删除。
  • 2>nul必须将无法从句柄STDERR删除的每个文件的错误消息输出重定向到设备NUL

命令FORRD用于删除指定目录中的所有子目录。但是for /D由于FOR在这种情况下忽略了具有隐藏属性集的子目录,因此未使用。因此,for /F用于在后台启动的单独命令进程中运行以下命令行%ComSpec% /c

dir "%PathToFolder%\*" /AD /B 2>nul

DIR以空格式输出,因为/B目录条目具有attribute D,即指定目录中所有子目录的名称都独立于其他属性,例如无路径的hidden属性。2>nul用于将在找不到目录的DIR中DIR输出的错误消息从句柄STDERR重定向到设备NUL

重定向操作>必须以脱字符转义,^,在FOR命令行被解释为当Windows命令解释器在执行命令之前处理该命令行文字字符FOR其执行嵌入dir在一个单独的命令处理命令行启动在后台。

FOR处理捕获的输出,这些输出被写入以处理已启动命令过程的STDOUT,这是没有路径且从不用双引号引起来的子目录的名称。

带选项的FOR会/F忽略此处不会出现的空行,因为带选项的DIR/B不会输出空行。

FOR还将忽略以分号开头的行,分号是默认的行尾字符。目录名称可以以分号开头。因此,eol=|用于将竖线字符定义为行尾字符,名称或目录或文件均不能包含该字符。

FOR将使用空格和水平制表符作为分隔符将行拆分为子字符串,并且仅将第一个用空格/制表符分隔的字符串分配给指定的循环变量I。由于目录名可以包含一个或多个空格,因此在此不需要拆分行为。因此delims=,用于定义一个空的定界符列表以禁用行拆分行为并分配给循环变量I(始终为完整目录名)。

命令FOR为每个目录名称运行命令RD而没有路径,这就是为什么在RD命令行中必须再次指定文件夹路径(与子文件夹名称连接)的原因。

为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?

5

使用记事本创建文本文档,然后将其复制/粘贴:

rmdir /s/q "%temp%"
mkdir "%temp%"

选择另存为和文件名:

delete_temp.bat

保存类型:所有文件,然后单击Save按钮。

它适用于任何类型的帐户(管理员或标准用户)。只是运行它!

在此示例中,我使用了一个临时变量,但您也可以使用其他任何变量!PS:仅适用于Windows OS!


一个非常简单和干净的解决方案
Carlos Liu

4

删除文件:

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"

是的,这是正确的。必须分两个步骤。这值得更多的投票,因为与上面的投票数相比,它解释了原因。
WesternGun

DEL命令行选项失误/A也删除与隐藏属性设置和选项文件/F也删除具有只读属性集,并围绕最后一个参数双引号的文件。这样del /A /F /Q "PATH_TO_FOLDER\*"会更好。而FOR命令行应该进行修改,以for /F "eol=| delims=" %%I in ('dir "PATH_TO_FOLDER\*" /AD /B 2^>nul') do rd /Q /S "PATH_TO_FOLDER\%%I"FOR具有隐藏属性集忽略目录。带选项的DIR/AD /B输出名称中的所有目录PATH_TO_FOLDER
Mofi

这与先前的答案(某些)有何不同?
彼得·莫滕森

4

您可以通过使用以下命令删除所有内容和父文件夹本身来做到这一点:

RMDIR [/S] [/Q] [drive:]path            

这与前两个答案有何不同?
彼得·莫滕森

此答案是否满足要求“可能存在类似'此文件/文件夹已在使用中的错误'...当发生这种情况时,它应该继续并跳过该文件/文件夹”。
彼得·莫滕森

1

我尝试了其中几种方法,但均无法正常工作。

我在Windows命令行站点上发现了这种两步方法:

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

它完全按照我的需要和OP的规定工作。


这两个命令行可以组合为一个命令行:添加了forfiles /P "%pathtofolder%" /M * /C "%SystemRoot%\System32\cmd.exe /C if @isdir==FALSE (del /A /F @file) else rd /Q /S @file" DEL选项/A以删除还设置了隐藏属性的文件,否则DEL将为中的每个隐藏文件输出未找到的错误消息%pathtofolder%。添加了DEL选项/F以删除设置了只读属性的文件,%pathtofolder%否则DEL将输出拒绝访问错误消息。
Mofi

此解决方案是此处发布的所有不完整解决方案中最慢的,因为它cmd.exe为中的每个文件和每个目录启动了一个实例%pathtofolder%。优点是FORFILES不会像FOR那样忽略设置了隐藏属性的目录。
Mofi

回复“它完全按照我的需要并且由OP指定运行。” :您是否测试了需求“是否可能存在类似'此文件/文件夹已在使用中的错误'...当发生这种情况时,它应该继续并跳过该文件/文件夹”。
彼得·莫滕森

0
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q

第二行将从Windows临时目录中的所有文件夹中删除每个文件中的文件,第三行清除包括其内容在内的目录。
罗比

for /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I"由于FOR会忽略具有隐藏属性集的目录,因此应将FOR命令行修改为。带选项的DIR/AD /B输出名称中的所有目录%TEMP%
Mofi

DEL的文档。我认为您在使用/ F的正确轨道上:“忽略只读设置并始终删除(FORCE)”
Peter Mortensen19年

-10

采用:

del %pathtofolder%\*.*   /s /f  /q

这将删除中的所有文件和子文件夹%pathtofolder%,包括只读文件,并且不会提示您进行确认。


9
对不起,这在%pathtofolder%中留下了空的子文件夹。
DH

35
它不会删除%pathtofolder%中的子文件夹。太糟糕了,我没有声誉可以否决这个错误的答案
Vitalii Korsakov

1
正如Vitalii Korsakov指出的那样,这会删除子目录中的所有文件和文件,但是将子目录保留在OP询问如何删除的位置。
Fuzz Evans 2012年

6
尽管此命令的确保留了空文件夹,但它与请求的内容相比更接近所接受的答案。当然,这取决于情况。就我而言,我宁愿有空文件夹,而不是留在根目录中的文件。
MarcusUA 2013年

但是当其他客户端计算机打开对该文件夹具有写访问权的共享驱动器时,我们如何删除在网络共享中打开的文件夹和子文件夹。psfile and net files命令将关闭文件会话,但几秒钟后它将再次创建自动为该用户在服务器中的另一个会话...
user1954762
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.