Búsqueda de sitios web

Cómo eliminar carpetas con PowerShell Remove-Item


Eliminar carpetas y limpiar directorios puede ser una tarea que requiere mucho tiempo, especialmente cuando necesitas realizar la misma tarea en varias computadoras. Con PowerShell podemos crear fácilmente un pequeño script para buscar y eliminar todas las carpetas que queramos.

La ventaja de PowerShell es que nos permite eliminar no sólo una única carpeta, sino directorios completos o sólo carpetas con un nombre concreto. También es posible eliminar sólo carpetas vacías, por ejemplo.

En este artículo, veremos cómo eliminar carpetas con PowerShell y cómo usar las diferentes opciones para eliminar solo carpetas específicas.

Eliminar carpetas con PowerShell

Para eliminar carpetas con PowerShell necesitaremos usar el cmdlet Remove-Item. Este cmdlet no sólo se puede utilizar para eliminar carpetas, sino también para eliminar archivos, claves de registro y más. Nos centraremos en eliminar carpetas en este artículo.

El cmdlet Remove-Item viene con un par de parámetros que podemos usar para especificar la carpeta que queremos eliminar:

-Path

Especifique la ruta de los elementos que deben eliminarse.

-LiteralPath

La ruta exacta del artículo.

-Include

Especifica un elemento de ruta para incluir, por ejemplo, *.txt

-Exclude

Especifica un elemento de ruta para excluir, por ejemplo, *.txt

-Recurse

Eliminar elementos en la ubicación especificada y en todas las subcarpetas

-Force

Se utiliza para eliminar archivos de solo lectura o elementos ocultos.

-Confirm

Solicitar confirmación

-WhatIf

Ejecute el comando en modo de prueba. No borrará nada

Para eliminar una sola carpeta en PowerShell, necesitaremos especificar la ruta completa a la carpeta. Es bueno saber que este comando eliminará la carpeta con todo su contenido, incluso si no ha especificado el parámetro -recurse. Sin embargo, recibirá una advertencia si no ha utilizado el parámetro -recurse y la carpeta contiene contenido.

Por lo tanto, es importante que verifique si tiene la carpeta correcta antes de eliminarla. Por eso recomiendo ejecutar el comando primero con el parámetro -WhatIf para comprobar el resultado:

# Remove the folder D:\testfiles\folder in test mode
Remove-Item -Path "D:\testfiles\folder" -WhatIf

En el siguiente ejemplo, la carpeta no estaba vacía. Entonces necesitaremos confirmar que queremos eliminar la carpeta y el contenido.

La última línea, What If, muestra qué operación se realiza en la ruta de destino:

En lugar de -WhatIf también podemos forzar el mensaje de confirmación. De esta manera aún puedes verificar si estás eliminando la carpeta correcta y confirmar la acción antes de eliminarla.

Remove-Item -Path "D:\testfiles\empty folder" -Confirm

# Result:
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove Directory" on target "D:\testfiles\empty folder".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

Eliminar carpeta y contenido

Cuando desee eliminar una carpeta y todo su contenido con PowerShell, debe usar el parámetro -Recurse. De esta manera se eliminarán todas las subcarpetas y archivos del directorio indicado. El parámetro no dará ninguna advertencia, simplemente eliminará todo el contenido.

El siguiente comando eliminará la “Carpeta A” y su contenido:

# Delete folder A and all contents
Remove-Item -Path "D:\testfiles\folder A" -Recurse

Si solo deseas eliminar todo el contenido que está dentro de la “carpeta A”, entonces debemos usar un comodín dentro del parámetro -path:

# Delete all subfolders and content inside Folder A
Remove-Item -Path "D:\testfiles\folder A\*" -Recurse

Forzar eliminación de carpeta

Cuando intenta eliminar una carpeta que contiene elementos de solo lectura o elementos que están en uso, recibirá un mensaje de error que indica que no tiene suficientes derechos de acceso para realizar esta operación.

Para eliminar una carpeta que contiene un elemento de solo lectura, archivos ocultos o archivos que están en uso, puede usar el parámetro -Force:

Remove-Item -Path "D:\testfiles\folder B" -Force

# or in short:
rm -r -force "D:\testfiles\folder"

Eliminar varias carpetas

Para eliminar varias carpetas con un solo comando, podemos especificar varias rutas o utilizar una de las opciones de filtrado. Explicaré los filtros más adelante en este artículo. Puede especificar varias carpetas para eliminar utilizando una cadena separada por comas:

Remove-Item -Path "D:\testfiles\folder d", "D:\testfiles\folder e" -Recurse

