<#
    .SYNOPSIS

        Cette fonction renvoi le nombre de fichier et la taille contenu dans le dossier ainsi que le détail pour les sous-dossiers sur N niveaux.
        Le résultat est un tableau indiquant le nombre et la taille des fichiers directement dans le dossier ainsi que le cumul des sous dossiers.
        Il est possible de définir l'unité pour les tailles (B,Kb,Mb,Gb), le nombre de niveau et de filtrer sur certains types de fichier (*.txt)
        La fonction utilise Get-childitem et Measure-Object. 
        Attention à la version de PowerShell.
       
       This function returns the number of files and the size contained in the folder as well as the detail for the subfolders on N levels.
         The result is a table showing the number and size of files directly in the folder as well as the total of subfolders.
         It is possible to set the unit for sizes (B, Kb, Mb, Gb), the number of level and filter on certain file types (* .txt)
         The function uses Get-childitem and Measure-Object.
         Watch out for the PowerShell version.
 

    .DESCRIPTION
     Cette fonction renvoie un tableau avec :
     - chemin du dossier (Path)
     - nombre de fichiers dans le dossier (InFolderFiles)
     - tailles des fichiers dans le dossier (InFolderSize)
     - nombre de fichier dans le dossier et les sous dossiers (AllFiles)
     - tailles des fichiers du dossier et des sous dossiers (AllSize)

     This function returns an array with:
      - Path of the folder (Path)
      - number of files in the folder (InFolderFiles)
      - file sizes in the folder (InFolderSize)
      - number of files in the folder and subfolders (AllFiles)
      - file sizes of the folder and subfolders (AllSize)
   

    .PARAMETER FolderPath

    Chemin du dossier à analyser
    Folder path to analyze

    .PARAMETER Level
    
    Nombre de niveau de sous dossier.
    Number of subfolder level.
    
    .PARAMETER unit

    Unité pour les tailles de fichiers (B,Kb,Mb,Gb).Par défaut :Gb.
    Unit for file sizes

    .PARAMETER Filter (B,Kb,Mb,Gb), default Gb.
    
    Filtre les fichiers par type. Par exemple *.txt ne compte que les fichiers txt.
    Filters files by type. For example * .txt only counts txt files.

    
    .EXAMPLE
    
    .\Get-FolderSize.ps1 -FolderPath d:\tools -level 2
    .EXAMPLE

    .\Get-FolderSize.ps1 -FolderPath \\Server\Documents -level 2 -filter "*.doc*" -unit "kb"

    .NOTES
        Author:   Philippe BARTH 
        Version:  1.0
    #>

    # Déclaration des paramètres 
    param([string]$FolderPath,[int]$level,[string]$unit="Mb",[string]$Filter="*.*")

if ($level -lt 1) { $level = 1 }

# Determine unit for folder size, default Gb  
Switch ($unit) 
    {
    "Gb" 
        {
        $div="1GB"
        }

    "Mb" 
        {
        $div="1MB"
        }

    "Kb" 
        {
        $div="1KB"
        }
    "b" 
        {
        $div="1"
        }
    Default
        {
        $div="1GB"
        }

    }
      

#init result
$result=@()
# search subfolder
$SubFolders = (Get-ChildItem -path $FolderPath -recurse -Directory -Depth $($level-1)).FullName
#add parent folder in list
$SubFolders+=$FolderPath
# scan all folder
foreach ($subfolder in $SubFolders)
    {
    #Search file in folder and subfolder
     $FolderSize = Get-ChildItem -path $SubFolder -filter $filter -File -recurse | Measure-Object -Sum Length      
   #Search file only in folder 
     $fileInFolder = Get-ChildItem -path $SubFolder -filter $filter  -File | Measure-Object -Sum Length
     
     #result       
     $result+= New-Object -TypeName PSObject -Property @{
                        Path                  = $subfolder
                        AllFiles =   $foldersize.count
                        AllSize                 = $foldersize.sum/$div
                        InFolderFiles =   $fileInFolder.count
                        InFolderSize                 = $fileInFolder.sum/$div
                  } 

    }

return $result | Sort-Object -Property path
