Pregunta

¿Cuál es la forma más sencilla de eliminar por la fuerza 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 establece:

...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 utilizan Get-ChildItem y canalizarlo a Remover el artículo, pero los ejemplos normalmente eliminan algún conjunto de archivos según 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 para el usuario utilizando la menor cantidad de código.Sería bueno una frase breve si fuera fácil de entender.

¿Fue útil?

Solución

Remove-Item -Recurse -Force some_dir

en realidad funciona como se anuncia aquí.

rm -r -fo some_dir

son alias de taquigrafía que funcionan también.

Por lo que he entendido, el parámetro -Recurse simplemente no funciona correctamente cuando se trate de eliminar un conjunto filtrado de archivos de forma recursiva. Por matar a un solo directorio y todo por debajo de lo que parece funcionar bien.

Otros consejos

He utilizado:

rm -r folderToDelete

Esto funciona para mí como un encanto (lo robé a Ubuntu).

Al borrar archivos de forma recursiva utilizando una sencilla Remove-Item "folder" -Recurse a veces veo un error intermitente: [folder] cannot be removed because it is not empty.

Esta respuesta intenta evitar que el error de forma individual mediante la supresión de los archivos.

function Get-Tree($Path,$Include='*') { 
    @(Get-Item $Path -Include $Include -Force) + 
        (Get-ChildItem $Path -Recurse -Include $Include -Force) | 
        sort pspath -Descending -unique
} 

function Remove-Tree($Path,$Include='*') { 
    Get-Tree $Path $Include | Remove-Item -force -recurse
} 

Remove-Tree some_dir

Un detalle importante es la clasificación de todos los elementos con pspath -Descending modo que las hojas se eliminan antes de que las raíces. La ordenación se realiza en el parámetro pspath ya que tiene más posibilidades de trabajo para los proveedores que no sean el sistema de archivos. El parámetro -Include es sólo una conveniencia, si desea filtrar los elementos que desea eliminar.

Está dividida en dos funciones, ya me resulta útil para ver lo que estoy a punto de borrar mediante la ejecución

Get-Tree some_dir | select fullname
rm -r ./folder -Force    

... trabajado para mí

Trate de este ejemplo. Si no existe el directorio, no se produce ningún error. Es posible que necesite PowerShell v3.0.

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue

Utilice el comando de la vieja escuela DOS:

rd /s <dir>

Para evitar el "El directorio no está vacío" errores de la respuesta aceptada, sólo tiene que utilizar el buen dominio de edad DOS como se sugirió anteriormente. La sintaxis PS completo listo para copiar y pegar es:

& cmd.exe /c rd /S /Q $folderToDelete

Por alguna razón respuesta John Rees' a veces no funcionaba en mi caso. Pero me llevó en la dirección siguiente. En primer intento eliminar el directorio de forma recursiva con la opción -recurse buggy. Posteriormente, desciendo en cada subdirectorio que queda y eliminar todos los archivos.

function Remove-Tree($Path)
{ 
    Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue

    if (Test-Path "$Path\" -ErrorAction silentlycontinue)
    {
        $folders = Get-ChildItem -Path $Path –Directory -Force
        ForEach ($folder in $folders)
        {
            Remove-Tree $folder.FullName
        }

        $files = Get-ChildItem -Path $Path -File -Force

        ForEach ($file in $files)
        {
            Remove-Item $file.FullName -force
        }

        if (Test-Path "$Path\" -ErrorAction silentlycontinue)
        {
            Remove-Item $Path -force
        }
    }
}

Tomé otro enfoque inspirado en @john-rees arriba, especialmente cuando su enfoque comenzó a fallarme en algún momento.Básicamente, recurra al subárbol y ordene los archivos por la longitud de su ruta: elimine del más largo al más corto.

Get-ChildItem $tfsLocalPath -Recurse |  #Find all children
    Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} |  #Calculate the length of their path
    Sort-Object PathLength -Descending | #sort by path length descending
    %{ Get-Item -LiteralPath $_.FullName } | 
    Remove-Item -Force

Con respecto a la magia de -LiteralPath, aquí hay otro problema que puede estar afectando: https://superuser.com/q/212808

Realmente simple:

remove-item -path <type in file or directory name>, press Enter

Otro truco útil:

Si usted encuentra una gran cantidad de archivos con igual o similar convención de nombres (como archivos de Mac con el prefijo del nombre de punto ... ese famoso pulltion archivo), puede quitar fácilmente con una sola línea de la PowerShell como esto:

ls -r .* | rm

Esta línea se va a eliminar todos los archivos con un punto en el comienzo del nombre dentro del directorio actual y todos los archivos con mismas circunstancias dentro de otras carpetas dentro de este directorio también. Sea consciente de ello cuando se la usa. : D

La eliminación de un árbol de carpeta entera a veces funciona ya veces falla con errores "directorio no está vacío". Posteriormente tratar de verificar si la carpeta existe todavía puede dar lugar a "Acceso denegado" o errores de "acceso no autorizado". No sé por qué sucede esto, aunque alguna información puede ser obtenida de este stackoverflow publicar .

he sido capaz de conseguir alrededor de estos temas especificando el orden en el que se eliminan elementos de la carpeta, y por los retrasos adición. La siguiente funciona bien para mí:

# First remove any files in the folder tree
Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force

# Then remove any sub-folders (deepest ones first).    The -Recurse switch may be needed despite the deepest items being deleted first.
ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force }

# Then remove the folder itself.  The -Recurse switch is sometimes needed despite the previous statements.
Remove-Item -LiteralPath $FolderToDelete -Recurse -Force

# Finally, give Windows some time to finish deleting the folder (try not to hurl)
Start-Sleep -Seconds 4

Un artículo de Microsoft TechNet utilización de las propiedades calculadas en PowerShell fue útil a mí en conseguir una lista de sub-carpetas ordenadas por la profundidad.

problemas de fiabilidad similar con RD / S / Q puede ser resuelto mediante la ejecución de RD / S / Q dos veces - idealmente con una pausa en el medio (es decir, utilizando ping como se muestra a continuación).

RD /S /Q "C:\Some\Folder\to\Delete" > nul
if exist "C:\Some\Folder\to\Delete"  ping -4 -n 4 127.0.0.1 > nul
if exist "C:\Some\Folder\to\Delete"  RD /S /Q "C:\Some\Folder\to\Delete" > nul

Para borrar el contenido completo incluyendo la estructura de carpetas uso

get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}

El -recurse añadido a remove-item asegura mensajes interactivos están desactivados.

del <dir> -Recurse -Force # I prefer this, short & sweet

o

remove-item <dir> -Recurse -Force

Si usted tiene un directorio enorme entonces lo que suelo hacer es

while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}

Ejecutar este en otro terminal de PowerShell y se detendrá cuando se hace.

$users = get-childitem \\ServerName\c$\users\ | select -ExpandProperty name

foreach ($user in $users)

{
remove-item -path "\\Servername\c$\Users\$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse
Write-Warning "$user Cleaned"
}

escribió el anterior para limpiar algunos archivos de registro sin borrar el directorio padre y esto funciona perfectamente!

rm -r <folder_name>
c:\>rm -r "my photos"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top