我正在尝试收集磁盘上的大小/大小以及非常大的文件夹树上的文件/文件夹数。
我一直在使用类似以下的脚本来收集一些内容:
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
但是当我想收集有关磁盘上文件夹数量和大小的信息时,我必须运行一个单独的脚本;再次通过文件夹回传(这需要很长时间)。
当您右键单击文件夹并选择下面显示的属性时,是否有一种简单的方法可以访问所有这些信息?
system32中是否有可以执行此操作的可调用.exe文件?
答案 0 :(得分:2)
根据Technet论坛中的this answer,您可以像这样计算磁盘上的大小:
$afz = [MidpointRounding]::AwayFromZero
[math]::Round($_.Length / $clusterSize + 0.5, $afz) * $clusterSize
可以使用$clusterSize
命令确定 fsutil
(例如,对于驱动器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;
}
答案 1 :(得分: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