Папка 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 {} \;