¿Cómo resolver el error "El directorio no está vacío" al ejecutar el comando rmdir en un script por lotes?

92

Estoy haciendo un script por lotes y parte del script está tratando de eliminar un directorio y todos sus subdirectorios. Recibo un error intermitente acerca de que un subdirectorio no está vacío. Leí un artículo sobre la indexación como culpable. Inhabilité WSearch pero finalmente volví a recibir el error. Aquí está el comando:

rmdir /S /Q "C:\<dir>\"
Violencia
fuente
¿Puedo pedir información sobre el tipo de archivos sobre los que Windows le alerta? Para mí, esto solo ocurre con archivos PDF poco después de moverlos / copiarlos.
Jake Stevens-Haas

Respuestas:

88

Experimenté los mismos problemas que mencionó Harry Johnston. rmdir /s /q¡Se quejaría de que un directorio no estaba vacío aunque /sesté destinado a vaciarlo por usted! Creo que es un error en Windows, personalmente.

Mi solución es deltodo en el directorio antes de eliminar el directorio en sí:

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

( 1>nulOculta la salida estándar de delporque, de lo contrario, enumera todos los archivos que elimina).

BoffinBrain
fuente
Me encontré con un escenario en el que algunos subdirectorios mydirproducían el mismo error "no vacío". Así que también tuve que cdingresar mydiry realizar la operación delen los archivos en cada uno de esos directorios. Al final funcionó, pero si hubiera tenido que repetir el proceso por tercera vez en otro subnivel, me habría sentido bastante derrotado.
gfullam
@gfullam Por lo que recuerdo, mi método también debería funcionar en subdirectorios recursivos, para cualquier profundidad. Eso es lo que del /shace.
BoffinBrain
Usando el explorador (probablemente también mkdir => NO!), Agregando una carpeta (y cambiando el nombre) finalice el trabajo de eliminación usando solo el rd /s /q mydircomando.
Master DJ
1
De acuerdo, creo que eliminar las ventanas y pasar a Linux es mucho más fácil que este dolor :)
RajnishCoder
1
@RajnishCoder Vivir con Windows es básicamente un mundo de soluciones. ¡Este problema en particular no es nada comparado con otros problemas con Windows 10!
BoffinBrain
47

Estoy familiarizado con este problema. La solución alternativa más sencilla es repetir condicionalmente la operación. Nunca lo he visto fallar dos veces seguidas, a menos que realmente haya un archivo abierto o un problema de permisos, ¡obviamente!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme
Harry Johnston
fuente
11
Holy Molly, esto no tiene sentido pero funcionó. Que #!%#@! microsoft
Sam B
IF EXISTpieles Access is deniedy otras situaciones. He añadido algo como DIR c:\deletemey la comprobación de errores antes de todo.
it3xl
Tener el explorador de Windows abierto en un subdirectorio o navegar hace que esto falle dos veces seguidas. Así que asegúrese de preguntarlo por tercera vez (que realmente funcionó)
Jake Stevens-Haas
En realidad, ha ocurrido dos veces seguidas para mí sin nada abierto o un problema de permisos. Mi récord es de siete veces. Recomendar el enfoque de @ BoffinbraiN.
Jake Stevens-Haas
Ejecuté solo el primer comando. Luego hizo clic con el botón derecho en la carpeta> Propiedades> Desmarque el atributo 'Solo lectura'> Aplicar. ¡Viola !, la carpeta finalmente desapareció.
steven7mwesigwa hace
21

ingrese el símbolo del sistema como administrador y ejecute

rmdir /s <FOLDER>
Adilson Cabral
fuente
2
Esto no es diferente de lo que estaba haciendo el OP.
Harry Johnston
20

Acabo de encontrar el mismo problema y tenía que ver con la pérdida o la corrupción de algunos archivos. Para corregir el problema, simplemente ejecute check disk:

chkdsk /F e:

Esto se puede ejecutar desde el cuadro de la ventana de búsqueda o desde un indicador de cmd. La /Fsoluciona cualquier problema que encuentra, al igual que la recuperación de los archivos. Una vez que esto termine de ejecutarse, puede eliminar los archivos y carpetas como de costumbre.

jrose
fuente
Perfecto, lo intenté desde media hora
trex
Esto encontró algunos archivos ocultos en mi carpeta, que luego pude eliminar. Really nasty 😑
Beat
7

Tuve un problema similar, intenté eliminar una carpeta vacía a través del explorador de Windows. Me mostró el error no vacío, así que pensé en intentarlo a través de admin cmd, pero ninguna de las respuestas aquí ayudó.

Después de que moví un archivo a la carpeta vacía. Pude eliminar la carpeta no vacía

Grisu118
fuente
1
Escríbalo en el comentario.
Virb
Interesante. Sin embargo, probablemente no sea relevante para el escenario de los OP.
Harry Johnston
¡Santo cielo, este fue literalmente el único pensamiento que funcionó de todas estas otras soluciones!
Seega
3

