在批处理脚本中运行rmdir命令时,如何解决“目录不为空”错误?


92

我正在制作批处理脚本,该脚本的一部分正在尝试删除目录及其所有子目录。我收到有关子目录不为空的间歇性错误。我读了一篇有关索引是罪魁祸首的文章。我禁用了WSearch,但最终还是再次出现该错误。这是命令:

rmdir /S /Q "C:\<dir>\"

我可以问一些有关Windows提醒您的文件类型的信息吗?对我来说,这仅在我移动/复制PDF文件后不久才发生。
杰克·史蒂文斯-哈斯

Answers:


87

我遇到了哈里·约翰斯顿(Harry Johnston)提到的相同问题。rmdir /s /q会抱怨目录不是空的,即使它/s是为您清空的!我个人认为这是Windows中的错误。

我的解决方法是del删除目录本身之前对目录中的所有内容进行处理:

del /f /s /q mydir 1>nul
rmdir /s /q mydir

1>nul隐藏标准输出,del因为否则它将列出删除的每个文件。)


我遇到了其中某些子目录mydir产生相同的“非空”错误的情况。因此,我也必须cd进入每个目录中的文件mydir并对其执行del。最终它成功了,但是如果我不得不在另一个子级别上第三次重复该过程,那我会觉得很失败。
gfullam '16

@gfullam据我所记得,我的方法也应该适用于递归子目录,无论深度如何。就是del /s那样
BoffinBrain '16

使用资源管理器(可能还mkdir => NO!),添加文件夹(并更改名称)仅使用rd /s /q mydir命令即可完成删除工作。
DJon大师19年

1
好的,我认为删除Windows并迁移到Linux比这种痛苦要容易得多:)
RajnishCoder

1
@RajnishCoder与Windows一起生活基本上是一个变通办法。与Windows 10的其他问题相比,此特定问题无可厚非!
BoffinBrain

46

我对这个问题很熟悉。最简单的解决方法是有条件地重复该操作。我从未见过它连续两次失败-除非实际上确实存在打开文件或权限问题!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme

11
圣洁的莫莉,这没有任何意义。什么#!%#@!microsoft
Sam B

IF EXISTAccess is denied等情况。我DIR c:\deleteme在一切之前添加了类似东西和错误检查。
it3xl

使Windows资源管理器在子目录中打开或以其他方式浏览导致此操作连续两次失败。因此,请确保您第三次询问(实际上有效)
杰克·史蒂文斯-哈斯

实际上,对于我来说,它已经连续发生两次,没有任何打开或权限问题。我的记录是七次。推荐@BoffinbraiN的方法。
杰克·史蒂文斯-哈斯


20

我只是遇到了同样的问题,它与某些文件丢失或损坏有关。要解决此问题,只需运行检查磁盘:

chkdsk /F e:

这可以从搜索窗口框中或从cmd提示符下运行。该/F修复它发现,像恢复文件的任何问题。完成运行后,您可以像平常一样删除文件和文件夹。



这在我的文件夹中找到了一些隐藏的文件,然后我将其删除了。na真讨厌
击败

7

我有一个类似的问题,试图通过Windows资源管理器删除一个空文件夹。向我展示了非空错误,所以我认为我可以通过admin cmd尝试它,但是这里没有任何答案。

之后,我将文件移到空文件夹中。我能够删除非空文件夹


1
请写在评论中。
Virb

有趣。不过,可能与OP场景无关。
哈里·约翰斯顿

天哪,这实际上是所有其他解决方案中唯一起作用的想法!
Seega

3

正如@gfullam在对@BoffinbraiN的答案的评论中所指出的那样,<dir>您要删除的自身可能不是包含文件的对象:其中可能存在子目录,并<dir>显示“目录不为空”消息,唯一的解决方案是递归地遍历目录,手动删除所有包含的文件...我最终决定使用rmUNIX的端口。rm.exe随附Git Bash,MinGW,Cygwin,GnuWin32等。您只需要在PATH中拥有其父目录,然后像在UNIX系统中一样执行即可。

