Use PowerShell to Count the Size of each Sub Item of the Specified Path
Windows没有类似Linux的du
命令,不能很方便地统计并显示指定路径下各个子项的大小。试过使用CMD的批处理去实现,除了编写代码不方便,实现效也果不好。于是想到使用PowerShell
去实现。
具体代码
保存为文件名fold_sum.ps1
。
param($path)
if ( $path -eq $null ) {
$path = "."
}
"Path : {0}`n---" -f $path
$totalSize = 0
Get-ChildItem -Force $path | Where-Object { $_.Mode.Substring(5,1) -ne "l" } | ForEach-Object {
$folderPath = $_.FullName
if ( $_.PSIsContainer ) {
$folderSize = (Get-ChildItem -Recurse -Force $folderPath | Select-Object -Property Length | Measure-Object -Property Length -Sum).Sum
} else {
$folderSize = (Get-Item -Force $folderPath | Select-Object -Property Length).Length
}
$totalSize = $totalSize + $folderSize
"{0} : {1:N2} MB" -f $_.Name, ($folderSize / 1024 / 1024)
}
# Show total size of current folder
"---`nTotal: {0:N2} MB" -f ($totalSize / 1024 / 1024)
简单说明
- 使用
CMD
环境执行时,格式:powershell fold_sum.ps1 d:\path
。其中d:\path
不填写时默认统计当前路径。 - 使用
PowerShell
环境执行时,格式:fold_sum.ps1 d:\path
。其中d:\path
不填写时默认统计当前路径。 - Windows 7和Windows 11下都能执行。如果遇到输出结果报错,可以把结果重定向输出到文本文件。
PowerShell
命令(或者函数)的结果,是基于key-value的格式,能够兼顾人工查看和程序使用。这点,比Linux的Shell要好。- 遍历子项时,已经排除了“连接”文件,但仍然会报错某些文件不能访问的问题。需要优化。