Cómo eliminar carpetas vacías en PowerShell

  1. Cmdlet Get-ChildItem en PowerShell
  2. Cmdlet Where-Object en PowerShell
  3. Eliminar elementos de una colección en PowerShell
  4. Conclusión
Cómo eliminar carpetas vacías en PowerShell

La gestión efectiva de directorios es esencial en la scripting de PowerShell, y el cmdlet Get-ChildItem sirve como una piedra angular para navegar por los sistemas de archivos. Cuando se trata de limpiar carpetas vacías, recorrer las jerarquías de carpetas se vuelve crucial.

Este artículo profundiza en el uso práctico de Get-ChildItem junto con otros cmdlets para identificar y eliminar sistemáticamente directorios vacíos dentro de rutas específicas. Al aprovechar las poderosas capacidades de scripting de PowerShell, los usuarios pueden gestionar directorios de manera eficiente, asegurando un sistema de archivos bien organizado.

Cmdlet Get-ChildItem en PowerShell

El cmdlet Get-ChildItem recupera todos los elementos secundarios (archivos y carpetas) para una ubicación especificada. Cuando hay necesidad de eliminar todas las carpetas vacías en una ruta de carpeta dada, es imprescindible recorrer la jerarquía de carpetas.

Por lo tanto, el cmdlet Get-ChildItem sería útil. Este cmdlet acepta parámetros como Recurse y Directory para obtener elementos secundarios del tipo directorio y recorrer recursivamente la estructura de carpetas.

Sintaxis:

Get-ChildItem -Path -Directory -Recurse

Hay muchos más parámetros opcionales disponibles para usar. Vamos a crear una estructura de carpetas como se muestra a continuación.

somepath/testA
			testB
				testD
				testE
					a.txt
			testC
				testF
					b.txt
				testG
					testH

El propósito es eliminar todas las carpetas vacías dentro de la carpeta testA. Por lo tanto, las siguientes carpetas deberían ser eliminadas.

  1. testD
  2. testG
  3. testH

Vamos a recuperar todos los subdirectorios en la ruta de carpeta dada (somepath/testA).

$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -Directory -Recurse

En este fragmento, asignamos a la variable $path la ruta del directorio "D:\testA", y utilizamos el cmdlet Get-ChildItem con los parámetros -Directory y -Recurse para obtener todos los directorios recursivamente desde la ruta especificada. La lista resultante de directorios se almacena en la variable $fetchedDirList, dándonos una colección de objetos de directorio que representan todos los directorios dentro de "D:\testA" y sus subdirectorios.

Es posible usar el alias gci en lugar de Get-ChildItem.

$fetchedDirList = gci $path -directory -Recurse

Al pasar del código original a esta versión revisada, continuamos capturando los objetos de directorio recuperados utilizando el cmdlet Get-ChildItem en la variable $fetchedDirList. Sin embargo, en este código actualizado, utilizamos el alias gci en lugar del nombre completo del cmdlet Get-ChildItem.

Este atajo mantiene la funcionalidad de obtener directorios recursivamente de la ruta especificada $path y almacenarlos en $fetchedDirList.

Vamos a verificar la variable $fetchedDirList.

$fetchedDirList

Salida:

Obtener-ElementoHijo

Todos los directorios y subdirectorios se han recuperado como se esperaba.

Cmdlet Where-Object en PowerShell

Necesitamos filtrar los directorios vacíos de los resultados anteriores. El cmdlet Where-Object filtra objetos de una colección basándose en sus propiedades.

El alias Where se puede usar en lugar del comando Where-Object. Necesitamos filtrar la lista de directorios anterior basándonos en el conteo de elementos dentro de cada directorio.

La condición se muestra a continuación.

where { (gci $_.fullName).count -eq 0 }

Cuando el objeto dado de la colección tiene 0 subelementos, se considera un directorio vacío. Por lo tanto, debemos eliminarlo.

Vamos a enviar la salida del paso anterior al cmdlet Where.

$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName).count -eq 0 }

En esta línea de código, asignamos a la variable $emptyDirectoryList el resultado de filtrar directorios de $fetchedDirList utilizando el alias Where. La condición de filtrado, definida dentro de un bloque de script, verifica si el conteo de elementos secundarios dentro de cada directorio (recuperado usando gci $_.FullName) es igual a 0.

