ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

有什么命令吗?

Windows 使删除文件夹变得多么困难……或者制作一个以点开头的文件夹……感谢上帝在 Windows 中集成 Bash! rm -rf path\to\folder 在 Windows 10 中工作(或者可能来自 Git Bash ......无论哪种方式,如果您有的话,不妨一试!)

T
The Red Pea

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

RMDIR "FOLDERNAME" /S /Q

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


这似乎删除了 OP 想要保留的路径文件夹。
这将删除文件夹本身,因此您需要添加另一个命令:md FOLDERNAME(请参阅下面@rakoczyn 的答案)。
这里的“备份已创建”是什么意思?我看不到任何会创建任何备份的东西......
目录不为空 消息作为响应来了!
为了不删除文件夹本身,请将其设置为之前的当前目录,然后使用“。”作为文件夹名。之后重新创建它不一定相同,因为 ACL 可能会丢失。 cd "FOLDERNAME" RD . /S /Q
C
Community

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


我试过了,但不幸的是文件没有被删除,只有子文件夹被删除。例如,我有一个名为 Test 的文件夹。它包含 2 个名为“Ripon”和“Wasim”的文件夹,并包含一个名为“riponalwasim.txt”的文件。子文件夹 Ripon 和 Wasim 已删除,但 riponalwasim.txt 未删除。
如果您希望直接从命令行运行,请使用单个百分号,例如 %p
遗憾的是这需要 2 行,但至少它有效!我厌倦了寻找一个有效的“单线”,我会选择这个,谢谢!
您可以使用 '&&' 运算符在没有 bat 文件的情况下在一行中执行两个命令(注意单个 '%' 而不是 '%%')。 del /s /q "myfolder*" && FOR /D %p IN ("myfolder*") DO rmdir "%p" /s /q
DEL 命令行缺少选项 /A 来删除具有隐藏属性集的文件和选项 /F 来删除具有只读属性集的文件。所以del /A /F /Q "C:\Temp\*"会更好。并且 FOR 命令行应修改为 for /F "eol=| delims=" %%I in ('dir "C:\Temp\*" /AD /B 2^>nul') do rd /Q /S "C:\Temp\%%I",因为 FOR 会忽略具有隐藏属性集的目录。带有选项 /AD /BDIR 输出 C:\Temp 中的 all 目录及其名称。
S
Spontifixus

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

RD /S /Q folderPath

然后再次创建此目录:

MD folderPath

如果您允许删除但不创建新文件夹怎么办?我希望它可能:)
这是一个糟糕的解决方案,因为它在目录节点的文件系统上引入了竞争,即如果立即执行第二个命令可能会失败。
此外,如果该目录具有特殊权限,那么解决方案很糟糕
不要被响应推迟:“目录不是空的。”,只需发出两次命令 :-)
RD 和 RMDIR 是相同的命令,既然您在有人说出相同答案的 9 个月后发布了此答案,为什么人们会给您积分?
f
foxidrive

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

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

对于不确定这种方法的任何人:它绝对不会重新创建目录。如果没有 2>nul,它会输出“该进程无法访问该文件,因为它正被另一个进程使用。”
我讨厌 Windows 无法删除某些程序正在使用的文件和文件夹。我喜欢你在这条单线中使用它对你有利。
所以这个超级魔法就是我们如何在 Windows 中清空文件夹??感人的 :)
@mlvljr 仅当您也想保留父文件夹时。 RD /? 将向您展示清空文件夹的简单方法。
如果您需要返回起始位置,这很好,否则只需 CD mypath && RD /S . 就足够了。我不喜欢你必须重复你的路径两次,因为长路径变得难以阅读。所以我会在开头添加一个 set p="mypath"
S
ScottN
@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

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


这应该是正确的答案.. 只需简单.. deletemyfoldercontents.bat 文件.. 弹出你的路径,它就像一个魅力..
DEL 命令行缺少选项 /A 来删除具有隐藏属性集的文件,并且 %dir%\* 应该用双引号括起来,如 "%dir%\*" 也适用于包含空格或其中之一的目录字符 &()[]{}^=;!'+,`~。并且 FOR 命令行应修改为 for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I",因为 FOR 会忽略具有隐藏属性集的目录。带有选项 /AD /BDIR 输出 all 目录及其名称。顺便说一句:dir 不是环境变量的好名称。
不删除子文件夹
@RMiranda,在我的测试中,它完全按照 OP 的要求进行。您是否有不删除子文件夹的情况?
这个答案是否满足要求“可能存在像'此文件/文件夹已在使用'之类的错误......当这种情况发生时,它应该继续并跳过该文件/文件夹。”?
O
O.Badr
CD [Your_Folder]
RMDIR /S /Q .

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

更新:

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

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

Windows Command-Line Reference

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


这非常适合清空 temp,但 cd [Your_Folder] 非常关键 - 我必须记住这一点,所以我不会删除目录本身......
这是正确的解决方案。在命令之间添加 && 而不是换行符,您可以避免 CD 出现故障。
这是一个简单而正确的解决方案。甚至可以与 Azure 命令外壳一起使用!
非常糟糕的解决方案......例如,我需要这个命令行删除来进行 svn 更新 - 我想在更新 svn 之前删除所有文件和文件夹,因为我使用它的机器上可能会有一些变化,但相关只是签入的项目。做 RMDIR /S /Q 。还删除了 SVN 链接,因此使文件夹不再是 svn 文件夹
这与前四个答案有何不同?
r
rhellem

我使用 Powershell

Remove-Item c:\scripts\* -recurse

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