Como @gfullam declaró en un comentario a la respuesta de @ BoffinbraiN, es posible que el <dir>que se está eliminando no sea el que contiene los archivos: puede haber subdirectorios en los <dir>que aparece un mensaje "El directorio no está vacío" y la única solución entonces sería iterar recursivamente sobre los directorios, eliminando manualmente todos los archivos que los contienen ... Terminé decidiendo usar un puerto de rmUNIX. rm.exeviene con Git Bash, MinGW, Cygwin, GnuWin32 y otros. Solo necesita tener su directorio padre en su PATH y luego ejecutarlo como lo haría en un sistema UNIX.

Ejemplo de secuencia de comandos por lotes:

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

Lo que funcionó para mí es lo siguiente. Parece que el comando RMDir emitirá "El directorio no está vacío" casi todo el tiempo ...

: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
usuario7432246
fuente
2

Tenía "C: \ Users \ User Name \ OneDrive \ Fonts", que estaba mklink'ed (/ D) a "C: \ Windows \ Fonts", y tuve el mismo problema. En mi caso

cd "C: \ Usuarios \ Nombre de usuario \ OneDrive"

Fuentes rd / s

Y (para confirmar la acción)

me ayudó. Espero que también te ayude; D

Maciej Bledkowski
fuente
2
Agregue / q para evitar la necesidad de confirmación al ejecutar un lote.
Jonathan Rosenne
1

En mi caso, acabo de mover la carpeta al directorio raíz como tal.

move <source directory> c:\

Y luego ejecutó el comando para eliminar el directorio

rmdir c:\<moved directory> /s /q
Daniel Barde
fuente
2
rmdir c:\<moved directory> /s /qes la respuesta correcta
lalengua
1
NO es la respuesta correcta. eliminar una carpeta en la raíz puede causar los mismos mensajes: la carpeta no está vacía.
Gangnus
Sé que es un viejo tema. Solo quería decir que esto funcionó para mí ...
Manuel Rivera
1

La razón por la que se rd /sniega a eliminar ciertos archivos probablemente se deba a los atributos de archivo READONLY en los archivos del directorio.

La forma correcta de solucionar esto es asegurarse de restablecer los atributos en todos los archivos primero:

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

Puede haber otros, como archivos ocultos o del sistema, así que si quieres ir a lo seguro:

attrib -h -r -s %directory% /s /d
rd /s %directory%
Peter Hoeg
fuente
0

Similar a la respuesta de Harry Johnston, hago un bucle hasta que funciona.

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

Windows a veces está "roto por diseño", por lo que debe crear una carpeta vacía y luego reflejar la "carpeta rota" con una "carpeta vacía" con modo de copia de seguridad.

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

Cree un directorio vacío como este:

mkdir empty

sobrescribir la carpeta rota con un vacío como este:

robocopy /copyall /mir /b empty broken

y luego borra esa carpeta

rd broken /s
rd empty /s

Si esto no ayuda, intente reiniciar en "modo de recuperación con símbolo del sistema" manteniendo presionada la tecla Mayús cuando haga clic en reiniciar e intente ejecutar estos comandos nuevamente en modo de recuperación

Kristijonas Grigorovičius
fuente
Sí, creo que Robocopy funcionaría en el escenario de OP, porque reintenta automáticamente las operaciones fallidas. Probablemente desee especificar /W:0para evitar retrasos innecesarios. Es posible que no lo desee /bporque eso requiere privilegios administrativos. El modo de recuperación no es relevante para esta pregunta, porque estamos hablando de un script por lotes, no de alguien que intenta eliminar manualmente un directorio.
Harry Johnston
-1

Puedo pensar en las siguientes causas posibles:

  1. hay archivos o subdirectorios que necesitan mayores permisos
  2. hay archivos en uso, no solo por WSearch, sino quizás por su escáner de virus o cualquier otra cosa

Para 1.) puede intentar runas /user:Administratorobtener mayores privilegios o iniciar el archivo por lotes como administrador a través del menú contextual. Si eso no ayuda, tal vez incluso el administrador no tenga los derechos. Luego, debe asumir la propiedad del directorio.

Para 2.) descargue Process Explorer , haga clic Find/Find handle or DLL...o presione Ctrl+F, escriba el nombre del directorio y averigüe quién lo usa. Cierre la aplicación que usa el directorio, si es posible.

Thomas Weller
fuente
Las máquinas tienen la cuenta de administrador deshabilitada. Estoy en el grupo de administración pero no tengo conocimiento de una contraseña de administrador. ¿Alguna otra sugerencia para solucionar el problema de los permisos? Alguien mencionó que llamó a otro programa por lotes (como vba).
Mayhem
@Mayhem: esquivar los permisos es bastante difícil ... Probablemente necesitaríamos un exploit para un error en Windows para hacerlo sin una contraseña.
Thomas Weller