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.