我找到了几个使用以下脚本获取文件夹大小的资源
$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实现这一目标? ....
答案 0 :(得分:26)
您需要递归地获取每个目录的总内容大小以输出。此外,您需要指定您要测量的内容不是目录,否则您会冒错误(因为目录没有Length
参数)。
您的脚本已针对您要查找的输出进行了修改:
$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"
}
答案 1 :(得分:10)
这个简单的解决方案也适用于我。
powershell -c "Get-ChildItem -Recurse 'directory_path' | Measure-Object -Property Length -Sum"
答案 2 :(得分:3)
@Linga发布的解决方案:
"Get-ChildItem -Recurse 'directory_path' | Measure-Object -Property Length -Sum"
很简短。但是,它仅计算'directory_path'
的大小,而没有子目录。
这是列出所有子目录大小的简单解决方案。加上一些漂亮的印刷。
(注意:使用-File
选项可避免出现空子目录错误)
foreach ($d in gci -Directory -Force) {
'{0:N0}' -f ((gci $d -File -Recurse -Force | measure length -sum).sum) + "`t`t$d"
}
答案 3 :(得分:2)
很抱歉恢复死线,但我自己一直在处理这个问题,在找到各种疯狂臃肿的解决方案之后,我设法提出了这个问题。
[Long]$actualSize = 0
foreach ($item in (Get-ChildItem $path -recurse | Where {-not $_.PSIsContainer} | ForEach-Object {$_.FullName})) {
$actualSize += (Get-Item $item).length
}
快速地在几行代码中为我提供了以字节为单位的文件夹大小,可以使用/ 1MB
等轻松转换为您想要的任何单位。
我错过了什么吗?与此overwrought mess相比,它看起来相当简单。更不用说代码甚至不起作用,因为被调用的函数与定义的函数不同。而且已经错了6年了。 ;)
那么,有什么理由不使用这种剥离方法吗?
答案 4 :(得分:1)
这类似于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 :(得分:0)
我的主张
$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 :(得分:0)
这是我反复寻找的东西,即使我前一段时间写了一个不错的小函数。因此,我认为其他人可能会从中受益,也许我自己也会在这里找到它。哈哈哈
粘贴到脚本中并使用非常简单。只需将其传递给文件夹对象即可。
我认为仅由于Get-ChildItem命令上的-directory标志,它才需要PowerShell 3,但是我确信它可以很容易地进行修改(如果需要)。
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 :(得分:0)
。 或降低2级: ** du -l 2 c:**
虽然比Linux短得多;)
答案 8 :(得分:0)
在@squicc
的答案中,如果您amend
这一行:$topDir = Get-ChildItem -directory "C:\test" with -force
,那么您还将能够看到隐藏的目录。如果没有此选项,则从文件夹内部或外部运行解决方案时,大小将有所不同。
答案 9 :(得分:0)
我使用了@kohlbrr 的出色答案并对其进行了一些改进。我还把它变成了一个函数,你可以把它放在你的 $PROFILE
中。这将输出三个属性而不仅仅是文本:Name
、Size
(这是大小转换为 MB 的字符串输出)和 Value
,这是您可以使用的原始大小值| sort value
function Get-DirectorySize([string] $rootFolder) {
$colItems = Get-ChildItem $rootFolder | 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
[PSCustomObject]@{ Name=$i.Fullname; Size="{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"; Value=$subFolderItems.sum }
}
}
答案 10 :(得分:-3)
有趣的是多么强大但PS无可奈何同时来自Nix学习PS。安装crgwin / gitbash之后,您可以在一个命令中执行任何组合:
当前文件夹的大小: 杜克斯
当前目录下所有文件和文件夹的大小 du -sk *
所有子文件夹的大小(包括当前文件夹) 找到./-type d -exec du -sk {} \;