首页 文章

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

提问于
浏览
252

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

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

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

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

15 回答

  • 0

    我使用Powershell

    Remove-Item c:\scripts\* -recurse
    

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

  • 45

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

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

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

  • 33

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

    RMDIR "FOLDERNAME" /S /Q
    

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

  • 285

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

    RD /S /Q folderPath
    

    然后再次创建此目录:

    MD folderPath
    
  • 77

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

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

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

  • -9
    CD [Your_Folder]
    RMDIR /S /Q .
    

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

    Update

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

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

    来自Windows Command-Line Reference

    / S:删除目录树(指定目录及其所有子目录,包括所有文件) . / Q:指定安静模式 . 删除目录树时不提示确认 . (注意/ q仅在指定了/ s时有效 . )

  • 23

    RD代表REMOVE目录 .

    / S:除文件夹本身外,还删除所有文件和子文件夹 . 使用此选项可删除整个文件夹树 .

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

    示例:

    RD /S /Q C:/folder_path/here
    
  • 4

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

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

    选择另存为,文件名:

    delete_temp.bat

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

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

  • 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"
    
  • 0

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


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

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

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

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

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

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

    系统找不到指定的路径 .

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

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

    带有选项 /Q/S 的命令 RD 将删除所有 subdirectories 的目录 quietly ,即使指定的目录包含具有隐藏属性或具有只读属性集的文件或文件夹也是如此 . 系统属性永远不会阻止删除文件或文件夹 .

    没有删除是:

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

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

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

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

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

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

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

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

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

    Note: POPD 可以静默无法恢复初始当前目录,以防初始当前目录是要清理的目录的子目录,不再存在 . 在这种特殊情况下, %PathToFolder% 仍然是当前目录 . 因此建议不要在 %PathToFolder% 的子目录中运行上面的命令行 .

    One more interesting fact:
    我还使用UNC路径尝试命令行,共享本地目录 C:\Temp ,共享名称 Temp ,并在Windows 7上使用分配给环境变量 PathToFolder 的UNC路径 \\%COMPUTERNAME%\Temp\CleanTest . 如果运行命令行的当前目录是访问的共享本地文件夹的子目录使用UNC路径,即 C:\Temp\CleanTest\Subfolder1Subfolder1RD 删除,然后 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%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 是必要的,以处理所有文件,包括具有隐藏属性的文件 DEL 将忽略而不使用选项 /A .

    • 选项 /F 是强制删除具有只读属性集的文件所必需的 .

    • 选项 /Q 是运行安静删除多个文件而不提示用户是否应该真正删除多个文件所必需的 .
      需要

    • >nul 将写入的句柄 STDOUT 的输出重定向到设备 NUL ,其中不能由于文件当前已打开或用户无权删除该文件而被删除 .
      需要

    • 2>nul 将每个无法从句柄 STDERR 删除的文件的错误消息输出重定向到设备 NUL .

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

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

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

    必须使用 FOR 命令行上的插入符 ^ 转义重定向操作符 > ,以便在执行命令 FOR (在后台启动的单独命令进程中执行命令 FOR )之前,Windows命令解释程序处理此命令行时将其解释为文字字符 .

    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 /?

  • 3
    @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
    
  • 6

    我尝试了其中几种方法,但都没有正常工作 .
    我在网站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的规定工作 .

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

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

相关问题