Descobrir tamanho pastas Powershell

Introdução

Nesse artigo veremos de forma breve e simples como verificar tamanho de pastas e arquivos utilizando Powershell.
Isso pode vir a ser útil em scripts de manutenções ou monitoramento ou até para acompanharmos o espaço em disco de nossos servidores.

Utilizando Get-ChildItem

Para coletarmos essa informação é necessário percorrermos todos os arquivos e diretorios dentro de um arquivo especifico, o que torna o script um pouco lento, utilizando o comando get-childitem na pasta da qual queremos saber a informação com a opção -Recurse podemos verificar a propriedade length de todos os arquivos.

Get-ChildItem C:\Users\Matheus -Recurse | %{$_.length}

Porém temos que somar esse valor e também tentar deixar de uma forma mais simples a visualização, podemos começar filtrando o resultado do get-childitem para retornar somente arquivos e não pastas, nesse caso utilizamos o parâmetro -Attributes do próprio get-childitem, que vai ter um resultado mais performático que com o where-object.

Get-ChildItem c:\Users\Matheus -Recurse -Attributes "!Directory" | %{$_.length}

Então teremos todos os objetos que não forem do tipo Directory, isso nos retorna um valor em bytes, estamos quase onde queremos, vamos tentar converter esse valor para GBs

$Size=0
Get-ChildItem c:\Users\Matheus -Recurse -Attributes "!Directory" | %{$Size+=$_.length} 
$Size/1GB

Agora temos o valor em GB porém se verificarmos com o tamanho real da pasta veremos que esta relativamente menor, isso é porque esquecemos dos arquivos ocultos e arquivos do sistema, para incluir esses arquivos adicionamos a flag Hidden junto ao !Directory.

$Size=0
Get-ChildItem c:\Users\Matheus -Recurse -Attributes "Hidden,!Directory" | %{$Size+=$_.length} 
$Size/1GB

Agora sim temos o tamanha real da pasta, caso queria facilitar sua vida pode elaborar uma função para executar isso.

Função pronta ( CTRL+C )

Essa função tem um funcionamento simples porém eficaz que vai lhe retornar o tamanho de todos os arquivos passado para ela em um objeto simples.

Function Get-FolderSize {
**    param(
    [Parameter(Mandatory=$true)][string[]]$Folders
    )
    
    Begin{
        Foreach($Folder in $Folders){
            if(!(Get-item $Folder)){
                Throw "Erro, $FOLDER não existe ou você não possui permissão nessa pasta. Favor especificar o caminho completo da pasta." 
            }
        }
    }
    Process{
        Foreach($Folder in $Folders){
            $Size = 0
            Get-ChildItem $Folder -Recurse -Attributes "Hidden,!Directory" -ErrorAction silentlycontinue | %{$Size+=$_.Length} 
            [pscustomobject]@{Folder=$Folder;Size="{0:N2}" -f($SIZE/1GB)+" GB"}    
        }
    }
    End{
        
    }
}
Get-FolderSize -Folders C:\Users\Matheus,E:\Blog,E:\Filmes**

Referências

Esse artigo foi feito com base no conhecimento adquirido através da prática e necessidade do dia-dia trabalhando com powershell.

Este artigo foi originalmente escrito por:
Matheus Kamphorst | blog: http://howtoserver.com