web-dev-qa-db-fra.com

Taille du dossier Powershell des dossiers sans liste de sous-répertoires

J'ai trouvé plusieurs ressources qui utilisent le script suivant pour obtenir la taille des dossiers

$colItems = (Get-ChildItem $startFolder -recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
foreach ($i in $colItems)
    {
        $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum)
        $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"
    }

Le problème, c’est qu’il répertorie également les sous-répertoires, à savoir:

c:\test\1 -- 10mb
c:\test\1\folder -- 10mb
c:\test\1\folder\deep -- 5mb
c:\test\1\folder\tuna -- 5mb
c:\test\2 -- 20bm
c:\test\2\folder -- 20mb
c:\test\2\folder\deep -- 10mb
c:\test\2\folder\tuna -- 10mb

Je pense que vous savez où je vais. Ce que je recherche, ce ne sont que les résultats du dossier parent ... SO:

c:\test\1 -- 10mb
c:\test\2 -- 20mb

Comment cela peut-il être accompli avec Powershell? ....

19
user3566297

Vous devez obtenir la taille de contenu totale de chaque répertoire de manière récursive pour la sortie. En outre, vous devez spécifier que le contenu que vous voulez analyser ne soit pas un répertoire, sinon vous risquez des erreurs (car les répertoires n'ont pas de paramètre Length).

Voici votre script modifié pour le résultat recherché:

$colItems = Get-ChildItem $startFolder | Where-Object {$_.PSIsContainer -eq $true} | Sort-Object
foreach ($i in $colItems)
{
    $subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
    $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"
}
24
Kohlbrr

Cette solution simple a également fonctionné pour moi.

powershell -c "Get-ChildItem -Recurse 'directory_path' | Measure-Object -Property Length -Sum"
10

Désolé de réanimer un fil mort, mais je viens juste de traiter ce problème moi-même et après avoir trouvé toutes sortes de solutions folles et gonflées, j'ai réussi à le proposer.

[Long]$actualSize = 0
foreach ($item in (Get-ChildItem $path -recurse | Where {-not $_.PSIsContainer} | ForEach-Object {$_.FullName})) {
   $actualSize += (Get-Item $item).length
}

Rapidement et en quelques lignes de code, cela me donne une taille de dossier en octets, qui peut facilement être convertie en unités de votre choix avec / 1MB ou similaire ... Est-ce que quelque chose me manque? Par rapport à ce désordre exagéré , cela semble assez simple et pertinent. Sans oublier que le code ne fonctionne même pas puisque la fonction appelée n’a pas le même nom que la fonction définie. Et a eu tort pendant 6 ans. ;) Alors, quelles sont les raisons de NE PAS utiliser cette approche simplifiée?

2
Gordon

Ceci est similaire à https://stackoverflow.com/users/3396598/kohlbrr answer, mais j'essayais d'obtenir la taille totale d'un seul dossier et j'ai constaté que le script ne compte pas les fichiers dans la racine du dossier que vous recherchez. Cela a fonctionné pour moi.

$startFolder = "C:\Users";
$totalSize = 0;

$colItems = Get-ChildItem $startFolder
foreach ($i in $colItems)
{
    $subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
    $totalSize = $totalSize + $subFolderItems.sum / 1MB

}

$startFolder + " | " + "{0:N2}" -f ($totalSize) + " MB"
0
sonance207

Ma proposition

$dir="C:\temp\"
get-childitem $dir -file -Rec | group Directory | where Name -eq $dir | select Name, @{N='Size';E={(($_.Group.Length | measure -Sum).Sum / 1MB)}}
0
Esperento57