¿Cuál es la forma más sencilla de eliminar forzosamente un directorio y todos sus subdirectorios en PowerShell? Estoy usando PowerShell V2 en Windows 7.
He aprendido de varias fuentes que el comando más obvio Remove-Item $targetDir -Recurse -Force
no funciona correctamente. Esto incluye una declaración en la ayuda en línea de PowerShell V2 (que se encuentra usando Get-Help Remove-Item -Examples
) que dice:
... Debido a que el parámetro Recurse en este cmdlet es defectuoso, el comando usa el cmdlet Get-Childitem para obtener los archivos deseados, y usa el operador de canalización para pasarlos al cmdlet Remove-Item ...
He visto varios ejemplos que usan Get-ChildItem y lo canalizan a Remove-Item , pero los ejemplos generalmente eliminan algunos conjuntos de archivos basados en un filtro, no todo el directorio.
Estoy buscando la forma más limpia de eliminar un directorio completo, archivos y directorios secundarios, sin generar ningún mensaje de advertencia del usuario con la menor cantidad de código. Una frase sería buena si es fácil de entender.
fuente
RD /S /Q
rd
es un alias paraRemove-Item
en powershell.cmd /c "rd /s /q"
funciona, sin embargo.Respuestas:
de hecho funciona como se anuncia aquí.
son alias abreviados que también funcionan.
Según tengo entendido, el
-Recurse
parámetro simplemente no funciona correctamente cuando intentas eliminar un conjunto filtrado de archivos de forma recursiva. Para matar un solo directorio y todo lo que está debajo parece funcionar bien.fuente
cmd /c rd
como se indica a continuación.Solía:
Esto funciona para mí como un encanto (lo robé de Ubuntu).
fuente
rm
es un alias paraRemove-Item
la configuración predeterminada de PowerShell. Verifique la salida deGet-Alias rm
para más detalles. Se-r
está aprovechando el comportamiento de coincidencia parcial de PowerShell en los parámetros. ComoRemove-Item
solo tiene un parámetro que comienza con una 'r'-Recurse
,-r
coincide con eso. Por lo tanto, la siguiente todo funcionará de la misma:rm -r
,rm -re
,Remove-Item -Recurse
. (Nota que nirm -rf
tampocorm -r -f
va a funcionar, perorm -r -fo
. Lo harán-rf
coincide con ningún parámetro y-f
coincide con más de uno.)rm -rf folder
y, por supuesto, falló. Inicialmente rechacé la respuesta (porque decía Ubuntu). Gracias al comentario de @chwarr, lo probé sin elf
y tomó el alias en lugar de rm binary. Desearía que Tuan actualizara su fuente (no estoy seguro si Tuan sabía que era un alias o realmente pensaba que era el rm de Unix ;-)-R
lugar de-r
(aunque, por lo que sé, PowerShell es como el resto de Windows, no distingue entre mayúsculas y minúsculas, por lo tanto, no debería hacer una diferencia), pero recibí un error de que las carpetas que estoy tratando de eliminar son no vacío.Al eliminar archivos de forma recursiva usando un simple
Remove-Item "folder" -Recurse
, a veces veo un error intermitente:[folder] cannot be removed because it is not empty.
Esta respuesta intenta evitar ese error eliminando individualmente los archivos.
Un detalle importante es la clasificación de todos los elementos
pspath -Descending
para que las hojas se eliminen antes que las raíces. La clasificación se realiza según elpspath
parámetro, ya que tiene más posibilidades de trabajar para proveedores distintos del sistema de archivos. los-Include
parámetro es solo una conveniencia si desea filtrar los elementos para eliminar.Se divide en dos funciones, ya que me resulta útil ver lo que estoy a punto de eliminar ejecutando
fuente
remove-item -recurse
Powershell v5, por lo que esta solución es la mejor para mí....trabajó para mi
fuente
Prueba este ejemplo. Si el directorio no existe, no se genera ningún error. Es posible que necesite PowerShell v3.0.
fuente
Use el comando DOS de la vieja escuela:
fuente
/q
(Modo silencioso, no pregunte si está bien para eliminar un árbol de directorios con / S) también.Por alguna razón, la respuesta de John Rees a veces no funcionó en mi caso. Pero me llevó en la siguiente dirección. Primero trato de eliminar el directorio de forma recursiva con la opción buggy -recurse. Luego desciendo a cada subdirectorio que queda y elimino todos los archivos.
fuente
Para evitar los errores "El directorio no está vacío" de la respuesta aceptada, simplemente use el viejo comando DOS como se sugirió anteriormente. La sintaxis completa de PS lista para copiar y pegar es:
fuente
Tomé otro enfoque inspirado por @ john-rees arriba, especialmente cuando su enfoque comenzó a fallar para mí en algún momento. Básicamente, repita el subárbol y clasifique los archivos por su longitud de ruta: elimine del más largo al más corto
Con respecto a la magia -LiteralPath, aquí hay otro gotchya que puede estar golpeándote: https://superuser.com/q/212808
fuente
O
Si tienes un directorio enorme, entonces lo que suelo hacer es
Ejecute esto en otro terminal de PowerShell y se detendrá cuando termine.
fuente
Eliminar un árbol de carpetas completo a veces funciona y a veces falla con los errores "Directorio no vacío". Posteriormente, intentar verificar si la carpeta aún existe puede provocar errores de "Acceso denegado" o "Acceso no autorizado". No sé por qué sucede esto, aunque se puede obtener una idea de esta publicación de StackOverflow .
He podido solucionar estos problemas especificando el orden en que se eliminan los elementos dentro de la carpeta y agregando retrasos. Lo siguiente me funciona bien:
Un artículo de Microsoft TechNet Uso de propiedades calculadas en PowerShell me ayudó a obtener una lista de subcarpetas ordenadas por profundidad.
Se pueden resolver problemas de confiabilidad similares con RD / S / Q ejecutando DEL / F / S / Q antes de RD / S / Q y ejecutando el RD por segunda vez si es necesario, idealmente con una pausa en el medio (es decir, usando ping como se muestra abajo).
fuente
Muy simple:
fuente
Otro truco útil:
Si encuentra una gran cantidad de archivos con la misma convención de nombre o similar (como un archivo mac con el nombre de prefijo de punto ... esa famosa extracción de archivos), puede eliminarlos fácilmente con una sola línea de PowerShell como esta:
Esta línea eliminará todos los archivos con un punto al principio del nombre dentro del directorio actual, y todos los archivos con las mismas circunstancias dentro de otras carpetas dentro de este directorio también. Tenga cuidado al usarlo. :RE
fuente
rm -rf .*
? No tengo PowerShell para probar, pero creo que funcionará.Para eliminar el contenido completo, incluida la estructura de carpetas, use
El
-recurse
agregado aremove-item
garantiza que las solicitudes interactivas estén deshabilitadas.fuente
Escribió lo anterior para limpiar algunos archivos de registro sin eliminar el directorio principal y ¡esto funciona perfectamente!
fuente
fuente