Cómo eliminar recursivamente un directorio completo con PowerShell 2.0?


¿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 instrucción en la ayuda en línea de PowerShell V2 (que se encuentra usando Get-Help Remove-Item -Examples) que dice:

...Dado que el parámetro Recurse de este cmdlet es defectuoso, el comando usa el cmdlet Get-Childitem para obtener los archivos deseados, y utiliza el operador de canalización para pasarlos al cmdlet Remove-Item...

He visto varios ejemplos que utilizan Get-ChildItem y canalizar a Remove-Item, pero los ejemplos suelen quitar algunas conjunto de archivos basado en un filtro, no todo el directorio.

Estoy buscando la forma más limpia de soplar un directorio completo, archivos y directorios secundarios, sin generar ningún mensaje de advertencia al usuario utilizando la menor cantidad de código. Una sola línea sería bueno si es fácil de entender.

Author: Peter Mortensen, 2009-11-18

16 answers

Remove-Item -Recurse -Force some_dir

De hecho funciona como se anuncia aquí.

rm -r -fo some_dir

Son alias abreviados que también funcionan.

Por lo que entiendo, el parámetro -Recurse simplemente no funciona correctamente cuando intenta eliminar un conjunto filtrado de archivos recursivamente. Por matar un solo dir y todo por debajo parece funcionar bien.

 373
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 17:52:54

He utilizado:

rm -r folderToDelete

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

 31
Author: Tuan Jinn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 00:41:11

Al eliminar archivos recursivamente 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.

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 para que las hojas se eliminen antes que las raíces. La ordenación se realiza en el parámetro pspath ya que tiene más posibilidades de funcionar para otros proveedores que el sistema de archivos. El parámetro -Include es solo una conveniencia si desea filtrar los elementos a eliminar.

Se divide en dos funciones ya que me resulta útil ver lo que estoy a punto de eliminar ejecutando

Get-Tree some_dir | select fullname
 16
Author: John Rees,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-08 21:22:28
rm -r ./folder -Force    

...me funcionó

 9
Author: stevethecollier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-13 02:28:15

Use el comando DOS de la vieja escuela:

rd /s <dir>
 9
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-20 17:19:56

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

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue
 8
Author: steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-21 21:24:49

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 PS completa lista para copiar y pegar es:

& cmd.exe /c rd /S /Q $folderToDelete
 6
Author: Dejan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 12:54:08

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 intento eliminar el directorio recursivamente con la opción buggy-recurse. Después desciendo a cada sub-sub que queda y borro 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
        }
    }
}
 5
Author: jdoose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-16 09:34:44

Tomé otro enfoque inspirado por @john-rees arriba, especialmente cuando su enfoque comenzó a fallar para mí en algún momento. Básicamente recurse el subárbol y ordenar los archivos por su ruta-longitud - eliminar de más largo a 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-LiteralPath, aquí hay otro gotchya que puede estar golpeándote: https://superuser.com/q/212808

 2
Author: Peter McEvoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 10:04:24

Realmente simple:

remove-item -path <type in file or directory name>, press Enter
 1
Author: DusanV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 00:41:58

Otro truco útil:

Si encuentra muchos archivos con la misma convención de nombre o similar (como el archivo mac con el nombre de prefijo de punto... que la famosa extracción de archivos), puede eliminarlos fácilmente con una sola línea de powershell de la siguiente manera:

ls -r .* | rm

Esta línea va a 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. Sé consciente de ello cuando usándolo. : D

 1
Author: Daniel Alberto Lepe Ayala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-07 23:59:17

Eliminar un árbol de carpetas completo a veces funciona y a veces falla con errores de "Directorio no vacío". Posteriormente, intentar verificar si la carpeta todavía existe puede resultar en errores de "Acceso denegado" o "Acceso no autorizado". No sé por qué sucede esto, aunque se puede obtener cierta información de esta publicación de StackOverflow.

He podido sortear estos problemas especificando el orden en el que se eliminan los elementos de la carpeta y agregando retrasos. El 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 Usando Propiedades calculadas en PowerShell me fue útil para obtener una lista de subcarpetas ordenadas por profundidad.

Problemas de confiabilidad similares con RD /S /Qse pueden resolver ejecutando RD /S /Qdos veces, idealmente con una pausa en el medio (es decir, usando 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
 1
Author: MikeOnline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 19:10:23

Para eliminar el contenido completo, incluida la estructura de carpetas, use

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

El -recurse añadido a remove-item asegura que las indicaciones interactivas estén deshabilitadas.

 1
Author: steve simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-13 07:35:07

Usando commnads de PowerShell para eliminar todos los archivos y carpetas

Remove-Item-Path "C:\dotnet-helpers*.* "- recurse

Recurse profundiza y encuentra muchos más archivos. El parámetro - recurse permitirá a PowerShell eliminar cualquier elemento secundario sin pedir permiso.Además, el parámetro-force se puede agregar para eliminar archivos ocultos o de solo lectura.

Usando - Force command podemos eliminar archivos force completamente

Usando PowerShell comandos para eliminar todos los archivos de la fuerza completamente

Remove-Item-Path "C:\dotnet-helpers*.* "- Force

Con Ejemplo: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

 0
Author: thiyagu selvaraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-11 15:12:30
del <dir> -Recurse -Force # I prefer this, short & sweet

O

remove-item <dir> -Recurse -Force

Si tienes un directorio enorme entonces lo que normalmente hago es

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

Ejecute esto en otro terminal de powershell y se detendrá cuando termine.

 0
Author: Gajendra D Ambi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-24 10:30:07
$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ó lo anterior para limpiar algunos archivos de registro sin eliminar el directorio padre y esto funciona perfectamente!

 -1
Author: Tom Stevenson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-21 11:16:09