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

我正在编写一个批处理脚本,脚本的一部分试图删除一个目录及其所有子目录。我得到一个间歇性的错误,关于一个子目录不是空的。我读过一篇关于索引是罪魁祸首的文章。我关闭了 WSearch,但最终还是出现了错误。下面是命令:

rmdir /S /Q "C:\<dir>\"
314275 次浏览

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

  1. 有些文件或子目录需要更高的权限
  2. 有文件在使用,不仅由 WSearch,但也许由您的病毒扫描器或其他任何东西

1人)您可以尝试 runas /user:Administrator以获得更高的权限或通过上下文菜单作为管理员启动批处理文件。如果这还不够,也许管理员也没有这个权利。然后您需要接管目录的所有权。

2个。)下载 进程资源管理器,单击 Find/Find handle or DLL...或按 Ctrl+F,键入目录的名称并找出谁在使用它。如果可能的话,关闭使用该目录的应用程序。

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

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

我经历了哈里 · 约翰斯顿提到的同样的问题。rmdir /s /q会抱怨目录不是空的,即使 /s是为您清空的!我个人认为这是 Windows 的一个漏洞。

我的解决办法是在删除目录本身之前将目录中的所有内容都删除到 del:

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

(1>nul隐藏了 del的标准输出,否则,它会列出它删除的每一个文件。)

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

move <source directory> c:\

然后运行命令删除该目录

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

正如@gfullam 在对@BoffinbraiN 的回答的评论中所说,你正在删除的 <dir>本身可能不是包含文件的那个: 在 <dir>中可能有一个子目录得到一个“目录不是空的”消息,那么唯一的解决方案就是递归迭代这些目录,手动删除它们包含的所有文件... 我最终决定使用来自 UNIX 的 rm端口。rm.exe提供了 Git Bash、 MinGW、 Cygwin、 Gnuwin32和其他一些应用。您只需要在 PATH 中包含它的父目录,然后像在 UNIX 系统中那样执行。

批处理脚本示例:

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

对我起作用的是以下几点。我似乎 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

我只是遇到了同样的问题,它必须与一些文件丢失或损坏。要更正这个问题,只需运行检查磁盘:

chkdsk /F e:

这可以从搜索窗口框或 cmd 提示符运行。/F可以修复它发现的任何问题,比如恢复文件。一旦运行完毕,您可以像往常一样删除文件和文件夹。

与 Harry Johnston 的答案类似,我循环直到它工作。

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

我也有过类似的问题试图通过文件资源管理器删除一个空文件夹。给我展示了非空错误,所以我想我尝试通过管理 cmd,但没有一个答案在这里帮助。

当我把一个文件移到空文件夹后,我就可以删除非空文件夹了

以管理员身份输入命令提示符并运行

rmdir /s <FOLDER>

我有“ C: User User Name OneDrive Fonts”,它是 mklink‘ ed (/D) to“ C: Windows Fonts”,我遇到了同样的问题。对我来说

Cd“ C: 用户用户名 OneDrive”

字体

Y (确认动作)

我希望这对你也有帮助

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

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

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

可能还有其他文件,比如隐藏文件或系统文件,所以如果你想安全地使用它:

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

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 时单击重新启动,并尝试在恢复模式下再次运行这些命令

强制删除目录(如果存在)

删除,蝙蝠

set output_path="C:\Temp\MyFolder"
    

if exist %output_path% (
echo Deleting %output_path%
attrib -r /s /d %output_path%
rd /s /q %output_path%
)

一句话:

if exist folder rmdir /Q /S folder

我在一个 NPM 脚本中使用它,如下所示(Javascript) :

//package.json
"scripts": {
"start": "parcel --no-cache",
"clean": "if exist dist rmdir /Q /S dist",
"deploy": "npm run clean && parcel build --no-source-maps && firebase deploy"
},

以管理员身份打开 CMD

chkdsk c: /F /R
  • 如果下次系统重新启动时被要求检查磁盘,请按“ Y”键。

重新启动机器,然后删除文件夹。

在确保删除的目录名称中没有额外的空格之前,我已经修复了这个问题。当我将目录名包含在一个传递给 RD的变量中时,这更需要关注。如果你直接用引号指定你的名字,那么这是没有帮助的,但是我希望像我这样的人遇到同样的问题并且看到这一点。RD /S /Q可以工作,因为我注意到当我在批处理脚本中更改某些内容时问题开始发生。

我发现最简单的方法是:

rm -rf dir_name

它可以在 zsh-macOS 上工作,也可以在 windows cmd 上工作。

如果你需要删除 Windows上的一个带有批处理文件的文件夹,你需要使用 PowerShell,方法如下:

rmdir .\directory_name\ -Recurse