Eliminar carpetas vacías en PowerShell

Migel Hewage Nimesha 20 junio 2023
  1. Cmdlet Get-ChildItem en PowerShell
  2. Cmdlet Dónde-Objeto en PowerShell
  3. Eliminar elementos de una colección en PowerShell
Eliminar carpetas vacías en PowerShell

Este artículo muestra formas de eliminar carpetas vacías en PowerShell.

Cmdlet Get-ChildItem en PowerShell

El cmdlet Get-ChildItem recupera todos los elementos secundarios (archivos y carpetas) de una ubicación específica. Cuando es necesario eliminar todas las carpetas vacías en una ruta de carpeta determinada, 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 de 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, se deben eliminar las siguientes carpetas.

  1. pruebaD
  2. pruebaG
  3. pruebaH

Busquemos todos los subdirectorios en la ruta de la carpeta dada (somepath/testA).

$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -directory -recurse

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

$fetchedDirList = gci $path -directory -recurse

Comprobemos la variable $fetchedDirList.

$fetchedDirList

Producción:

Obtener elemento secundario

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

Cmdlet Dónde-Objeto en PowerShell

Necesitamos filtrar los directorios vacíos del resultado anterior. El cmdlet Where-Object filtra objetos de una colección en función de sus propiedades.

El alias Dónde se puede utilizar en lugar del comando Dónde-Objeto. Necesitamos filtrar la lista de directorios anterior en función del recuento 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.

Canalicemos la salida del paso anterior al cmdlet Dónde.

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

Imprimamos el $emptyDirectoryList.

$emptyDirectoryList

Producción:

Donde-Objeto

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

Podemos eliminar fácilmente cada objeto de la colección $emptyDirectoryList. El cmdlet Remove-Item se puede usar 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

Salida de $finalListToRemove:

finalListToRemove

Ahora tenemos la lista de carpetas para eliminar.

Eliminar elementos de una colección en PowerShell

Es posible utilizar el cmdlet ForEach-Object para recorrer los elementos de una colección. Dentro del ciclo, 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 queda vacío.

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

Podemos usar el ciclo 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 )

Aquí, ejecutamos el ciclo while hasta que la lista de carpetas vacías se convierte en 0. Cuando necesite considerar los archivos y carpetas ocultos, podemos pasar el parámetro -Force al cmdlet Get-ChildItem como se muestra en la siguiente.

$emptyDirectoryList = $fetchedDirList | Where { (gci $_.fullName -Force).count -eq 0 }
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