rhellem 的答案是最近的,但它是唯一能真正为我做到这一点的答案。 (Win 8.1,不是选择)
从批处理命令行:powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
请注意,“*”是必需的,否则它将删除该文件夹。
S
Sireesh Yarlagadda

RD 代表删除目录。

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

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

例子 :

RD /S /Q C:/folder_path/here

因为是唯一解释 /S/Q 含义的人而被投票赞成
不。rd 等同于 rmdir 并将删除目录本身,这不是 OP 想要的。
这个答案是否满足要求“可能存在像'此文件/文件夹已在使用'之类的错误......当这种情况发生时,它应该继续并跳过该文件/文件夹。”?例如,它是否完全中止而不是继续?
P
Peter Mortensen

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

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

选择另存为和文件名:

delete_temp.bat

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

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

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


一个非常简单和干净的解决方案
M
Mofi

2018 年 6 月 1 日发布的所有答案,除了 foxidrive 发布的单个命令行的例外,都没有真正删除所有文件和所有文件夹/目录在 %PathToFolder%。这就是使用非常简单的单个命令行发布另一个答案以删除文件夹的所有文件和子文件夹以及具有更复杂解决方案的批处理文件的原因,该解决方案解释了为什么在 2018 年 6 月 1 日发布的所有其他答案使用 <带有 RD 的strong>DEL 和 FOR 未能完全清理文件夹。

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

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

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

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

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

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

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

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

只有当当前命令进程的当前目录切换到指定目录成功,即指定目录完全存在时,才会执行下一条命令RD。

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

未删除的是:

用作任何正在运行的进程的当前目录的文件夹。如果文件夹用作任何正在运行的进程的当前目录,则无法删除此类文件夹的整个文件夹树。当前由任何正在运行的进程打开的文件,在文件打开时设置了文件访问权限,以防止在正在运行的应用程序/进程打开时删除文件。这种打开的文件还可以防止将整个文件夹树删除到打开的文件中。当前用户没有删除文件/文件夹所需的 (NTFS) 权限的文件/文件夹,这也阻止了删除该文件/文件夹的文件夹树。

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

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

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

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

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

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

注意: POPD 可以在初始当前目录是要清理的目录的子目录已不存在的情况下静默恢复初始当前目录失败。在这种特殊情况下,%PathToFolder% 仍然是当前目录。因此建议不要从 %PathToFolder% 的子目录运行上面的命令行。

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

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

推/?

弹出/?

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

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

选项 /A 是处理所有文件所必需的,包括具有隐藏属性的文件,如果不使用选项 /A,DEL 会忽略这些文件。

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

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

>nul 需要将写入处理 STDOUT 的文件名的输出重定向到由于当前打开文件或用户无权删除文件而无法删除的设备 NUL。

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

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

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

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

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

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

带有选项 /FFOR 会忽略此处不会出现的空行,因为带有选项 /BDIR 不会输出空行。

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

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

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

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

德尔/?

目录/?

回声/?

本地/?

为了 /?

去 /?

如果 /?

rd /?

雷姆/?

放 /?

设置本地/?


P
Peter Mortensen

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

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

这与前两个答案有何不同?
这个答案是否满足要求“可能存在像'此文件/文件夹已在使用'之类的错误......当这种情况发生时,它应该继续并跳过该文件/文件夹。”?
M
Maxim Suslov

要删除文件:

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"

是的,这是正确的。必须分两步。这值得更多的赞成,因为它解释了为什么,与上面投票更多的答案相比。
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 /BDIR 输出 PATH_TO_FOLDER 中的 all 目录及其名称。
这与(某些)以前的答案有何不同?
R
Robie Nayak
@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

第 2 行将从 Windows 临时目录中的所有文件夹中删除每个文件中的文件,第 3 行将清理目录,包括其内容。
FOR 命令行应修改为 for /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I",因为 FOR 会忽略具有隐藏属性集的目录。带有选项 /AD /BDIR 输出 %TEMP% 中的 all 目录及其名称。
Documentation for DEL。我认为您使用 /F 走在正确的轨道上:“忽略只读设置并删除(强制)”
P
Peter Mortensen

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

我在网站 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 的规定工作。


两个命令行可以合并为一个命令行:添加 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 将输出拒绝访问错误消息。
此解决方案是此处发布的所有不完整解决方案中最慢的,因为为 %pathtofolder% 中的每个文件和每个目录启动了一个 cmd.exe 实例。优点是 FORFILES 不会像 FOR 那样忽略设置了隐藏属性的目录。
重新“它完全按照我的需要和 OP 指定的那样工作。”:您是否测试了要求“可能存在像'此文件/文件夹已在使用中'这样的错误......当这种情况发生时,它应该只是继续并跳过该文件/文件夹。”?
T
Tornike Shavishvili

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

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

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

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


P
Peter Mortensen

利用:

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

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


对我不利,这会在 %pathtofolder% 中留下空的子文件夹。
它不会删除 %pathtofolder% 中的子文件夹。太糟糕了,我没有声望拒绝这个错误的答案
正如 Vitalii Korsakov 所指出的,这会删除子目录中的所有文件和文件,但也会保留 OP 询问如何删除的子目录。
尽管此命令确实留下了空文件夹,但它比接受的答案更接近请求的内容。当然,这取决于具体情况。就我而言,我宁愿拥有空文件夹,也不愿保留根目录中的文件。
但是当其他客户端计算机打开对该文件夹具有写访问权限的共享驱动器时,我们如何删除在网络共享中打开的文件夹和子文件夹.. psfile 和 net files 命令将关闭文件会话,但几秒钟后它会再次创建在服务器中自动为该用户创建另一个会话...