如何在Windows下通过命令行删除指定目录下的文件/子文件夹

例如,有一个名为%pathtofolder%的变量,因为它清楚地表明它是文件夹的完整路径。

我想删除这个目录中的每一个文件和子文件夹,但不是目录本身。

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

这有什么命令吗?

1194901 次浏览

使用:

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

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

你可以使用这个shell脚本来清理C:\Temp 中的文件夹和文件:

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

创建包含上述命令的批处理文件(例如delete.bat)。进入delete.bat文件所在位置,执行delete.bat命令

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

RMDIR "FOLDERNAME" /S /Q

这将无声地删除文件夹以及所有文件和子文件夹。

我能想到的最简单的解决方案是删除整个目录

RD /S /Q folderPath

然后重新创建这个目录:

MD folderPath

您可以使用以下命令删除所有内容和父文件夹本身:

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

这将删除文件夹和文件,并留下文件夹。

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
@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

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

CD [Your_Folder]
RMDIR /S /Q .

您将得到一条错误消息,告诉您RMDIR命令不能访问当前文件夹,因此不能删除它。

更新:

有用的注释(感谢莫里茨两)中,你可以在中间添加&&,因此如果CD命令失败(例如输入错误的目录名),RMDIR将不会运行:

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

Windows命令行参考:

/ S:删除目录树(指定目录及其所有目录

.子目录,包括所有文件)

/问:静默模式。何时不提示确认 删除目录树。(注意,只有当/s为时/q才有效 指定。)< / p >

RD代表删除目录。

/S:删除所有文件和子文件夹 除了文件夹本身之外。 使用此命令删除整个文件夹树

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

例子:

RD /S /Q C:/folder_path/here

删除文件:

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"

我使用Powershell

Remove-Item c:\scripts\* -recurse

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

@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

使用记事本创建一个文本文档并复制/粘贴:

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

选择另存为和文件名:

delete_temp.bat

另存为类型:所有文件并单击保存按钮。

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

在这个例子中我使用了一个临时变量,但是你也可以使用其他变量!PS:仅适用于Windows操作系统!

我尝试了其中几种方法,但没有一种能正常工作。

我在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指定的那样工作。

在2018-06-01,< a href = " https://stackoverflow.com/a/17097668/3074564 " > foxidrive < / >发布的单个命令行的除了例外中,没有一个答案真正删除了%PathToFolder%中的所有文件和所有文件夹/目录。这就是为什么用一个非常简单的命令行发布了一个答案来删除文件夹的所有文件和子文件夹,以及一个批处理文件,其中有一个更复杂的解决方案,解释了为什么在2018-06-01发布的所有其他答案都使用理查德·道金斯未能完全清理文件夹。


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

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

该命令行包含三个依次执行的命令。

第一个命令PUSHD将当前目录路径压入堆栈,next使%PathToFolder%成为运行命令进程的当前目录。

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

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

系统无法找到指定的路径。

通过使用2>nul将该错误消息重定向到设备,可以抑制该错误消息。

下一个命令理查德·道金斯只有在当前命令进程的当前目录更改到指定目录成功时才会执行,即指定的目录根本就存在。

带有选项/Q/S的命令理查德·道金斯删除包含所有子目录的目录安静地,即使指定的目录包含具有隐藏属性或设置了只读属性的文件或文件夹。system属性永远不会阻止删除文件或文件夹。

未删除的有:

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

  2. 任何正在运行的进程当前打开的文件,文件访问权限设置在file open上,以防止正在运行的应用程序/进程打开文件时删除文件。这样打开的文件也防止删除整个文件夹树到打开的文件。

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

不删除文件夹的第一个原因是该命令行用于删除指定文件夹的所有文件和子文件夹,而不是文件夹本身。该文件夹被临时设置为运行命令进程的当前目录,以防止删除文件夹本身。当然,这将导致命令理查德·道金斯输出错误消息:

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

文件在这里是错误的术语,因为实际上该文件夹正在被另一个进程使用,当前命令进程执行命令理查德·道金斯。实际上,文件夹是文件系统的一个特殊文件,其文件属性为目录,它解释了这个错误消息。但是我不想深入讨论文件系统管理。

