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

时间:2009-12-27 11:45:45

标签: windows batch-file file-io cmd directory

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

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

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

任何人都可以给我一些命令吗?

15 个答案:

答案 0 :(得分:314)

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

RMDIR "FOLDERNAME" /S /Q

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

答案 1 :(得分:228)

您可以使用此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

答案 2 :(得分:81)

我能想到的最简单的解决方案是使用

删除整个目录
RD /S /Q folderPath

然后再次创建此目录:

MD folderPath

答案 3 :(得分:49)

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

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

答案 4 :(得分:35)

@ECHO OFF

Set dir=path-to-dir

Echo Deleting all files from %dir%
del %dir%\* /F /Q

Echo Deleting all folders from %dir%
for /d %%p in (%dir%\*) Do rd /Q /S "%%p"
@echo Folder deleted.


exit

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

答案 5 :(得分:24)

CD [Your_Folder]
RMDIR /S /Q .

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

<强>更新

来自this有用的评论(感谢Moritz Both),您可以在&&之间添加RMDIR,因此CD如果CD [Your_Folder] && RMDIR /S /Q . 无法运行命令失败(例如错误的目录名称):

Public Class Proto
<ProtoContract()>
Public Class TCP
    <ProtoMember(1)>
    Public Property Command As Integer

End Class
End Class

来自Windows Command-Line Reference

  

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

     

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

答案 6 :(得分:9)

RD代表REMOVE目录。

/ S:删除所有文件和子文件夹          除了文件夹本身。          使用此选项可删除整个文件夹树。

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

示例:

RD /S /Q C:/folder_path/here

答案 7 :(得分:7)

我使用Powershell

Remove-Item c:\scripts\* -recurse

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

答案 8 :(得分:4)

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

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

答案 9 :(得分:4)

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

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

选择另存为,文件名:

  

delete_temp.bat

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

在任何类型的帐户(管理员或标准用户)上工作,只需运行它! 我在这个例子中使用temp变量,但你可以使用任何其他!附:仅适用于Windows操作系统!

答案 10 :(得分:4)

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

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

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

此命令行包含一个接一个执行的三个命令。

第一个命令 PUSHD 在堆栈上推送当前目录路径,然后使%PathToFolder%成为运行命令进程的当前目录。

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

如果指定的目录根本不存在,

PUSHD 会输出以下错误消息以处理 STDERR

  

系统找不到指定的路径。

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

仅当将当前命令进程的当前目录更改为指定目录时,才会执行下一个命令 RD ,即指定的目录完全存在。

带有选项/Q/S RD 命令会删除所有子目录的目录静默,即使指定的目录包含具有隐藏属性或具有只读属性集的文件或文件夹。系统属性永远不会阻止删除文件或文件夹。

未删除的是:

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

  2. 当前正在运行的文件具有文件访问权限的正在运行的文件打开的文件,以防止在运行的应用程序/进程打开时删除文件。这样打开的文件也可以防止将整个文件夹树删除到打开的文件中。

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

  4. 此命令行使用不删除文件夹的第一个原因来删除指定文件夹的所有文件和子文件夹,但不删除文件夹本身。该文件夹暂时是运行命令进程的当前目录,可防止删除文件夹本身。当然,这会导致通过命令 RD 输出错误消息:

      

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

    文件是错误的术语,因为实际上该文件夹正被另一个进程使用,当前命令进程执行命令 RD 。好吧,在实际文件夹中,文件系统是一个带有文件属性目录的特殊文件,它解释了这个错误信息。但我不想深入到文件系统管理。

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

    第三个命令 POPD 独立于命令 RD 的退出值执行。

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

    注意: POPD 在初始当前目录是要清理的目录的子目录(不再存在)的情况下,可以静默无法恢复初始当前目录。在这种特殊情况下,%PathToFolder%仍然是当前目录。因此,建议不要在%PathToFolder%

    的子目录中运行上面的命令行

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

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

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

    Single line with multiple commands using Windows batch file解释了此处使用的运算符&&&

    接下来让我们使用命令 DEL 查看批处理文件解决方案,以删除%PathToFolder% FOR RD 中的文件删除%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是必要的,以处理所有文件,包括隐藏属性的文件, DEL 会忽略而不使用选项/A
    • 必须使用选项/F强制删除设置了只读属性的文件。
    • 选项/Q是运行安静删除多个文件而不提示用户是否应该删除多个文件所必需的。
    • >nul必须将为处理 STDOUT 而编写的文件名的输出重定向到设备 NUL ,因为它无法删除文件当前已打开,或者用户无权删除该文件。
    • 2>nul必须重定向每个文件的错误消息输出,这些文件无法从句柄 STDERR 删除到设备 NUL

    命令 FOR RD 用于删除指定目录中的所有子目录。但由于 FOR 忽略了隐藏属性集的子目录,因此未使用for /D。因此,for /F用于在后台使用cmd.exe /C启动的单独命令进程中运行以下命令行:

    dir "%PathToFolder%\*" /AD /B 2>nul
    
    由于/B具有属性D的目录条目,

    DIR 以裸格式输出,即指定目录中所有子目录的名称独立于其他属性,如隐藏属性路径。 2>nul用于将 DIR 输出的错误消息重定向到从句柄 STDERR 找不到的目录 NUL

    重定向运算符>必须使用 FOR 命令行上的符号字符^进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符 FOR ,它在后台启动的单独命令进程中执行嵌入式dir命令行。

    FOR 处理为处理启动命令进程的 STDOUT 而编写的捕获输出,它们是没有路径的子目录的名称,并且从不用双引号括起来。

    带有选项/F

    FOR 会忽略不会出现的空行,因为 DIR 且选项/B不会输出空行

    FOR 也会忽略以分号开头的行,分号是行字符的默认行。目录名称可以以分号开头。因此,eol=|用于将垂直条字符定义为行尾字符,其名称中没有目录或文件。

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

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

    要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

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

答案 11 :(得分:3)

要删除文件:

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"

答案 12 :(得分: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

答案 13 :(得分:0)

我尝试了其中几种方法,但都没有正常工作 我在网站Windows Command Line上找到了这两步法:

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的指定工作。

答案 14 :(得分:-9)

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

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