文件夹的Powershell文件夹大小没有列出Subdirectories

时间:2014-10-21 19:29:18

标签: powershell

我找到了几个使用以下脚本获取文件夹大小的资源

$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实现这一目标?     ....

11 个答案:

答案 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)

从sysinternals.com使用du.exe或du64.exe -l 1

。 或降低2级: ** du -l 2 c:**

虽然比Linux短得多;)

答案 8 :(得分:0)

@squicc的答案中,如果您amend这一行:$topDir = Get-ChildItem -directory "C:\test" with -force,那么您还将能够看到隐藏的目录。如果没有此选项,则从文件夹内部或外部运行解决方案时,大小将有所不同。

答案 9 :(得分:0)

我使用了@kohlbrr 的出色答案并对其进行了一些改进。我还把它变成了一个函数,你可以把它放在你的 $PROFILE 中。这将输出三个属性而不仅仅是文本:NameSize(这是大小转换为 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 {} \;