Eliminar carpetas vacías en PowerShell
-
Cmdlet
Get-ChildItem
en PowerShell -
Cmdlet
Dónde-Objeto
en PowerShell - Eliminar elementos de una colección 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.
pruebaD
pruebaG
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:
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:
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
:
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 }
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.