Come eliminare cartelle vuote in PowerShell

  1. Cmdlet Get-ChildItem in PowerShell
  2. Cmdlet Where-Object in PowerShell
  3. Eliminare elementi da una collezione in PowerShell
  4. Conclusione
Come eliminare cartelle vuote in PowerShell

La gestione efficace delle directory è essenziale nello scripting di PowerShell, e il cmdlet Get-ChildItem funge da pietra miliare per la navigazione nei file system. Quando si tratta di pulire le cartelle vuote, attraversare le gerarchie delle cartelle diventa cruciale.

Questo articolo esplora l’uso pratico di Get-ChildItem insieme ad altri cmdlet per identificare e rimuovere sistematicamente le directory vuote all’interno di percorsi specificati. Sfruttando le potenti capacità di scripting di PowerShell, gli utenti possono gestire le directory in modo efficiente, garantendo un file system ben organizzato.

Cmdlet Get-ChildItem in PowerShell

Il cmdlet Get-ChildItem recupera tutti gli elementi figlio (file e cartelle) per una posizione specificata. Quando c’è bisogno di eliminare tutte le cartelle vuote in un dato percorso di cartella, è necessario attraversare la gerarchia delle cartelle.

Pertanto, il cmdlet Get-ChildItem sarebbe utile. Questo cmdlet accetta parametri come Recurse e Directory per recuperare elementi figlio di tipo directory e attraversare ricorsivamente la struttura delle cartelle.

Sintassi:

Get-ChildItem -Path -Directory -Recurse

Ci sono molti più parametri opzionali disponibili da utilizzare. Creiamo una struttura di cartelle come mostrato nel seguente.

somepath/testA
			testB
				testD
				testE
					a.txt
			testC
				testF
					b.txt
				testG
					testH

Lo scopo è rimuovere tutte le cartelle vuote all’interno della cartella testA. Pertanto, le seguenti cartelle dovrebbero essere eliminate.

  1. testD
  2. testG
  3. testH

Recuperiamo tutte le sottodirectory nel percorso di cartella specificato (somepath/testA).

$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -Directory -Recurse

In questo frammento, assegniamo alla variabile $path il percorso della directory "D:\testA", e utilizziamo il cmdlet Get-ChildItem con i parametri -Directory e -Recurse per recuperare tutte le directory ricorsivamente dal percorso specificato. L’elenco risultante delle directory è memorizzato nella variabile $fetchedDirList, fornendoci una collezione di oggetti directory che rappresentano tutte le directory all’interno di "D:\testA" e delle sue sottodirectory.

È possibile utilizzare l’alias gci invece di Get-ChildItem.

$fetchedDirList = gci $path -directory -Recurse

Passando dal codice originale a questa versione rivisitata, continuiamo a catturare gli oggetti directory recuperati utilizzando il cmdlet Get-ChildItem nella variabile $fetchedDirList. Tuttavia, in questo codice aggiornato, utilizziamo l’alias gci invece del nome completo del cmdlet Get-ChildItem.

Questo abbreviazione mantiene la funzionalità di recuperare le directory ricorsivamente dal percorso specificato $path e di memorizzarle in $fetchedDirList.

Controlliamo la variabile $fetchedDirList.

$fetchedDirList

Output:

Get-ChildItem

Tutte le directory e sottodirectory sono state recuperate come previsto.

Cmdlet Where-Object in PowerShell

Dobbiamo filtrare le directory vuote dal risultato precedente. Il cmdlet Where-Object filtra gli oggetti da una collezione in base alle loro proprietà.

L’alias Where può essere utilizzato invece del comando Where-Object. Dobbiamo filtrare l’elenco delle directory sopra in base al conteggio degli elementi all’interno di ogni directory.

La condizione è mostrata nel seguente.

where { (gci $_.fullName).count -eq 0 }

Quando l’oggetto dato dalla collezione ha 0 elementi secondari, è considerato una directory vuota. Pertanto, dobbiamo eliminarlo.

Colleghiamo l’output del passo precedente al cmdlet Where.

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

In questa riga di codice, assegnamo alla variabile $emptyDirectoryList il risultato del filtraggio delle directory da $fetchedDirList utilizzando l’alias Where. La condizione di filtraggio, definita all’interno di un blocco di script, verifica se il conteggio degli oggetti figlio all’interno di ogni directory (recuperato utilizzando gci $_.FullName) è uguale a 0.

