Папка Powershell для папок без листинга Подкаталоги

Я нашел несколько ресурсов, которые используют следующий script для получения размеров папок

$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"
    }

Проблема с этим - это также список подкаталогов, то есть:

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

Я думаю, вы знаете, куда я иду. Я ищу только результаты родительских папок... SO:

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

Как это можно сделать с Powershell?   ....

Ответ 1

Вам нужно получить итоговый размер содержимого каждой директории рекурсивно для вывода. Кроме того, вам нужно указать, что содержимое, которое вы пытаетесь измерить, не является каталогом, или вы рискуете ошибками (поскольку в каталогах нет параметра Length).

Здесь ваш script изменен для вывода, который вы ищете:

$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"
}

Ответ 2

Это простое решение работало и для меня.

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

Ответ 3

Извините, что реанимировал мертвую ветку, но я только что имел дело с этим сам, и после нахождения всех видов сумасшедших раздутых решений мне удалось придумать это.

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

Быстро и в несколько строк кода дает мне размер папки в байтах, который можно легко преобразовать в любые единицы измерения с помощью /1MB или тому подобное. Я что-то пропустил? По сравнению с этим перегруженным беспорядком это кажется довольно простым и конкретным. Не говоря уже о том, что код даже не работает, поскольку вызываемая функция не совпадает с именем определенной функции. И был неправ в течение 6 лет. ;) Итак, есть ли причины НЕ использовать этот урезанный подход?

Ответ 4

Это похоже на ответ https://stackoverflow.com/users/3396598/kohlbrr, но я пытался получить общий размер одной папки и обнаружил, что скрипт не считает файлы в корне папки, которую вы в поиске. Это сработало для меня.

$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"

Ответ 5

Мое предложение:

$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)}}

Ответ 6

Это то, что я постоянно искал, хотя некоторое время назад я написал себе симпатичную небольшую функцию. Итак, я подумал, что другие могут выиграть от этого, и, возможно, я сам найду это здесь. хахаха

Это довольно просто вставить в ваш скрипт и использовать. Просто передайте ему объект папки.

Я думаю, что для этого требуется PowerShell 3 только из-за флага -directory в команде Get-ChildItem, но я уверен, что его можно легко адаптировать, если потребуется.

function Get-TreeSize ($folder = $null)
{
    #Function to get recursive folder size
    $result = @()
    $folderResult = "" | Select-Object FolderPath, FolderName, SizeKB, SizeMB, SizeGB, OverThreshold

    $contents  = Get-ChildItem $folder.FullName -recurse -force -erroraction SilentlyContinue -Include * | Where-Object {$_.psiscontainer -eq $false} | Measure-Object -Property length -sum | Select-Object sum
    $sizeKB = [math]::Round($contents.sum / 1000,3)   #.ToString("#.##")
    $sizeMB = [math]::Round($contents.sum / 1000000,3)   #.ToString("#.##")
    $sizeGB = [math]::Round($contents.sum / 1000000000,3)   #.ToString("#.###")

    $folderResult.FolderPath = $folder.FullName
    $folderResult.FolderName = $folder.BaseName
    $folderResult.SizeKB = $sizeKB
    $folderresult.SizeMB = $sizeMB
    $folderresult.SizeGB = $sizeGB
    $result += $folderResult

    return $result
} 


#Use the function like this for a single directory
$topDir = get-item "C:\test"
Get-TreeSize ($topDir)

#Use the function like this for all top level folders within a direcotry
#$topDir = gci -directory "\\server\share\folder"
$topDir = Get-ChildItem -directory "C:\test"
foreach ($folderPath in $topDir) {Get-TreeSize $folderPath}  

Ответ 7

Интересно, насколько мощным все же является то, как беспомощный PS может быть в одно и то же время, исходя из Nix learning PS. после установки crgwin/gitbash вы можете сделать любую комбинацию в одной команде:

размер текущей папки: du -sk.

размер всех файлов и папок в текущем каталоге du -sk *

размер всех подпапок (включая текущие папки) find./-type d -exec du -sk {} \;