[英]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
重新启动机器。 之后,只需删除该文件夹。
与 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.) 您可以尝试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.