Como Deletar Pastas Vazias no PowerShell
-
Cmdlet
Get-ChildItem
no PowerShell -
Cmdlet
Where-Object
no PowerShell - Excluir Itens de uma Coleção no PowerShell
- Conclusão

A gestão eficaz de diretórios é essencial na escrita de scripts em PowerShell, e o cmdlet Get-ChildItem
serve como uma pedra angular para navegar por sistemas de arquivos. Quando incumbido de limpar pastas vazias, percorrer hierarquias de pastas se torna crucial.
Este artigo explora o uso prático do Get-ChildItem
juntamente com outros cmdlets para identificar e remover sistematicamente diretórios vazios dentro de caminhos especificados. Ao aproveitar as poderosas capacidades de scripting do PowerShell, os usuários podem gerenciar diretórios de forma eficiente, garantindo um sistema de arquivos bem organizado.
Cmdlet Get-ChildItem
no PowerShell
O cmdlet Get-ChildItem
recupera todos os itens filhos (arquivos e pastas) para um local especificado. Quando há necessidade de excluir todas as pastas vazias em um determinado caminho de pasta, é imprescindível percorrer a hierarquia de pastas.
Portanto, o cmdlet Get-ChildItem
seria útil. Este cmdlet aceita parâmetros como Recurse
e Directory
para buscar itens filhos do tipo diretório e percorrer a estrutura da pasta recursivamente.
Sintaxe:
Get-ChildItem -Path -Directory -Recurse
Existem muitos mais parâmetros opcionais disponíveis para uso. Vamos criar uma estrutura de pastas como mostrado a seguir.
somepath/testA
testB
testD
testE
a.txt
testC
testF
b.txt
testG
testH
O objetivo é remover todas as pastas vazias dentro da pasta testA
. Portanto, as seguintes pastas devem ser excluídas.
testD
testG
testH
Vamos buscar todos os subdiretórios no caminho de pasta dado (somepath/testA
).
$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -Directory -Recurse
Neste trecho, atribuímos à variável $path
o caminho do diretório "D:\testA"
, e usamos o cmdlet Get-ChildItem
com os parâmetros -Directory
e -Recurse
para buscar todos os diretórios recursivamente a partir do caminho especificado. A lista resultante de diretórios é armazenada na variável $fetchedDirList
, nos dando uma coleção de objetos de diretório que representam todos os diretórios dentro de "D:\testA"
e seus subdiretórios.
Usar o alias gci
em vez de Get-ChildItem
é possível.
$fetchedDirList = gci $path -directory -Recurse
Transicionando do código original para esta versão revisada, continuamos a capturar os objetos de diretório recuperados usando o cmdlet Get-ChildItem
na variável $fetchedDirList
. No entanto, neste código atualizado, utilizamos o alias gci
em vez do nome completo do cmdlet Get-ChildItem
.
Esse atalho mantém a funcionalidade de buscar diretórios recursivamente a partir do caminho especificado $path
e armazená-los em $fetchedDirList
.
Vamos verificar a variável $fetchedDirList
.
$fetchedDirList
Saída:
Todos os diretórios e subdiretórios foram buscados como esperado.
Cmdlet Where-Object
no PowerShell
Precisamos filtrar os diretórios vazios do resultado acima. O cmdlet Where-Object
filtra objetos de uma coleção com base em suas propriedades.
O alias Where
pode ser usado em vez do comando Where-Object
. Precisamos filtrar a lista de diretórios acima com base na contagem de itens dentro de cada diretório.
A condição é mostrada a seguir.
where { (gci $_.fullName).count -eq 0 }
Quando o objeto dado da coleção tem 0 sub-itens, é considerado um diretório vazio. Portanto, devemos excluí-lo.
Vamos enviar a saída do passo anterior para o cmdlet Where
.
$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName).count -eq 0 }
Nesta linha de código, atribuímos à variável $emptyDirectoryList
o resultado da filtragem de diretórios a partir de $fetchedDirList
usando o alias Where
. A condição de filtragem, definida dentro de um bloco de script, verifica se a contagem de itens filhos dentro de cada diretório (recuperados usando gci $_.FullName
) é igual a 0.
Essa abordagem identifica e captura efetivamente apenas os objetos de diretório que representam diretórios vazios em $emptyDirectoryList
.
Vamos imprimir o $emptyDirectoryList
.
$emptyDirectoryList
Saída:
O resultado está perfeitamente correto. Obtivemos apenas duas pastas chamadas testD
e testH
com conteúdo vazio.
Podemos facilmente excluir cada objeto da coleção $emptyDirectoryList
. O cmdlet Remove-Item
pode ser usado para excluir um item.
Antes disso, precisamos buscar o caminho completo de cada um dos objetos dentro do $emptyDirectoryList
. O cmdlet Select-Object
pode buscar os objetos com sua propriedade FullName
.
$finalListToRemove = $emptyDirectoryList | select -ExpandProperty FullName
Nesta linha de código, criamos uma nova variável $finalListToRemove
extraindo os caminhos completos dos diretórios armazenados em $emptyDirectoryList
. Utilizamos o cmdlet Select-Object
com o parâmetro -ExpandProperty FullName
, permitindo-nos recuperar o valor da propriedade FullName
para cada objeto de diretório em $emptyDirectoryList
.
Como resultado, $finalListToRemove
contém uma lista de caminhos completos para os diretórios vazios, tornando-os prontos para remoção.
$finalListToRemove
Saída do $finalListToRemove
:
Agora temos a lista de pastas a serem removidas.
Excluir Itens de uma Coleção no PowerShell
É possível usar o cmdlet ForEach-Object
para iterar sobre os itens em uma coleção. Dentro do loop, podemos usar o cmdlet Remove-Item
.
$finalListToRemove | ForEach-Object { Remove-Item $_ }
O $_
denota o item atual na coleção. Isso excluirá as pastas testD
e testH
.
Há uma parte complicada aqui. Quando a pasta testH
é excluída, o diretório testG
também se torna vazio.
Portanto, precisamos modificar um pouco o script. Devemos executar o procedimento acima até que fiquemos com pastas não vazias.
Podemos usar o loop do...while
para fazer isso.
$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 )
Neste bloco de código, configuramos um loop para detectar e excluir sistematicamente diretórios vazios dentro do caminho designado e seus subdiretórios. Dentro do loop, primeiro usamos o cmdlet Get-ChildItem
para buscar todos os diretórios recursivamente a partir do caminho especificado.
Em seguida, filtramos os diretórios vazios usando o cmdlet Where-Object
. Após extrair os caminhos completos desses diretórios vazios, prosseguimos para removê-los um por um usando o cmdlet Remove-Item
dentro de um loop ForEach-Object
.
Esse loop itera enquanto houver diretórios vazios restantes para remoção, garantindo uma limpeza completa de diretórios vazios dentro do caminho especificado e seus subdiretórios.
Quando você precisar considerar os arquivos e pastas ocultos, podemos passar o parâmetro -Force
para o cmdlet Get-ChildItem
, como mostrado a seguir.
$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName -Force).count -eq 0 }
Saída:
Conclusão
No PowerShell, identificar e remover eficientemente pastas vazias é vital para manter um sistema de arquivos organizado. Por meio da utilização estratégica de cmdlets como Get-ChildItem
, Where-Object
e Remove-Item
, os usuários podem otimizar tarefas de gerenciamento de diretórios.
Esses cmdlets possibilitam a limpeza abrangente de diretórios dentro de caminhos especificados, melhorando a eficiência e organização do sistema. Ao aproveitar o ambiente de scripting do PowerShell, os usuários podem automatizar processos de gerenciamento de diretórios, economizando tempo e esforço, enquanto garantem um sistema de arquivos livre de desordem.
Com as robustas capacidades do PowerShell, a gestão de diretórios se torna um aspecto sem costura da administração do sistema, capacitando os usuários a manterem um desempenho ótimo do 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.