Otra opción es crear una matriz con todas las rutas y recorrerlas con una declaración foreach.

Eliminar carpeta si existe

Cuando se utiliza el cmdlet Remove-Item dentro de los scripts, es una buena idea probar si la carpeta existe antes de intentar eliminarla. Podemos hacer esto usando el cmdlet Test-Path. Esto comprobará si la carpeta existe y devolverá true o false según el resultado. Al usar esto dentro de una declaración if, podemos asegurarnos de que la carpeta solo se elimine si existe:

$folder = "D:\testfiles\folder B"

if (Test-Path -Path $folder ) {
    Remove-Item -Path $folder
}

Usar filtros para eliminar carpetas en PowerShell

Ahora hemos visto los principios básicos para eliminar una carpeta con PowerShell. Pero además de eliminar una carpeta de una ruta específica, a menudo te encuentras con situaciones en las que necesitas eliminar todas las carpetas que tienen más de x días o que contienen una palabra específica en el nombre de la carpeta.

Existen un par de métodos para seleccionar solo las carpetas que necesitamos eliminar en PowerShell. Pero con todos los métodos, asegúrese de probar la selección primero antes de eliminar las carpetas.

Usando el filtro de inclusión

El filtro -include le permite especificar una parte de la cadena que debe contener el archivo o carpeta que desea eliminar. Funciona en combinación con el carácter comodín en la ruta.

Es importante tener en cuenta aquí que se eliminan tanto los archivos como las carpetas que contienen el nombre de pila. Por ejemplo, para eliminar todas las carpetas (y por tanto también los archivos) que contengan la palabra prueba:

Remove-Item -Path "D:\testfiles\folder c\*" -Include "*test*"

También puede especificar varias palabras clave para el filtro de inclusión, simplemente sepárelas con una coma.

Usando el filtro de exclusión

Con el filtro -exclude podemos eliminar todo el contenido de una carpeta específica, excepto las carpetas que tengan una palabra específica en el nombre. Nuevamente, el filtro funciona tanto en archivos como en carpetas, por lo que no se eliminarán todos los archivos que coincidan con el filtro.

Por ejemplo, para eliminar todos los archivos y carpetas de la ruta especificada, excepto el contenido de la carpeta “la-test-folder”, podemos hacer:

Remove-Item -Path "D:\testfiles\folder c\*" -Exclude "la-test-folder"

Al igual que con el filtro de inclusión, puede utilizar un comodín en la cadena de exclusión o varias cadenas específicas (nombres de carpetas) para que coincidan.

Eliminar carpetas anteriores a

Una situación que es bastante común es eliminar todas las carpetas que tengan más de x días. Para hacer esto primero necesitaremos calcular la fecha de la carpeta. Digamos que queremos eliminar todas las carpetas que tengan más de 30 días. El primer paso es obtener la fecha de hace 30 días:

# Get the date from today minus 30 days
$dateTime = (Get-Date).AddDays(-30)

El siguiente paso es obtener todas las carpetas de la ruta indicada que sean anteriores a la fecha indicada. Podemos hacer esto comparando el lastwritetime de la carpeta con el datetime que calculamos:

Get-ChildItem -Path $Path -Recurse -Directory | Where-Object { $_.LastWriteTime -lt $dateTime }

Ahora solo tenemos que canalizar el cmdlet Remove-Item detrás de él para eliminar la carpeta y su contenido. Nuevamente, primero pruebe los resultados con el parámetro -WhatIf antes de eliminar las carpetas.

$dateTime = (Get-Date).AddDays(-30)
$path = "d:\testfiles\"

Get-ChildItem -Path $Path -Recurse -Directory | Where-Object { $_.LastWriteTime -lt $dateTime } | Remove-Item -Recurse -WhatIf

Eliminar carpetas vacías

Para eliminar sólo carpetas vacías con PowerShell, necesitarás crear un pequeño script. El script deberá verificar cada subcarpeta en la carpeta dada si contiene elementos o no. Sólo cuando no contenga ningún elemento se podrá eliminar la carpeta.

Creé un script que puedes usar para eliminar carpetas vacías; puedes encontrar el script en este artículo.

Terminando

PowerShell es una gran herramienta cuando necesita eliminar varias carpetas o desea limpiar un directorio en particular automáticamente. Tenga en cuenta que el cmdlet Remove-Item también se usa para eliminar archivos, así que asegúrese de probar sus scripts antes de usarlos.

Además, tenga en cuenta que sus archivos se eliminan permanentemente y no irán a la papelera de reciclaje.

Espero que este artículo te haya resultado útil. Si tienes alguna pregunta, deja un comentario a continuación.

Artículos relacionados