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要好。
  • 遍历子项时,已经排除了“连接”文件,但仍然会报错某些文件不能访问的问题。需要优化。

参考

标签: powershell

添加新评论