这个错误消息,像所有其他错误消息一样,可能因为上面写的三个原因而发生,通过使用2>nul将它从句柄STDERR重定向到设备来抑制。

第三个命令POPD的执行独立于命令理查德·道金斯的退出值。

POPD从堆栈中弹出PUSHD压入的目录路径,并将运行命令进程的当前目录更改为该目录,即恢复初始的当前目录。如果是UNC文件夹路径,POPD删除由PUSHD创建的临时盘符。

注意: POPD可以无声地无法恢复初始当前目录,如果初始当前目录是要清理的目录的子目录,而该目录已经不存在了。在这种特殊情况下,%PathToFolder%仍然是当前目录。因此,最好不要从%PathToFolder%的子目录运行上面的命令行。

还有一个有趣的事实: 在Windows 7上,我尝试使用UNC路径共享本地目录C:\Temp和共享名称Temp,并使用UNC路径\\%COMPUTERNAME%\Temp\CleanTest分配给环境变量PathToFolder。如果运行命令行的当前目录是通过UNC路径访问的共享本地文件夹的子目录,即C:\Temp\CleanTest\Subfolder1,则Subfolder1将被理查德·道金斯删除,并且接下来Temp0将再次无声地使C:\Temp\CleanTest\Subfolder1成为当前目录,导致Z:\CleanTest仍然作为正在运行的命令进程的当前目录。所以在这种非常非常特殊的情况下,临时驱动器号会一直存在,直到当前目录被改变,例如cd /D %SystemRoot%变成一个真正存在的本地目录。不幸的是,如果Temp0无法恢复初始当前目录,则它不会以大于0的值退出,因此仅使用Temp0的退出代码就无法检测到这种非常特殊的错误条件。然而,可以假设没有人遇到过这种非常特殊的错误情况,因为UNC路径通常不用于访问本地文件和文件夹

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

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

单行多命令使用Windows批处理文件解释了这里使用的操作符&&&


接下来让我们看看批处理文件解决方案,使用命令删除%PathToFolder%中的文件,理查德·道金斯删除%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 Did the folder path consist 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 Did the folder path consist 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

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

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

命令理查德·道金斯用于删除指定目录下的所有子目录。但是没有使用for /D,因为在这种情况下,将忽略带有隐藏属性集的子目录。因此,for /F被用于在一个单独的命令进程中运行以下命令行,该进程由%ComSpec% /c在后台启动:

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

DIR以裸格式输出,因为/B包含属性D的目录条目,即指定目录中所有子目录的名称独立于其他属性,如没有路径的隐藏属性。2>nul用于在句柄STDERR中没有找到目录的情况下,通过DIR将错误消息输出重定向到设备

命令行上,重定向操作符>必须用插入字符^转义,以便在Windows命令解释器在执行命令之前处理该命令行时解释为文字字符,该命令在后台启动的单独命令进程中执行嵌入的dir命令行。

处理为处理已启动命令进程的STDOUT而编写的捕获输出,这些输出是没有路径的子目录的名称,并且从不包含在双引号中。

带有选项/F会忽略这里没有的空行,因为带有选项/BDIR不会输出空行。

也会忽略以分号开头的行,分号是默认的行尾字符。目录名可以以分号开头。因此,eol=|用于将竖条字符定义为任何目录或文件的名称中都不能包含的行结束字符。

将使用空格和水平制表符作为分隔符将行分割为子字符串,并仅将第一个空格/制表符分隔的字符串分配给指定的循环变量I。这里不需要这种分隔行为,因为目录名可以包含一个或多个空格。因此,delims=被用来定义一个空的分隔符列表来禁用行分割行为,并被分配给循环变量I,始终是完整的目录名。

命令为每个没有路径的目录名运行命令理查德·道金斯,这就是为什么在理查德·道金斯命令行上必须再次指定文件夹路径,它与子文件夹名称连接。

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

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

我有以下对我有效的解决方案:

for /R /D %A in (*node_modules*) do rmdir "%A" /S /Q

它从当前目录及其子文件夹中删除所有节点模块文件夹。

这与上面发布的解决方案类似,但我仍然在这里发布这个,以防有人发现它有用