Public/Measure-FolderSize.ps1

<#
.SYNOPSIS
    Calculates the total size of files within a specified directory and its subdirectories.
 
.DESCRIPTION
    The Get-FolderSize function computes the total size of all files within a given directory
    and formats the output based on the size (bytes, KB, MB, GB, or TB).
 
.PARAMETER Share
    Specifies the directory path whose total size is to be calculated. This parameter is mandatory.
 
.EXAMPLE
    PS> Measure-FolderSize -Share "C:\Users\Public\Documents"
    This example calculates and displays the size of files in the "Documents" directory under "Public".
 
.OUTPUTS
    String
    Outputs the total size of the directory formatted as a string (e.g., "2.34 GB").
 
.NOTES
    This function handles large directories by skipping inaccessible files and folders.
#>


function Measure-FolderSize
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$Share
    )

    process
    {
        # Calculate the total size of all files in the directory, including subdirectories.
        $folderSize = Get-ChildItem -Path $Share -Recurse -Force -ErrorAction SilentlyContinue |
                      Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue

        # Format the output based on the size of the folder
        if ($folderSize.Sum -gt 1TB) {
            [string]::Format("{0:0.00} TB", $folderSize.Sum / 1TB)
        } elseif ($folderSize.Sum -gt 1GB) {
            [string]::Format("{0:0.00} GB", $folderSize.Sum / 1GB)
        } elseif ($folderSize.Sum -gt 1MB) {
            [string]::Format("{0:0.00} MB", $folderSize.Sum / 1MB)
        } elseif ($folderSize.Sum -gt 1KB) {
            [string]::Format("{0:0.00} kB", $folderSize.Sum / 1KB)
        } elseif ($folderSize.Sum -gt 0) {
            [string]::Format("{0:0.00} B", $folderSize.Sum)
        } else {
            "0 B"
        }
    }
}