Estoy tratando de eliminar un directorio de forma recursiva rm -Force -Recurse somedirectory
, obtengo varios errores "El directorio no está vacío". Si reintento el mismo comando , tiene éxito.
Ejemplo:
PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (RunTime:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (Data:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (FileHelpers.Tests:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (nunit:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (Libs:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (I:\Documents an...net\FileHelpers:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
PS I:\Documents and Settings\m\My Documents\prg\net>
Por supuesto, esto no siempre sucede . Además, no ocurre solo con _svn
directorios, y no tengo un caché TortoiseSVN ni nada de eso, así que nada está bloqueando el directorio.
¿Algunas ideas?
fuente
@JamesCW: el problema aún existe en PowerShell 4.0
Intenté otra solución y funcionó: use cmd.exe:
fuente
iisreset
antes de eliminar y nada parece funcionar de manera confiable . Voy a probar este, aunque cuando lo vi por primera vez me resistí a tener DOS dentro de mi Powershell ...rd /s
falla intermitentemente (aunque aparentemente con menos frecuencia queRemove-Item
): github.com/Microsoft/console/issues/309ETA 20181217: PSVersion 4.0 y versiones posteriores todavía fallarán en algunas circunstancias, vea la respuesta alternativa de Mehrdad Mirreza y el informe de error presentado por mklement
mklement proporciona una solución de prueba de concepto en esta respuesta SO , ya que el error está esperando una solución oficial
La nueva versión de
PowerShell
(PSVersion 4.0
) ha resuelto este problema por completo yRemove-Item "targetdirectory" -Recurse -Force
funciona sin problemas de sincronización.Puede verificar su versión ejecutándose
$PSVersiontable
desde el ISE o elPowerShell
indicador. 4.0 es la versión que se incluye conWindows 8.1
yServer 2012 R2
, y también se puede instalar en versiones anteriores de Windows.fuente
rd
versión. Además de funcionar, es aproximadamente 3 veces más rápidord /s
puede fallar con menos frecuencia, también está roto: consulte este informe de error .Actualización : Al parecer, hay planes para hacer que las API de eliminación de elementos del sistema de archivos de Windows sean síncronas, pero aún no están sincronizadas a partir de la versión 1903 de Windows 10: vea este comentario en GitHub .
Las respuestas existentes mitigan el problema, por lo que ocurre con menos frecuencia, pero no abordan la causa raíz , por lo que todavía pueden ocurrir fallas.
Remove-Item -Recurse
es inesperadamente asíncrono , en última instancia, porque los métodos API de Windows para la eliminación de archivos y directorios son inherentemente asíncronos yRemove-Item
no tienen en cuenta eso.Esto se manifiesta de manera intermitente e impredecible de una de dos maneras:
Su caso: la eliminación de un directorio no vacío en sí mismo puede fallar, si la eliminación de un subdirectorio o archivo en él aún no se ha completado para cuando se intente eliminar el directorio padre.
Con menos frecuencia: la recreación de un directorio eliminado inmediatamente después de la eliminación puede fallar, ya que es posible que la eliminación aún no se haya completado para cuando se intente la recreación.
El problema no solo afecta a PowerShell
Remove-Item
, sino también acmd.exe
los derd /s
.NET[System.IO.Directory]::Delete()
:A partir de Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 /
cmd.exe
10.0.17134.407 / .NET Framework 4.7.03056, .NET Core 2.1, niRemove-Item
, nird /s
, ni[System.IO.Directory]::Delete()
funcionan de manera confiable , ya que no tienen en cuenta el asíncrono comportamiento de las funciones de eliminación de directorio / archivo API de Windows :cmd.exe
informe de errorPara obtener una función personalizada de PowerShell que brinde una solución sincronizada confiable , vea esta respuesta SO .
fuente
while($true) { if ( (Remove-Item [...] *>&1) -ne $null) { Start-Sleep 0.5 } else { break } }
La respuesta actual en realidad no eliminará un directorio, solo sus hijos. Además, tendrá problemas con los directorios anidados, ya que nuevamente intentará eliminar un directorio antes de su contenido. Escribí algo para eliminar los archivos en el orden correcto, todavía tendría el mismo problema, aunque a veces el directorio seguiría existiendo después.
Entonces, ahora uso algo que detectará la excepción, espere y vuelva a intentarlo (3 veces):
Por ahora estoy usando esto:
fuente
Para eliminar el directorio y su contenido se requieren dos pasos. Primero elimine el contenido, luego la carpeta misma. Usando la solución para el elemento de eliminación recursivo defectuoso, la solución se vería así:
De esta manera, también puede eliminar el directorio principal.
fuente
Remove-Item
comando en el que está entrando la tubería tiene el mismo problema que el indicado originalmente. Podría tropezar con un elemento de directorio que no esté vacío de la misma manera.Remove-Item -Recurse
todavía está involucrado. El problema subyacente aún existe a partir de Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1: consulte este informe de errores .Gosh Muchas respuestas Sinceramente, prefiero este sobre todos ellos. Es súper simple, completo, legible y funciona en cualquier máquina con Windows. Utiliza la funcionalidad de eliminación recursiva (confiable) de .NET y si falla por algún motivo, arroja una excepción adecuada que puede manejarse con un bloque try / catch.
Tenga en cuenta que la
Resolve-Path
línea es importante porque .NET no conoce su directorio actual cuando resuelve rutas de archivos relativas. Ese es el único problema que se me ocurre.fuente
Esto es lo que tengo trabajando:
Esta primera línea elimina todos los archivos en el árbol. El segundo elimina todas las carpetas, incluida la parte superior.
fuente
Remove-Item -Recurse
todavía está involucrado. El problema subyacente aún existe a partir de Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1: consulte este informe de errores .Tome posesión de los archivos / directorios primero usando Takeown.exe y luego elimine
https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/
fuente
Tuve este problema con un directorio que no se eliminaría. Descubrí que una de las subcarpetas estaba dañada y cuando intenté mover o cambiar el nombre de ese directorio secundario, recibí un mensaje de error que decía que faltaba algo. Intenté usar rm -Force y obtuve el mismo error que tú.
Lo que funcionó para mí fue comprimir el directorio principal usando 7-zip con la opción "Eliminar archivos después de la compresión" marcada. Una vez comprimido, pude eliminar el archivo zip.
fuente