diff --git a/Tools.ps1 b/Tools.ps1 index efed624..a174759 100644 --- a/Tools.ps1 +++ b/Tools.ps1 @@ -672,5 +672,56 @@ function Stop-MemoryHog ([string]$AppName,[int]$MemoryLimit) { } } +# Returns a formatted list of the largest or smallest files in a directory +function Get-FileSizes { + param( + [Parameter(ValueFromPipeline=$true)][string]$Path, + [switch]$Recurse, + [switch]$IncludeHidden, + [Parameter(ParameterSetName="largest")][int]$Largest, + [Parameter(ParameterSetName="smallest")][int]$Smallest, + [string]$Units, + [int]$Precision=2 + ) + + # If no path is specified, set $Path to the directory containing user profiles + If (-not $Path ) { + $Path = (Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' -Name ProfilesDirectory) + $Recurse = $true + $IncludeHidden = $false + } + + # Change the sort order depending on which parameter set was specified + Switch ( $PSCmdlet.ParameterSetName ) { + "largest" { $SortOrder = $true ; $Quantity = $Largest } + "smallest" { $SortOrder = $false ; $Quantity = $Smallest } + } + + # Set the units to show sizes in output + Switch ( $Units.ToUpper() ) { + "KB" { $UnitLabel = "Kilobytes (KB)" ; $Divisor = 1KB } + "MB" { $UnitLabel = "Megabytes (MB)" ; $Divisor = 1MB } + "GB" { $UnitLabel = "Gigabytes (GB)" ; $Divisor = 1GB } + "TB" { $UnitLabel = "Terabytes (TB)" ; $Divisor = 1TB } + default { $UnitLabel = "Bytes" ; $Divisor = 1 } + } + + # Get the file paths and sizes as specified + $FileSizes = Get-ChildItem $Path -Recurse:$Recurse -Force:$IncludeHidden -ErrorAction SilentlyContinue | + Sort-Object -Descending:$SortOrder -Property Length | + Select-Object -First $Quantity @{Name="File Path";Expression={$_.DirectoryName + '\' + $_.Name}}, @{Name=$UnitLabel;Expression={[Math]::Round($_.Length / $Divisor, $Precision)}} + + # Set output prefix + $prefix = "The ${Quantity} " + $PSCmdlet.ParameterSetName + " files found at ""${Path}""" + + # Output to console + $constr = "${prefix}" + $($FileSizes | Out-String) + Write-Output $constr + + # Output to log file + $logstr = "${prefix}" + $($FileSizes | Format-List | Out-String) + LogMsg $logstr +} + Setup-MSPDirectories Setup-LogFile \ No newline at end of file