Este enfoque identifica y captura eficazmente solo los objetos de directorio que representan directorios vacíos en $emptyDirectoryList.

Imprimamos la lista $emptyDirectoryList.

$emptyDirectoryList

Salida:

Where-Object

El resultado es perfectamente correcto. Solo obtuvimos dos carpetas llamadas testD y testH con contenido vacío.

Podemos eliminar fácilmente cada objeto de la colección $emptyDirectoryList. Se puede usar el cmdlet Remove-Item para eliminar un elemento.

Antes de eso, necesitamos obtener la ruta completa de cada uno de los objetos dentro de $emptyDirectoryList. El cmdlet Select-Object puede recuperar los objetos con su propiedad FullName.

$finalListToRemove = $emptyDirectoryList | select -ExpandProperty FullName

En esta línea de código, creamos una nueva variable $finalListToRemove extrayendo las rutas completas de los directorios almacenados en $emptyDirectoryList. Utilizamos el cmdlet Select-Object con el parámetro -ExpandProperty FullName, que nos permite recuperar el valor de la propiedad FullName para cada objeto de directorio en $emptyDirectoryList.

Como resultado, $finalListToRemove contiene una lista de rutas completas a los directorios vacíos, preparándolos para su eliminación.

$finalListToRemove

Salida de $finalListToRemove:

finalListToRemove

Ahora tenemos la lista de carpetas que deben ser eliminadas.

Eliminar elementos de una colección en PowerShell

Es posible usar el cmdlet ForEach-Object para iterar a través de los elementos en una colección. Dentro del bucle, podemos usar el cmdlet Remove-Item.

$finalListToRemove | ForEach-Object { Remove-Item $_ }

El $_ denota el elemento actual en la colección. Esto eliminará las carpetas testD y testH.

Hay una parte complicada aquí. Cuando se elimina la carpeta testH, el directorio testG también se queda vacío.

Por lo tanto, necesitamos modificar el script un poco. Debemos ejecutar el procedimiento anterior hasta que nos queden carpetas no vacías.

Podemos usar el bucle do...while para hacer eso.

$path = "D:\testA"
do {
    $fetchedDirList = Get-ChildItem $path -Directory -Recurse
    $emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName).count -eq 0 }
    $finalListToRemove = $emptyDirectoryList | select -ExpandProperty FullName
    $finalListToRemove | ForEach-Object { Remove-Item $_ }
} while ( $finalListToRemove.count -gt 0 )

En este bloque de código, configuramos un bucle para detectar y eliminar sistemáticamente directorios vacíos dentro de la ruta designada y sus subdirectorios. Dentro del bucle, primero usamos el cmdlet Get-ChildItem para obtener todos los directorios recursivamente desde la ruta especificada.

Luego, filtramos los directorios vacíos utilizando el cmdlet Where-Object. Después de extraer las rutas completas de estos directorios vacíos, procedemos a eliminarlos uno por uno usando el cmdlet Remove-Item dentro de un bucle ForEach-Object.

Este bucle itera mientras haya directorios vacíos restantes para eliminar, asegurando una limpieza exhaustiva de los directorios vacíos dentro de la ruta especificada y sus subdirectorios.

Cuando necesite considerar los archivos y carpetas ocultos, podemos pasar el parámetro -Force al cmdlet Get-ChildItem, como se muestra a continuación.

$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName -Force).count -eq 0 }

Salida:

eliminar carpetas vacías de powershell - salida

Conclusión

En PowerShell, identificar y eliminar eficientemente carpetas vacías es vital para mantener un sistema de archivos organizado. A través de la utilización estratégica de cmdlets como Get-ChildItem, Where-Object y Remove-Item, los usuarios pueden simplificar las tareas de gestión de directorios.

Estos cmdlets permiten una limpieza integral de directorios dentro de rutas especificadas, mejorando la eficiencia y organización del sistema. Al aprovechar el entorno de scripting de PowerShell, los usuarios pueden automatizar los procesos de gestión de directorios, ahorrando tiempo y esfuerzo mientras aseguran un sistema de archivos libre de desorden.

Con las robustas capacidades de PowerShell, la gestión de directorios se convierte en un aspecto sin complicaciones de la administración del sistema, empoderando a los usuarios para mantener un rendimiento óptimo del sistema.

¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

Artículo relacionado - PowerShell Folder