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

397

假设有一个变量叫做 %pathtofolder%,它清楚地说明了这是一个文件夹的完整路径。

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

但是,在执行删除操作时可能会出现“此文件/文件夹已在使用中”的错误...当出现这种情况时,应该继续执行并跳过该文件/文件夹。

是否有相应的命令可供使用?


可能是What ever happened to deltree, and what's its replacement?的重复问题。 - Rosberg Linhares
1
Windows 删除文件夹或者以点开头的文件夹真是太难了,简直让人发疯。不过幸好 Windows 有 Bash 集成!在 Windows 10 中可以使用 rm -rf path\to\folder 命令删除文件夹(或者也可以从 Git Bash 中执行该命令)。总之,如果你遇到这种问题,不妨试试这个方法! - Stijn de Witt
16个回答

5

删除文件:

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__忽略设置了隐藏属性的目录。带有选项/AD /B的__DIR__输出PATH_TO_FOLDER中所有目录的名称。 - Mofi
这与之前的答案有何不同? - Peter Mortensen

4
你可以使用以下命令来删除所有内容和父文件夹本身:
RMDIR [/S] [/Q] [drive:]path            

1
这与前两个答案有何不同? - Peter Mortensen
这个回答是否满足“可能会出现'此文件/文件夹已在使用中'等错误...当发生这种情况时,它应该继续并跳过该文件/文件夹”的要求? - Peter Mortensen

2
我有一个解决方案,对我很有效: for /R /D %A in (*node_modules*) do rmdir "%A" /S /Q 它会从当前目录及其子目录中删除所有的node modules文件夹。
这与上面发布的解决方案类似,但我仍然在这里发布它,以防有人发现它有用。

1
@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临时目录中的所有文件夹中删除每个文件中的文件,第三行清理目录及其内容。 - Robie Nayak
由于__FOR__命令忽略设置了隐藏属性的目录,因此应修改命令行为for /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I"。带有选项/AD /B的__DIR__输出%TEMP%中__所有__目录的名称。 - Mofi
DEL文档。我认为你选择了正确的选项 /F: *"忽略只读设置并强制删除(FORCE)"*。 - Peter Mortensen

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"。添加了 /A 选项以删除在 %pathtofolder% 中设置了隐藏属性的文件,否则 DEL 将为 %pathtofolder% 中的每个隐藏文件输出未找到错误消息。添加了 /F 选项以删除在 %pathtofolder% 中设置了只读属性的文件,否则 DEL 将输出访问被拒绝的错误消息。 - Mofi
这个解决方案是所有不完整的解决方案中最慢的,因为它会针对%pathtofolder%中的每个文件和目录启动一个cmd.exe实例。优点是__FORFILES__不像__FOR__那样忽略设置了隐藏属性的目录。 - Mofi
Re "It worked exactly as I needed and as specified by the OP.": 你有测试过需求中的 "可能会出现'此文件/文件夹已在使用中'等错误...当发生这种情况时,它应该继续并跳过该文件/文件夹。" 吗? - Peter Mortensen

-14

使用:

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

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


9
对我来说,这会在%pathtofolder%中留下空的子文件夹。 - D.H.
37
它不会删除%pathtofolder%中的子文件夹。很遗憾我没有声望来投票反对这个错误的答案。 - Vitalii Korsakov
1
正如 Vitalii Korsakov 指出的那样,这将删除所有文件和子目录中的文件,但会保留子目录,而 OP 也询问了如何删除子目录。 - Fuzz Evans
6
尽管这个命令确实会留下空文件夹,但它更接近于所要求的内容,比被接受的答案更好。当然,这取决于具体情况。 在我的情况下,我宁愿留下空文件夹,也不想让文件留在根目录下。 - MarcusUA
但是,当其他客户端机器以写访问权限打开共享驱动器时,我们如何删除在网络共享中打开的文件夹和子文件夹?psfile和net files命令将关闭文件会话,但几秒钟后它会自动为该用户在服务器上创建另一个会话... - user1954762
我对于44个踩的反应并不感到惊讶,但是35个赞的反应却让我有些意外。 - Gerhard

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