使用命令行在Windows中完全删除文件夹


57

我需要删除一个包含其他文件夹和文件的文件夹。我试过delrmdir命令,但有时它们会因一些错误而失败:[PATH]: The directory isn't empty.

有什么好的选择吗?


我在带有适当标志的rmdir是否删除目录树(和/或树本身)中的所有内容方面遇到了不一致的问题,而我唯一可能的解释就是Harry Johnston所说的。
r_alex_hall

Answers:


15

我的自动构建脚本经常发生在我身上。

我想原因可能是某些应用程序在该目录中使用“共享删除”打开了文件。即应用程序允许删除文件(这就是为什么我认为DeleteFile调用不会失败的原因),但是文件只会在所述应用程序关闭其句柄之后才会消失。

这意味着当rmdir命令尝试删除文件夹时文件可能仍然存在,因此会出现错误消息。此后不久,该应用程序将关闭它的句柄,该文件将消失,并且当您检查文件夹以查看rmdir正在讨论的文件时,该文件将为空。

至少那是我的理论。

哈里·约翰斯顿(Harry Johnston)提出的解决方法看起来不错。只有我会在rmdir命令之间插入一个暂停。当然,Windows没有易于编写脚本的“暂停”命令(更正:古老的Windows版本没有,较新的版本-请参见注释)。但是,如果秒粒度足够,则可以使用它ping来创建暂停:

ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul

因此总计:

rd /s /q foo
:: retry once
if exist foo (
    :: clear errorlevel
    cmd /c
    :: pause
    ping -n 2 127.0.0.1 >nul
    :: retry
    rd /s /q foo
)
:: retry yet again
if exist foo (
    cmd /c
    ping -n 2 127.0.0.1 >nul
    rd /s /q foo
)
:: give up
if exist foo {panic}

以我的经验,暂停是没有必要的,但是YMMV不需要。(当然,如果确实有其他应用程序正在运行,则最好将其识别,并在可能的情况下明确等待其退出。)
Harry Johnston

好吧...我实现了一个10倍重试循环,每次重试延迟一秒钟。现在可以使用。我不会尝试删除暂停,只是要看到它再次失败:-)当然,这并不意味着有必要。只是非常谨慎。
Paul Groke

2
OT:这就是为什么我讨厌窗户。一切都很难。rm -rf /directory/在所有操作系统上都应该是全局的。

2
实际上有一个“暂停”命令。暂停三秒钟,您可以使用此功能:timeout /t 3
r_alex_hall

@r_alex_hall确实(但是仅从Vista开始,XP和更早的版本本身没有此pause命令)。
misha256

57

尝试:

rmdir /S your_directory

要么:

rmdir /S /Q your_directory 

跳过确认消息。


1
我已经尝试过这些选项,但是正如我写的一样delrmdir什么也没问,它们只是发出一些行,如描述中的行。
Francesco Zanini 2013年

2
rmdir /s将删除所有可能删除的内容。您可能拥有被程序锁定的文件,只读文件或需要管理员权限才能删除的文件。没有一个命令可以为您解决所有这些情况
nvuono 2013年

如果仍然收到错误消息,请尝试使用PowerShell:cmdlet Remove-Item,它比rmdir强大。
AndrewQ

1
rmdir / S <目录>正在删除目录以及子目录和目录。它还询问您确定。在Windows 10上。谢谢
Jasmeet

1
@r_alex_hall RMDIR / s实际上确实删除目录中的文件。但是DEL / s将仅删除文件并保留目录,这就是RMDIR是更好的选择的原因
JCH2k

11

您可能有一些只读文件,可以使用del / F选项使用以下方法摆脱它们:

     del /S /F your_directory
     rmdir your_directory

您也可能有一些隐藏文件,如果您确实确定要删除它们,则可以使用

     del /S /F /AH your_directory
     rmdir your_directory

如果仍然失败,则说明您没有删除某些文件的权限,或者某些文件仍在使用中。


这应该是正确的答案!
jdhao

4

我相信Windows 7(可能还有其他版本)中存在一个错误,有时会导致这种症状。否则可能是第三方软件中的错误。(您是否偶然安装了Symantec Endpoint Protection?)

无论如何,我经常遇到它。在大多数情况下,可以通过连续运行rd /s /q两次或三遍来解决此问题。

如果在批处理文件中,则可以执行以下操作:

rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause

同意 使用rd / s foo(不带/ q静默选项)将为您删除所有子文件夹,但是您必须对提示符回答Y,因此需要参加批处理文件。我知道不理想。
安东尼

3

使用del里面的文件,然后rmdir删除文件夹。

要使用该rmdir方法也删除所有文件,请在目录名称使用/S开关,并禁止提示删除。这是最好的方法,因为您不会丢失任何文件。但是请小心使用/ Q开关,因为它不会警告您系统或隐藏文件属性/Q


2

如果使用节点,则可以使用rimraf依赖项,如下所示:

运行安装: npm install rimraf -g

删除文件夹: rimraf SourceFolder

这在出现错误时对我有帮助:

源文件名大于文件系统支持的文件名


0

Windows的旧版本文件夹(DOS,Windows 95/98 / ME)DELTREE等效于RMRMDIR。我DELTREE在Windows 7工作站上使用批处理文件就可以了。

Deletes a directory and all the subdirectories and files in it.

To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]

  /Y              Suppresses prompting to confirm you want to delete
                  the subdirectory.
  [drive:]path    Specifies the name of the directory you want to delete.

Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.

0

我认为您可以像这样使用它:

msg*your file is going to delete 
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\" 
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"

1
欢迎来到SU!为什么我投票?1)格式不正确2)提供的解决方案与几年前已经发布的解决方案相同(请在发布新解决方案之前先阅读已发布的解决方案!)3)不适合该问题(您的解决方案会重新创建已删除的文件夹,未被要求)。
zagrimsan 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.