Como Deletar Pastas Vazias no PowerShell

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

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.

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

Get-ChildItem

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:

Onde-Objeto

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:

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:

powershell deletar pastas vazias - 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.

Está gostando dos nossos tutoriais? Inscreva-se no DelftStack no YouTube para nos apoiar na criação de mais vídeos tutoriais de alta qualidade. Inscrever-se
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.

Artigo relacionado - PowerShell Folder