Come eliminare cartelle vuote in PowerShell
-
Cmdlet
Get-ChildItem
in PowerShell -
Cmdlet
Where-Object
in PowerShell - Eliminare elementi da una collezione in PowerShell
- Conclusione

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