繁体   English   中英

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

[英]How to solve "The directory is not empty" error when running rmdir command in a batch script?

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

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

我遇到了与 Harry Johnston 提到的相同的问题。 rmdir /s /q会抱怨目录不是空的,即使/s是为了为您清空! 我个人认为这是Windows中的一个错误。

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

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

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

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

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

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

chkdsk /F e:

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

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

rmdir /s <FOLDER>

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

在我将文件移动到空文件夹后。 我能够删除非空文件夹

正如@gfullam 在对@BoffinbraiN 的回答的评论中所说,您要删除的<dir>本身可能不是包含文件的那个: <dir>中可能有子目录会收到“目录不是空的”消息,并且唯一的解决方案是递归遍历目录,手动删除所有包含的文件......我最终决定使用rm来自 UNIX 的端口。 rm.exe与 Git Bash、MinGW、Cygwin、GnuWin32 等一起提供。 您只需要将其父目录放在 PATH 中,然后像在 UNIX 系统中一样执行。

批处理脚本示例:

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

我有“C:\Users\User Name\OneDrive\Fonts”,它被 mklink'ed ( /D ) 到“C:\Windows\Fonts”,我也遇到了同样的问题。 就我而言

cd "C:\用户\用户名\OneDrive"

rd /s 字体

Y(确认动作)

帮助过我。 希望对你也有帮助 ;D

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

move <source directory> c:\

然后运行命令删除目录

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

对我有用的是以下内容。 我看起来好像 RMDi 命令几乎总是会发出“目录不是空的”......

: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

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

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

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

可能还有其他文件,例如隐藏文件或系统文件,因此,如果您想安全使用:

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

以管理员身份打开 CMD

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

重新启动机器。 之后,只需删除该文件夹。

与 Harry Johnston 的回答类似,我循环直到它起作用。

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

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

删除.bat

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"
  },

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

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

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

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

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

rmdir <directory> /s

这对我有用。

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 并尝试在恢复模式下再次运行这些命令

我发现这样做的最简单方法是:

rm -rf dir_name

它适用于 zsh - macOS,它也应该适用于 windows cmd。

如果您需要使用批处理文件删除Windows上的文件夹,您将需要使用 PowerShell,这是如何完成的:

rmdir .\directory_name\ -Recurse

发生这种情况是因为您在目录中。 确保您的CLI和资源管理器不在目录中。 关闭所有这些以确定。 然后以admin身份运行并cd到父目录并运行:

rmdir /s /q mydir

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM