2

我正在尝试收集磁盘上的大小/大小以及非常大的文件夹树上的文件/文件夹的数量。

我一直在使用如下脚本来收集其中的一些内容:

Get-ChildItem "C:\test" -recurse | Measure-Object -Sum Length | Select-Object `
  @{Name="Path"; Expression={$directory.FullName}},
  @{Name="Files"; Expression={$_.Count}},
  @{Name="Size"; Expression={$_.Sum}}

Path                                            Files                      Size
----                                            -----                      ----
C:\test                                         470                    11622961

但是当我想收集有关文件夹数量和磁盘大小的信息时,我必须运行一个单独的脚本;再次通过文件夹 tee 回避(这需要很长时间)。

是否有一种简单的方法可以访问所有这些信息,就像右键单击文件夹并选择如下所示的属性时一样?

system32 中是否有任何可调用的 .exe 文件可以做到这一点?

文件夹属性

4

2 回答 2

2

根据Technet 论坛中的这个答案,您可以计算磁盘上的大小,如下所示:

$afz = [MidpointRounding]::AwayFromZero
[math]::Round($_.Length / $clusterSize + 0.5, $afz) * $clusterSize

$clusterSize可以通过fsutil命令确定(例如对于 drive C:):

PS C:\> fsutil fsinfo ntfsinfo C:\
NTFS Volume Serial Number :       0x648ac3ae16817308
Version :                         3.1
Number Sectors :                  0x00000000027ccfff
Total Clusters :                  0x00000000004f99ff
Free Clusters  :                  0x0000000000158776
Total Reserved :                  0x00000000000003e0
Bytes Per Sector  :               512
Bytes Per Physical Sector :       512
Bytes Per Cluster :               4096
Bytes Per FileRecord Segment    : 1024
Clusters Per FileRecord Segment : 0
...

请注意,运行fsutil需要管理员权限。

有了它,您可以像这样收集您感兴趣的信息:

$rootDir = "C:\test"

$afz = [MidpointRounding]::AwayFromZero
$clusterSize = fsutil fsinfo ntfsinfo (Get-Item $rootDir).PSDrive.Root `
  | Select-String 'Bytes Per Cluster' `
  | % { $_.ToString().Split(':')[1].Trim() }

$stat = Get-ChildItem $rootDir -Recurse -Force `
  | select Name, Length, @{n="PhysicalSize";e={
      [math]::Round($_.Length / $clusterSize + 0.5, $afz) * $clusterSize
    }}, @{n="Folder";e={[int]($_.PSIsContainer)}},
    @{n="File";e={[int](-not $_.PSIsContainer)}} `
  | Measure-Object -Sum Length, PhysicalSize, Folder, File

$folder = New-Object -TypeName PSObject -Property @{
    "FullName"   = $rootDir;
    "Files"      = ($stat | ? { $_.Property -eq "File" }).Sum;
    "Folders"    = ($stat | ? { $_.Property -eq "Folder" }).Sum;
    "Size"       = ($stat | ? { $_.Property -eq "Length" }).Sum;
    "SizeOnDisk" = ($stat | ? { $_.Property -eq "PhysicalSize" }).Sum - $clusterSize;
  }
于 2013-07-04T12:32:20.807 回答
1

当您看到每个项目时,您将不得不将数据累积在自定义对象中:

$path = "C:\Users\aaron\Projects\Carbon"
$properties = New-Object PsObject -Property @{ 'Path' = $path; 'Files' = 0; 'Folders' = 0; 'Size' = 0 }
Get-ChildItem -Path $path -Recurse |
    ForEach-Object {
        if( $_.PsIsContainer )
        {
            $properties.Folders++
        }
        else
        {
            $properties.Size += $_.Length
            $properties.Files++
        }
    }
$properties
于 2013-07-04T13:14:15.890 回答