Questo approccio identifica e cattura effettivamente solo gli oggetti directory che rappresentano directory vuote in $emptyDirectoryList.

Stampiamo la $emptyDirectoryList.

$emptyDirectoryList

Output:

Dove-Oggetto

Il risultato è assolutamente corretto. Abbiamo ottenuto solo due cartelle chiamate testD e testH con contenuto vuoto.

Possiamo facilmente eliminare ciascun oggetto dalla collezione $emptyDirectoryList. Il cmdlet Remove-Item può essere utilizzato per eliminare un elemento.

Prima di ciò, dobbiamo recuperare il percorso completo di ciascuno degli oggetti all’interno di $emptyDirectoryList. Il cmdlet Select-Object può recuperare gli oggetti con la sua proprietà FullName.

$finalListToRemove = $emptyDirectoryList | select -ExpandProperty FullName

In questa riga di codice, creiamo una nuova variabile $finalListToRemove estraendo i percorsi completi delle directory memorizzate in $emptyDirectoryList. Utilizziamo il cmdlet Select-Object con il parametro -ExpandProperty FullName, che ci consente di recuperare il valore della proprietà FullName per ciascun oggetto directory in $emptyDirectoryList.

Di conseguenza, $finalListToRemove contiene un elenco di percorsi completi delle directory vuote, rendendole pronte per la rimozione.

$finalListToRemove

Output di $finalListToRemove:

finalListToRemove

Ora abbiamo l’elenco delle cartelle da rimuovere.

Eliminare elementi da una collezione in PowerShell

È possibile utilizzare il cmdlet ForEach-Object per scorrere gli elementi in una collezione. All’interno del ciclo, possiamo utilizzare il cmdlet Remove-Item.

$finalListToRemove | ForEach-Object { Remove-Item $_ }

Il $_ denota l’elemento corrente nella collezione. Questo eliminerà le cartelle testD e testH.

C’è una parte complicata qui. Quando la cartella testH viene eliminata, la directory testG diventa vuota anch’essa.

Pertanto, dobbiamo modificare un po’ lo script. Dobbiamo eseguire la procedura precedente finché non ci rimangono cartelle non vuote.

Possiamo utilizzare il ciclo do...while per farlo.

$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 )

In questo blocco di codice, impostiamo un ciclo per rilevare e eliminare sistematicamente le directory vuote all’interno del percorso designato e delle sue sottodirectory. All’interno del ciclo, utilizziamo per prima cosa il cmdlet Get-ChildItem per recuperare tutte le directory ricorsivamente dal percorso specificato.

Quindi, filtriamo le directory vuote utilizzando il cmdlet Where-Object. Dopo aver estratto i percorsi completi di queste directory vuote, procediamo a rimuoverle una per una utilizzando il cmdlet Remove-Item all’interno di un ciclo ForEach-Object.

Questo ciclo itera finché ci sono directory vuote rimaste da rimuovere, garantendo una pulizia approfondita delle directory vuote all’interno del percorso specificato e delle sue sottodirectory.

Quando è necessario considerare i file e le cartelle nascoste, possiamo passare al cmdlet Get-ChildItem il parametro -Force, come mostrato nel seguente.

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

Output:

powershell elimina cartelle vuote - output

Conclusione

In PowerShell, identificare ed eliminare in modo efficiente le cartelle vuote è vitale per mantenere un file system organizzato. Attraverso l’utilizzo strategico di cmdlet come Get-ChildItem, Where-Object e Remove-Item, gli utenti possono semplificare i compiti di gestione delle directory.

Questi cmdlet abilitano una pulizia completa delle directory all’interno di percorsi specificati, migliorando l’efficienza e l’organizzazione del sistema. Sfruttando l’ambiente di scripting di PowerShell, gli utenti possono automatizzare i processi di gestione delle directory, risparmiando tempo e fatica mentre garantiscono un file system senza ingombri.

Con le robuste capacità di PowerShell, la gestione delle directory diventa un aspetto senza soluzione di continuità dell’amministrazione di sistema, consentendo agli utenti di mantenere prestazioni ottimali del sistema.

Ti piacciono i nostri tutorial? Iscriviti a DelftStack su YouTube per aiutarci a creare altre guide video di alta qualità. Iscriviti
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.

Articolo correlato - PowerShell Folder