批处理脚本示例:

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"

2

对我有用的是以下内容。我似乎似乎RMDir命令几乎总是发出“目录不为空”的信息...

:Cleanup_Temporary_Files_and_Folders

Erase /F /S /Q C:\MyDir

RMDir /S /Q C:\MyDir
If  Exist  C:\MyDir  GoTo Cleanup_Temporary_Files_and_Folders

2

我有“ C:\ Users \用户名\ OneDrive \ Fonts”,它被mklinked(/ D)到“ C:\ Windows \ Fonts”,并且遇到了同样的问题。就我而言

cd“ C:\ Users \ User Name \ OneDrive”

rd / s字体

Y(确认动作)

帮助过我。希望对您有帮助; D


2
添加/ q以避免在运行批处理时进行确认。
乔纳森·罗森

1

我的情况下,我只是像这样将文件夹移到根目录。

move <source directory> c:\

然后运行命令删除目录

rmdir c:\<moved directory> /s /q

2
rmdir c:\<moved directory> /s /q是正确的答案
lalengua

1
这不是正确的答案。删除根目录中的文件夹可能会导致相同的消息:文件夹不为空。
Gangnus

我知道这是一个旧线程。只是想说这对我
Manuel Rivera '18

1

rd /s拒绝删除某些文件的原因很可能是由于目录中文件的READONLY文件属性。

解决此问题的正确方法是确保首先重置所有文件的属性:

attrib -r %directory% /s /d
rd /s %directory%

可能还有其他文件,例如隐藏文件或系统文件,因此,如果要安全播放,请执行以下操作:

attrib -h -r -s %directory% /s /d
rd /s %directory%

0

类似于哈里·约翰斯顿(Harry Johnston)的回答,我一直循环直到它起作用。

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)

0

Windows有时会被“设计破坏”,因此您需要创建一个空文件夹,然后使用备份模式将“破碎文件夹”镜像为“空文件夹”。

robocopy - cmd copy utility

/copyall - copies everything
/mir deletes item if there is no such item in source a.k.a mirrors source with
destination
/b works around premissions shenanigans

像这样创建一个空目录:

mkdir empty

像这样用空的覆盖损坏的文件夹:

robocopy /copyall /mir /b empty broken

然后删除该文件夹

rd broken /s
rd empty /s

如果这样做没有帮助,请尝试通过单击“重新启动”时按住shift并尝试在恢复模式下再次运行这些命令来在“具有命令提示符的恢复模式下”重新启动


是的,我认为Robocopy将在OP场景中工作,因为它会自动重试失败的操作。您可能需要指定/W:0以避免不必要的延迟。您可能不需要,/b因为这需要管理权限。恢复模式与该问题无关,因为我们正在谈论的是批处理脚本,而不是有人手动尝试删除目录。
哈里·约翰斯顿

-1

我可以想到以下可能的原因:

  1. 有些文件或子目录需要更高的权限
  2. 有一些文件正在使用,不仅由WSearch使用,而且还可能由病毒扫描程序或其他任何文件使用

对于1.),您可以尝试 runas /user:Administrator以获取更高的权限,或者通过上下文菜单以管理员身份启动批处理文件。如果那没有帮助,那么甚至管理员也没有权限。然后,您需要接管目录的所有权。

对于2.)下载Process Explorer,单击Find/Find handle or DLL...或按Ctrl+F,输入目录的名称并找出谁使用它。如果可能,请关闭使用该目录的应用程序。


机器禁用了管理员帐户。我在admin组中,但是我不知道管理员密码。还有其他解决权限问题的建议吗?有人提到批量调用另一个程序(例如vba)。
Mayhem 2014年

@Mayhem:绕开权限非常困难...我们可能需要利用Windows中的bug才能在没有密码的情况下进行利用。
而且我确定我想念一下
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.