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

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.
testD
testG
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:
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:
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
:
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:
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.
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.