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.
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.
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).
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
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ó
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>
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
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
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
}
}
}
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
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
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
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
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.
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/
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.
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!
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