Individuare le cartelle a dimensione maggiore tramite Powershell

Talvolta può essere necessario cercare le cartelle che occupano più spazio in un determinato drive o path, tale attività può essere fatta tramite vari tools oppure tramite Powershell usando il cmdlet Get-ChildItem for FileSystem disponibile in Windows PowerShell 3.0 o successivo in cui sono stati resi disponibili una serie di attributi tra cui l’attributo Directory.

Per verificare la versione di PowerShell è possibile usare la variabile automatica $PSVersionTable che espone la versione di PowerShell presente nel sistema tramite la proprietà BuildVersion, a riguardo si veda About Automatic Variables.

Per ricavare l’elenco delle cartelle in un determinato path, specificato tramite la variabile $Path, è possibile usare il seguente comando PowerShell:

Get-ChildItem -Path $Path -Directory -Recurse

Una volta ricavato l’elenco delle cartelle è possibile ricavare la dimensione di ciascuna cartella calcolata sulla base della somma della dimensione dei file contenuti nella cartella stessa e nelle relative sottocartelle:

Get-ChildItem -Path $Path -Directory -Recurse | Select-Object FullName, @{Name=’Size’; Expression={((Get-ChildItem -File -Recurse $_.FullName | Measure-Object Length -Sum).Sum)}}

Con un approccio analogo è possibile ricavare il numero dei file contenuti in ciascuna cartella e nelle relative sottocartelle:

Get-ChildItem -Path $Path -Directory -Recurse | Select-Object FullName, @{Name=’Files’; Expression={((Get-ChildItem -Path $_.FullName -File -Recurse | Measure-Object Length -Sum).Count)}}

Per finire analogamente è possibile ricavare il numero di sottocartelle per ciascuna cartella:

Get-ChildItem -Path $Path -Directory -Recurse | Select-Object FullName, @{Name=’Subfolders’; Expression={(Get-ChildItem -Path $_.FullName -Directory -Recurse | Measure-Object).Count}}

Dopo aver ottenuto l’elenco di directory nel path (FullName), la loro dimensione (Size), il numero di file (Files) e il numero delle sottocartelle (Subfolders) è possibile formattare il risultato per visualizzare il percorso relativo delle cartelle, la dimensione in MB, il numero di file e il numero di sottocartelle con i seguenti comandi

Select-Object @{Name=’Folder’; Expression={($_.FullName).Substring($Path.Length+1)}}, @{Name=’Size [MB]’; Expression={[Math]::Round($_.Size / 1GB, 0).ToString(‘#,##0.##’).PadLeft(8)}}, Files, Subfolders

Di seguito un esempio dei comandi PowerShell per generare un report delle 10 cartelle a dimensione maggiore in un determinato path visualizzando il percorso relativo delle cartelle, la dimensione in MB e il numero di sottocartelle:

$Path=”E:\Software”

$FirstLargestDirectories=10

 

Get-ChildItem -Path $Path -Directory -Recurse | Select-Object FullName, @{Name=’Size’; Expression={((Get-ChildItem -Path $_.FullName -File -Recurse | Measure-Object Length -Sum).Sum)}}, @{Name=’Files’; Expression={((Get-ChildItem -Path $_.FullName -File -Recurse | Measure-Object Length -Sum).Count)}}, @{Name=’Subfolders’; Expression={(Get-ChildItem -Path $_.FullName -Directory -Recurse | Measure-Object).Count}} | Sort-Object Size -Descending | Select-Object @{Name=’Folder’; Expression={($_.FullName).Substring($Path.Length+1)}}, @{Name=’Size [GB]’; Expression={[Math]::Round($_.Size / 1GB, 2).ToString(‘#,##0.##’).PadLeft(8)}}, Files, Subfolders -First $FirstLargestDirectories

Di seguito invece le proprietà da esplora risorse della prima delle cartelle a dimensione maggiore restituite dai comandi PowerShell:

Per un esempio di script che esegue questo tipo di analisi è possibile vedere lo script Get-LargestTopFolders.ps1 che ho memorizzato nel mio repository su GitHub https://github.com/ermannog/PowerShell/tree/master/Get-LargestTopFolders.