Back
Featured image of post PowerShell: Get the size of a given folder in a human readable format

PowerShell: Get the size of a given folder in a human readable format

As a long time Linux/macOS User I use du (disk usage) a lot.

Here is a small PowerShell Script that does a similar thing.

function Get-DirectorySize
{
   <#
         .SYNOPSIS
         Get the size of a given folder in a human readable format

         .DESCRIPTION
         Get the size of a given folder in a human readable format

         .PARAMETER Path
         Folder to check

         .PARAMETER Type
         Type of the Return,
         Valid values are: GB, MB, KB, B
         The default is MB (Megabyte)

         .EXAMPLE
         PS C:\> Get-DirectorySize -Path 'C:\scripts'

         .EXAMPLE
         PS C:\> Get-DirectorySize -Path 'C:\scripts' -Type GB

         .NOTES
         PowerShell function to emulate the wel known Linux DU command

         Version: 1.0.0

         GUID: e559f754-f1aa-4376-8c28-dea035fe2c5a

         Author: Joerg Hochwald

         Companyname: Alright IT GmbH

         Copyright: Copyright (c) 2019, Alright IT GmbH - All rights reserved.

         License: https://opensource.org/licenses/BSD-3-Clause

         Releasenotes:
         1.0.0 2019-05-09: Initial Release

         THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
   #>

   [CmdletBinding(ConfirmImpact = 'None')]
   [OutputType([string])]
   param
   (
      [Parameter(ValueFromPipeline,
      ValueFromPipelineByPropertyName)]
      [ValidateNotNullOrEmpty()]
      [Alias('Directory', 'Folder')]
      [string]
      $Path = '.',
      [Parameter(ValueFromPipeline,
      ValueFromPipelineByPropertyName)]
      [ValidateNotNullOrEmpty()]
      [ValidateSet('GB', 'MB', 'KB', 'B', IgnoreCase = $true)]
      [Alias('InType')]
      [string]
      $Type = 'MB'
   )

   process
   {
      try
      {
         $AllFolderItems = (Get-ChildItem -Path $Path -Recurse -ErrorAction Stop | Measure-Object -Property length -Sum)

         switch ($Type)
         {
            'GB'
            {
               $FolderSize = '{0:N2}' -f ($AllFolderItems.sum / 1GB) + ' GB'
            }
            'MB'
            {
               $FolderSize = '{0:N2}' -f ($AllFolderItems.sum / 1MB) + ' MB'
            }
            'KB'
            {
               $FolderSize = '{0:N2}' -f ($AllFolderItems.sum / 1KB) + ' KB'
            }
            'B'
            {
               $FolderSize = '{0:N2}' -f ($AllFolderItems.sum) + ' B'
            }
            Default
            {
               $FolderSize = '{0:N2}' -f ($AllFolderItems.sum) + ' MB'
            }
         }

         return $FolderSize
      }
      catch
      {
         # get error record
         [Management.Automation.ErrorRecord]$e = $_

         # retrieve information about runtime error
         $info = [PSCustomObject]@{
            Exception = $e.Exception.Message
            Reason    = $e.CategoryInfo.Reason
            Target    = $e.CategoryInfo.TargetName
            Script    = $e.InvocationInfo.ScriptName
            Line      = $e.InvocationInfo.ScriptLineNumber
            Column    = $e.InvocationInfo.OffsetInLine
         }

         # output information. Post-process collected info, and log info (optional)
         $info | Out-String | Write-Verbose

         Write-Error -Message $e.Exception.Message -ErrorAction Continue -Exception $e.Exception -TargetObject $e.CategoryInfo.TargetName
      }
   }
}

There is also a dedicated GIST for the function available and it is part of my PowerShell-collection Repository.